Περιγραφή Μαθήματος
To PyGame είναι μια βιβλιοθήκη της Python που σου επιτρέπει να φτιάχνεις παιχνίδια και διαδραστικές εφαρμογές. Παρέχει έτοιμα εργαλεία για να ανοίγεις παράθυρο, να ζωγραφίζεις σχήματα και εικόνες, να παίζεις ήχους και να διαβάζεις το πληκτρολόγιο και το ποντίκι. Έτσι δεν χρειάζεται να τα φτιάξεις όλα από το μηδέν και μπορείς να συγκεντρωθείς στην ιδέα του παιχνιδιού σου.
Είναι ιδανικό για αρχάριους, γιατί ο κώδικας είναι απλός και τα αποτελέσματα φαίνονται αμέσως στην οθόνη. Με το PyGame μαθαίνεις βασικές έννοιες του προγραμματισμού, όπως μεταβλητές, συνθήκες και επαναλήψεις, ενώ φτιάχνεις κάτι διασκεδαστικό, από μια μπάλα που αναπηδά μέχρι ένα ολόκληρο παιχνίδι.

#Τι θα μάθουμε: pygame.init, παράθυρο, game loop (βρόχος παιχνιδιού), κλείσιμο
import pygame
from sys import exit # χρειάζεται για να κλείνει σωστά το πρόγραμμα
pygame.init() # ξεκινάει το pygame
screen = pygame.display.set_mode((800, 400)) # παράθυρο 800 πλάτος x 400 ύψος (pixels)
pygame.display.set_caption('Το πρώτο μου παιχνίδι')
clock = pygame.time.Clock() # ρολόι: ελέγχει την ταχύτητα του παιχνιδιού
# Το GAME LOOP: ό,τι είναι εδώ μέσα επαναλαμβάνεται συνέχεια, 60 φορές το δευτερόλεπτο.
# Κάθε επανάληψη λέγεται "καρέ" (frame), σαν τις εικόνες μιας ταινίας.
while True:
# 1. Ρωτάμε: έγινε κάτι; (κλικ, πλήκτρο, κλείσιμο παραθύρου...)
for event in pygame.event.get():
if event.type == pygame.QUIT: # πάτησε το X του παραθύρου
pygame.quit()
exit()
# 2. Ζωγραφίζουμε
screen.fill('skyblue') # βάφουμε όλη την οθόνη γαλάζια
# 3. Εμφάνιση αλλαγών στην οθόνη
pygame.display.update()
clock.tick(60) # όχι πάνω από 60 καρέ το δευτερόλεπτο
------------------------------------------------------------------------------------------
ΑΣΚΗΣΗ1.Άλλαξε το 'skyblue' σε 'pink', 'black', 'orange'...
2. Άλλαξε το μέγεθος του παραθύρου σε (400, 400).
3. Άλλαξε τον τίτλο του παραθύρου.
ΠΑΡΑΡΤΗΜΑscreen.fill('red')green, blue, black, orange, purple- - - - - - - - - - - - - - - - - - - - - - - - - - - - -screen.fill((255, 0, 0)) # Κόκκινοscreen.fill((135, 206, 235)) # Skybluescreen.fill((30, 30, 30)) # Σκούρο γκρι- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
screen.fill('#87CEEB') # Skyblue# Τι θα μάθουμε: συντεταγμένες (x, y), pygame.draw, χρώματα RGB
import pygamefrom sys import exit
pygame.init()screen = pygame.display.set_mode((800, 400))pygame.display.set_caption('Σχήματα')clock = pygame.time.Clock()
# ΣΥΝΤΕΤΑΓΜΕΝΕΣ: το (0, 0) είναι η πάνω-αριστερή γωνία# x μεγαλώνει προς τα δεξιά -># y μεγαλώνει προς τα ΚΑΤΩ## (0,0) ----------------> x# |# |# v y
house_x = 250 # η αριστερή πλευρά του σπιτιού
while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()exit()
screen.fill('skyblue')
# Χρώμα με όνομα, ή με τρεις αριθμούς (κόκκινο, πράσινο, μπλε) από 0 έως 255pygame.draw.circle(screen, 'yellow', (700, 70), 40) # ήλιος: κέντρο (700, 70), ακτίνα 40pygame.draw.rect(screen, (60, 180, 75), (0, 300, 800, 100)) # γρασίδι: (x, y, πλάτος, ύψος)# ΣΠΙΤΙ: όλα μετράνε από το house_xpygame.draw.rect(screen, (200, 80, 60), (house_x, 200, 150, 100)) # σπίτιpygame.draw.polygon(screen, (120, 40, 40),[(house_x - 20, 200), (house_x + 75, 130), (house_x + 170, 200)]) # σκεπήpygame.draw.rect(screen, 'brown', (house_x + 55, 245, 40, 55)) # πόρτα# pygame.draw.line(screen, 'white', (400, 100), (550, 100), 5) # γραμμή πάχους 5# σύννεφο: τρεις άσπροι κύκλοι + ένα ορθογώνιο για την επίπεδη βάσηpygame.draw.circle(screen, 'white', (440, 105), 25)pygame.draw.circle(screen, 'white', (475, 88), 32)pygame.draw.circle(screen, 'white', (515, 105), 25)pygame.draw.rect(screen, 'white', (440, 105, 75, 25))
pygame.display.update()clock.tick(60)----------------------------------------------------------------------------------------------------------ΑΣΚΗΣΗ1. Πρόσθεσε ένα παράθυρο στο σπίτι (ένα μικρό pygame.draw.rect).
2. Βάλε ένα δέντρο: καφέ ορθογώνιο κορμός + πράσινος κύκλος φύλλωμα.



