קירות
שיעור 26 מתוך 41 בקורס צרו משחקים עם Pygame של Coddy.
המשחק מסתיים כשהראש עומד לצאת מהלוח. תא נמצא על הלוח כאשר העמודה שלו היא מ־0 עד COLS - 1 והשורה שלו היא מ־0 עד ROWS - 1.
if alive:
x = body[0][0] + direction[0]
y = body[0][1] + direction[1]
if x < 0 or x >= COLS or y < 0 or y >= ROWS:
alive = False
else:
# הוסיפו, אכלו או הסירו, כמו קודםשימו לב ל־x >= COLS, ולא ל־x > COLS: העמודות ממוספרות החל מ־0, ולכן העמודה COLS כבר נמצאת מעבר לקצה.
בדקו לפני שאתם זזים. הראש לעולם לא יוצא מהלוח, וברגע ש־alive הוא false הנחש נשאר במקום שבו היה. הציגו את Game over במרכז ב־(240, 180) כל עוד הוא false.
אתגר
בינוניסיים את המשחק כשהנחש פוגע בקיר.
- הגדר
alive = Trueלפני הלולאה, והכנס את התנועה תחתif alive:. - אם התא החדש
(x, y)נמצא מחוץ לרשת, הגדרalive = False; אחרת הכנס, אכול או הסר כפי שעשית קודם. - כאשר
aliveהוא false, הצג אתGame overבמרכז(240, 180).
לחץ על "שחק" ופגע בקיר: ההודעה Game over תופיע והנחש ייעצר. לאחר מכן לחץ על "בדיקה".
נסו בעצמכם
import random
import pygame
CELL = 20
COLS, ROWS = 24, 18
TURNS = {
pygame.K_LEFT: (-1, 0),
pygame.K_RIGHT: (1, 0),
pygame.K_UP: (0, -1),
pygame.K_DOWN: (0, 1),
}
pygame.init()
screen = pygame.display.set_mode((COLS * CELL, ROWS * CELL))
pygame.display.set_caption("Snake")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)
def draw_cell(cell, color):
col, row = cell
pygame.draw.rect(screen, color, (col * CELL + 1, row * CELL + 1, CELL - 2, CELL - 2))
def new_food(body):
while True:
cell = (random.randrange(COLS), random.randrange(ROWS))
if cell not in body:
return cell
body = [(5, 9), (4, 9), (3, 9)]
direction = (1, 0)
food = new_food(body)
score = 0
running = True
while running:
moving = direction
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN and event.key in TURNS:
turn = TURNS[event.key]
if turn != (-moving[0], -moving[1]):
direction = turn
x = body[0][0] + direction[0]
y = body[0][1] + direction[1]
body.insert(0, (x, y))
if (x, y) == food:
score += 1
food = new_food(body)
else:
body.pop()
screen.fill((30, 30, 46))
draw_cell(food, (235, 80, 80))
for cell in body[1:]:
draw_cell(cell, (120, 220, 120))
draw_cell(body[0], (180, 255, 160))
score_text = font.render(f"Score: {score}", True, (240, 240, 240))
screen.blit(score_text, (8, 6))
pygame.display.flip()
clock.tick(10)
pygame.quit()
כל השיעורים ביחידה צרו משחקים עם Pygame
תרגלו בעצמכם: Pygame אונליין