Das „Snake“-Minispiel von pygame:
„Snake“ ist ein häufiger Besucher beim Programmierlernen, weil:
Einfach, die grundlegendsten Spielelemente sind nur Sie brauchen nur zwei Schlangen und Essen, um fortzufahren. (Zum Masturbieren braucht man drei weitere Elemente. Überlegen Sie, was das ist?) Was die Richtung angeht, brauchen Sie nur vier feste Richtungen: oben, unten, links und rechts. Es enthält grundlegende Datenstrukturen und objektorientierte Ideen. Die Spieleentwicklung selbst verwendet viele objektorientierte Konzepte, und der Körper der Schlange ist eine natürliche „verknüpfte Listen“-Struktur, die sich sehr gut zum Üben von Datenstrukturen eignet. Ein weiterer interessanter Punkt ist, dass das Wort Python auf Englisch Python bedeutet und Snake als „gleichnamiges Spiel“ angesehen werden kann. Viele Schulen haben Programmentwicklungskursaufgaben, die Schlangenthemen beinhalten, und Studenten fragen uns oft nach verwandten Codes. (Nokia-Handys haben auch eine Schwäche für dieses Spiel.) Ich habe zuvor eine Python-Version von „Snake Fight“ erstellt, die auf Basis von cocos2d-python entwickelt wurde. Für Anfänger ist das aber etwas kompliziert.
Hier geben wir eine kurze Einführung:
Dieser Code wurde auf Basis von pygame entwickelt. Stellen Sie daher vor der Ausführung sicher, dass Pygame erfolgreich in Ihrem Python installiert wurde. Führen Sie dann game2.py direkt im Code aus, um das Spiel zu starten. Zusätzlich zum endgültigen Code haben wir dabei auch mehrere PY-Dateien speziell als Referenz für Studenten zerlegt, die ihren eigenen Code entwickeln möchten.
Lassen Sie uns zunächst analysieren, auf welche Punkte beim Schreiben dieses Spiels geachtet werden muss.
1. Wie stellt die Schlange dar?
Wir können den gesamten Spielbereich in kleine Gitter unterteilen, die eine „Schlange“ bilden. Wie im Bild oben verwende ich dunkle Farben, um den Hintergrund darzustellen. , helle Farbe bedeutet „Schlange“.
Wir können Koordinaten verwenden, um jedes kleine Quadrat darzustellen, und der Bereich der X- und Y-Achse kann festgelegt werden. Verwenden Sie eine Liste, um die Koordinaten des „Schlangenkörpers“ zu speichern. Anschließend wird eine „Schlange“ ausgegeben, die nur noch in verschiedenen Farben angezeigt werden muss.
2. Wie bewegt sich die Schlange?
Die erste Reaktion besteht darin, jedes kleine Quadrat wie einen Regenwurm vorwärts zu bewegen, aber die Umsetzung ist sehr mühsam. Ich saß hier von Anfang an fest.
Stellen Sie sich die gierige Schlange vor, die wir gespielt haben. Jedes Mal, wenn sich die „Schlange“ bewegt, fühlt es sich an, als hätte sich der ganze Körper um einen Raum vorwärts bewegt. Eliminieren Sie die „Bewegungen“ der „Schlange“ in Ihrem Kopf und denken Sie sorgfältig über die „Schlange“ nach „Vor und nach dem Umzug.“ Tatsächlich hat sich die Position bis auf den Kopf und den Schwanz überhaupt nicht verändert. Das ist ganz einfach: Fügen Sie die Koordinaten des nächsten Gitters am Anfang der Liste hinzu und entfernen Sie das letzte Element der Liste, was der Schlange entspricht, die sich ein Gitter vorwärts bewegt.
3. Wie kann man feststellen, wann das Spiel vorbei ist?
Wenn sich die „Schlange“ über den Spielbereich hinausbewegt oder sich selbst berührt, geht sie verloren. Der Bereich der Achsenkoordinaten ist vorbestimmt und es ist leicht zu beurteilen, ob er den Bereich überschreitet. Wie beurteilen Sie also, wenn Sie sich selbst begegnen?
Wenn Sie über das Bild einer sich bewegenden „Schlange“ nachdenken, ist das wirklich schwierig, aber im Code ist unsere „Schlange“ eine Liste, dann müssen Sie nur feststellen, ob die Koordinaten des nächsten Gitters bereits enthalten sind die „Schlange“ „Würde es nicht reichen, sie in die Liste aufzunehmen?
Sobald diese Probleme geklärt sind, können wir mit dem Codieren beginnen.
Spielelemente und Schnittstelle definieren:
def main(): pygame.init() screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption('贪吃蛇') light = (100, 100, 100) # 蛇的颜色 dark = (200, 200, 200) # 食物颜色 font1 = pygame.font.SysFont('SimHei', 24) # 得分的字体 font2 = pygame.font.Font(None, 72) # GAME OVER 的字体 red = (200, 30, 30) # GAME OVER 的字体颜色 fwidth, fheight = font2.size('GAME OVER') line_width = 1 # 网格线宽度 black = (0, 0, 0) # 网格线颜色 bgcolor = (40, 40, 60) # 背景色 # 方向,起始向右 pos_x = 1 pos_y = 0 # 如果蛇正在向右移动,那么快速点击向下向左,由于程序刷新没那么快,向下事件会被向左覆盖掉,导致蛇后退,直接GAME OVER # b 变量就是用于防止这种情况的发生 b = True # 范围 scope_x = (0, SCREEN_WIDTH // SIZE - 1) scope_y = (2, SCREEN_HEIGHT // SIZE - 1) # 蛇 snake = deque() # 食物 food_x = 0 food_y = 0
Schlangen und Futter initialisieren:
# 初始化蛇 def _init_snake(): nonlocal snake snake.clear() snake.append((2, scope_y[0])) snake.append((1, scope_y[0])) snake.append((0, scope_y[0])) # 食物 def _create_food(): nonlocal food_x, food_y food_x = random.randint(scope_x[0], scope_x[1]) food_y = random.randint(scope_y[0], scope_y[1]) while (food_x, food_y) in snake: # 为了防止食物出到蛇身上 food_x = random.randint(scope_x[0], scope_x[1]) food_y = random.randint(scope_y[0], scope_y[1]) _init_snake() _create_food()
Vollständiger Code:
""" 贪吃蛇小游戏 """ import random import sys import time import pygame from pygame.locals import * from collections import deque SCREEN_WIDTH = 600 SCREEN_HEIGHT = 480 SIZE = 20 def print_text(screen, font, x, y, text, fcolor=(255, 255, 255)): imgText = font.render(text, True, fcolor) screen.blit(imgText, (x, y)) def main(): pygame.init() screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption('贪吃蛇') light = (100, 100, 100) # 蛇的颜色 dark = (200, 200, 200) # 食物颜色 font1 = pygame.font.SysFont('SimHei', 24) # 得分的字体 font2 = pygame.font.Font(None, 72) # GAME OVER 的字体 red = (200, 30, 30) # GAME OVER 的字体颜色 fwidth, fheight = font2.size('GAME OVER') line_width = 1 # 网格线宽度 black = (0, 0, 0) # 网格线颜色 bgcolor = (40, 40, 60) # 背景色 # 方向,起始向右 pos_x = 1 pos_y = 0 # 如果蛇正在向右移动,那么快速点击向下向左,由于程序刷新没那么快,向下事件会被向左覆盖掉,导致蛇后退,直接GAME OVER # b 变量就是用于防止这种情况的发生 b = True # 范围 scope_x = (0, SCREEN_WIDTH // SIZE - 1) scope_y = (2, SCREEN_HEIGHT // SIZE - 1) # 蛇 snake = deque() # 食物 food_x = 0 food_y = 0 # 初始化蛇 def _init_snake(): nonlocal snake snake.clear() snake.append((2, scope_y[0])) snake.append((1, scope_y[0])) snake.append((0, scope_y[0])) # 食物 def _create_food(): nonlocal food_x, food_y food_x = random.randint(scope_x[0], scope_x[1]) food_y = random.randint(scope_y[0], scope_y[1]) while (food_x, food_y) in snake: # 为了防止食物出到蛇身上 food_x = random.randint(scope_x[0], scope_x[1]) food_y = random.randint(scope_y[0], scope_y[1]) _init_snake() _create_food() game_over = True start = False # 是否开始,当start = True,game_over = True 时,才显示 GAME OVER score = 0 # 得分 orispeed = 0.5 # 原始速度 speed = orispeed last_move_time = None pause = False # 暂停 while True: for event in pygame.event.get(): if event.type == QUIT: sys.exit() elif event.type == KEYDOWN: if event.key == K_RETURN: if game_over: start = True game_over = False b = True _init_snake() _create_food() pos_x = 1 pos_y = 0 # 得分 score = 0 last_move_time = time.time() elif event.key == K_SPACE: if not game_over: pause = not pause elif event.key in (K_w, K_UP): # 这个判断是为了防止蛇向上移时按了向下键,导致直接 GAME OVER if b and not pos_y: pos_x = 0 pos_y = -1 b = False elif event.key in (K_s, K_DOWN): if b and not pos_y: pos_x = 0 pos_y = 1 b = False elif event.key in (K_a, K_LEFT): if b and not pos_x: pos_x = -1 pos_y = 0 b = False elif event.key in (K_d, K_RIGHT): if b and not pos_x: pos_x = 1 pos_y = 0 b = False # 填充背景色 screen.fill(bgcolor) # 画网格线 竖线 for x in range(SIZE, SCREEN_WIDTH, SIZE): pygame.draw.line(screen, black, (x, scope_y[0] * SIZE), (x, SCREEN_HEIGHT), line_width) # 画网格线 横线 for y in range(scope_y[0] * SIZE, SCREEN_HEIGHT, SIZE): pygame.draw.line(screen, black, (0, y), (SCREEN_WIDTH, y), line_width) if game_over: if start: print_text(screen, font2, (SCREEN_WIDTH - fwidth) // 2, (SCREEN_HEIGHT - fheight) // 2, 'GAME OVER', red) else: curTime = time.time() if curTime - last_move_time > speed: if not pause: b = True last_move_time = curTime next_s = (snake[0][0] + pos_x, snake[0][1] + pos_y) if next_s[0] == food_x and next_s[1] == food_y: # 吃到了食物 _create_food() snake.appendleft(next_s) score += 10 speed = orispeed - 0.03 * (score // 100) else: if scope_x[0] <= next_s[0] <= scope_x[1] and scope_y[0] <= next_s[1] <= scope_y[1] \ and next_s not in snake: snake.appendleft(next_s) snake.pop() else: game_over = True # 画食物 if not game_over: # 避免 GAME OVER 的时候把 GAME OVER 的字给遮住了 pygame.draw.rect(screen, light, (food_x * SIZE, food_y * SIZE, SIZE, SIZE), 0) # 画蛇 for s in snake: pygame.draw.rect(screen, dark, (s[0] * SIZE + line_width, s[1] * SIZE + line_width, SIZE - line_width * 2, SIZE - line_width * 2), 0) print_text(screen, font1, 30, 7, f'速度: {score // 100}') print_text(screen, font1, 450, 7, f'得分: {score}') pygame.display.update() if __name__ == '__main__': main()
Das obige ist der detaillierte Inhalt vonWie man mit Python ein einfaches Schlangenspiel implementiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!