#Τι θα μάθουμε: μεταβλητές που αλλάζουν σε κάθε καρέ, αναπήδηση, if
import pygame
from sys import exit
pygame.init()
screen = pygame.display.set_mode((800, 400))
pygame.display.set_caption('Μπάλα που αναπηδά')
clock = pygame.time.Clock()
# Μεταβλητές
ball_x = 100
ball_y = 100
speed_x = 5 # πόσα pixels μετακινείται οριζόντια σε κάθε καρέ
speed_y = 4 # πόσα pixels μετακινείται κάθετα σε κάθε καρέ
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
# Μετακινούμε τη μπάλα
ball_x = ball_x + speed_x # το ίδιο με: ball_x += speed_x
ball_y = ball_y + speed_y
# Αν χτυπήσει σε τοίχο, αλλάζουμε κατεύθυνση (το + γίνεται - και αντίστροφα)
if ball_x > 780 or ball_x < 20:
speed_x = -speed_x
if ball_y > 380 or ball_y < 20:
speed_y = -speed_y
# Σβήνουμε ΟΛΟ τον πίνακα και ζωγραφίζουμε ξανά, σε κάθε καρέ.
# Έτσι φαίνεται ότι κινείται (σαν φυλλάδιο με σχεδιάκια που γυρνάς γρήγορα).
screen.fill('skyblue')
pygame.draw.circle(screen, 'orange', (ball_x, ball_y), 20)
pygame.display.update()
clock.tick(60)-----------------------------------------------------------------------------------
ΑΣΚΗΣΗ
1. Κάνε τη μπάλα πιο γρήγορη (αύξησε το speed_x και το speed_y).2. Σβήσε τη γραμμή screen.fill(...) και δες τι γίνεται. Γιατί συμβαίνει αυτό;3. Πρόσθεσε δεύτερη μπάλα με δικές της μεταβλητές (ball2_x, ball2_y, ...).
# Τι θα μάθουμε: Rect (ορθογώνιο), βελάκια, όρια οθόνης, colliderect, randint
import pygamefrom sys import exitfrom random import randint # τυχαίοι αριθμοί
pygame.init()screen = pygame.display.set_mode((800, 400))pygame.display.set_caption('Μάζεψε τα αστέρια')clock = pygame.time.Clock()
# Rect = ορθογώνιο με θέση και μέγεθος: (x, y, πλάτος, ύψος)# Το pygame ξέρει να μας λέει πού είναι οι άκρες του: rect.left, rect.right, rect.top, rect.bottomplayer = pygame.Rect(100, 300, 50, 50)star = pygame.Rect(400, 200, 25, 25)points = 0
while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()exit()
# Ποια πλήκτρα είναι πατημένα ΤΩΡΑ;keys = pygame.key.get_pressed()if keys[pygame.K_LEFT]:player.x = player.x - 5if keys[pygame.K_RIGHT]:player.x = player.x + 5if keys[pygame.K_UP]:player.y = player.y - 5if keys[pygame.K_DOWN]:player.y = player.y + 5
# Δεν αφήνουμε τον παίκτη να βγει από την οθόνηif player.left < 0:player.left = 0if player.right > 800:player.right = 800if player.top < 0:player.top = 0if player.bottom > 400:player.bottom = 400
# Άγγιξε ο παίκτης το αστέρι;if player.colliderect(star):points = points + 1print('Πόντοι:', points) # εμφανίζεται στο τερματικόstar.x = randint(0, 775) # νέα τυχαία θέσηstar.y = randint(0, 375)
screen.fill('skyblue')pygame.draw.rect(screen, 'red', player)pygame.draw.rect(screen, 'gold', star)
pygame.display.update()clock.tick(60)-----------------------------------------------------------------------------------------------------------
ΔΟΚΙΜΑΣΕ1. Κάνε τον παίκτη πιο γρήγορο ή πιο αργό2. Πρόσθεσε κίνηση και με τα πλήκτρα W, A, S, D (pygame.K_a, pygame.K_d ...).3. Κάνε το αστέρι μεγαλύτερο και τον παίκτη μικρότερο.
# Προσθήκη χρόνου και γραμματοσειράς στο παιχνίδιimport pygamefrom sys import exitfrom random import randint
pygame.init()screen = pygame.display.set_mode((1200, 700))clock = pygame.time.Clock()font = pygame.font.Font(None, 40)
player = pygame.Rect(100, 500, 30, 30)star = pygame.Rect(600, 300, 15, 15)
points = 0star_time = pygame.time.get_ticks() # πότε εμφανίστηκε το αστέριgame_active = True
while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()exit()
if game_active:# 7 δευτερόλεπτα για κάθε αστέριseconds_left = 7 - (pygame.time.get_ticks() - star_time) // 1000if seconds_left <= 0:game_active = False
keys = pygame.key.get_pressed()if keys[pygame.K_LEFT]:player.x = player.x - 5if keys[pygame.K_RIGHT]:player.x = player.x + 5if keys[pygame.K_UP]:player.y = player.y - 5if keys[pygame.K_DOWN]:player.y = player.y + 5
if player.left < 0:player.left = 0if player.right > 1200:player.right = 1200if player.top < 0:player.top = 0if player.bottom > 700:player.bottom = 700
if player.colliderect(star):points = points + 1star.x = randint(0, 1185)star.y = randint(0, 685)star_time = pygame.time.get_ticks() # ο χρόνος ξαναρχίζει
screen.fill('skyblue')pygame.draw.rect(screen, 'red', player)pygame.draw.rect(screen, 'gold', star)screen.blit(font.render('Χρόνος: ' + str(seconds_left), True, 'black'), (20, 20))screen.blit(font.render('Πόντοι: ' + str(points), True, 'black'), (1050, 20))else:screen.fill('navy')screen.blit(font.render('Έχασες! Πόντοι: ' + str(points), True, 'white'), (450, 330))pygame.display.update()clock.tick(60)----------------------------------------------------------------------------------------------
ΔΟΚΙΜΑΣΕ:Δώσε μπόνους. Αν πιάσεις το αστέρι όταν μένουν ακόμα 5 ή περισσότερα δευτερόλεπτα, πάρε 2 πόντους αντί για 1.
# Λίστες - Νέοι εχθροί στο παιχνίδιimport pygamefrom sys import exitfrom random import randint
pygame.init()screen = pygame.display.set_mode((1200, 700))clock = pygame.time.Clock()font = pygame.font.Font(None, 40)
player = pygame.Rect(100, 500, 30, 30)star = pygame.Rect(600, 300, 15, 15)# 20 μαύρες κουκίδες σε τυχαία σημεία και έλεγχος ώστε να μην πέφτει πάνω στον παίκτη και το stardots = []for i in range(20):dot = pygame.Rect(randint(0, 1185), randint(0, 685), 15, 15)while dot.colliderect(player) or dot.colliderect(star):dot.topleft = (randint(0, 1185), randint(0, 685))dots.append(dot)
points = 0star_time = pygame.time.get_ticks() # πότε εμφανίστηκε το αστέριgame_active = True
while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()exit()
if game_active:# 7 δευτερόλεπτα για κάθε αστέριseconds_left = 7 - (pygame.time.get_ticks() - star_time) // 1000if seconds_left <= 0:game_active = False
keys = pygame.key.get_pressed()if keys[pygame.K_LEFT]:player.x = player.x - 5if keys[pygame.K_RIGHT]:player.x = player.x + 5if keys[pygame.K_UP]:player.y = player.y - 5if keys[pygame.K_DOWN]:player.y = player.y + 5
if player.left < 0:player.left = 0if player.right > 1200:player.right = 1200if player.top < 0:player.top = 0if player.bottom > 700:player.bottom = 700
if player.colliderect(star):points = points + 1star.x = randint(0, 1185)star.y = randint(0, 685)star_time = pygame.time.get_ticks() # ο χρόνος ξαναρχίζει
# Οι κουκίδες αλλάζουν θέση, αλλά δεν σχεδιάζονται πάνω στον παίκτη ή στο αστέριfor dot in dots:dot.topleft = (randint(0, 1185), randint(0, 685))while dot.colliderect(player) or dot.colliderect(star):dot.topleft = (randint(0, 1185), randint(0, 685))
# Αν ακουμπήσεις μια κουκίδα, χάνειςfor dot in dots:if player.colliderect(dot):game_active = False
screen.fill('skyblue')for dot in dots:pygame.draw.circle(screen, 'black', dot.center, 8)pygame.draw.rect(screen, 'red', player)pygame.draw.rect(screen, 'gold', star)screen.blit(font.render('Χρόνος: ' + str(seconds_left), True, 'black'), (20, 20))screen.blit(font.render('Πόντοι: ' + str(points), True, 'black'), (1050, 20))else:screen.fill('navy')screen.blit(font.render('Έχασες! Πόντοι: ' + str(points), True, 'white'), (450, 330))pygame.display.update()clock.tick(60)