Maison > Article > développement back-end > Comment utiliser Python pour implémenter un simple jeu de serpent
Le mini-jeu "Snake" écrit par pygame :
Le mini-jeu "Snake" est un visiteur fréquent dans l'apprentissage de la programmation car :
Simple, les éléments de jeu les plus basiques ne sont que Vous seul il faut deux serpents et de la nourriture pour continuer. (Vous avez besoin de trois éléments supplémentaires pour vous masturber. Pensez à ce qu'ils sont ?) Quant à la direction, vous n'avez besoin que de quatre directions fixes : haut, bas, gauche et droite. Il contient des structures de données de base et des idées orientées objet. Le développement du jeu lui-même utilise de nombreux concepts orientés objet, et le corps du serpent est une structure naturelle de « liste chaînée », ce qui est très approprié pour pratiquer les structures de données. Un autre point intéressant est que le mot Python signifie python en anglais, et Snake peut être considéré comme le « jeu du même nom ». De nombreux cours de développement de programmes scolaires comportent des sujets sur la consommation de serpents comme devoirs, et les étudiants nous posent souvent des questions sur les codes associés. (Les téléphones mobiles Nokia ont également un faible pour ce jeu.) J'ai déjà réalisé une version Python de "Snake War", développée sur la base de cocos2d-python. Mais c'est un peu compliqué pour les débutants.
Nous donnons ici une brève introduction :
Ce code est développé sur la base de pygame, veuillez donc vous assurer que pygame a été installé avec succès dans votre Python avant de l'exécuter. Exécutez ensuite game2.py directement dans le code pour démarrer le jeu. En plus du code final, nous avons également spécialement décomposé plusieurs fichiers py au cours du processus pour référence par les étudiants qui souhaitent développer les leurs.
Analysons d’abord à quels points il faut prêter attention lors de l’écriture de ce jeu.
1. Comment représente le serpent ?
Nous pouvons diviser toute la zone de jeu en petites grilles. Un groupe de petites grilles connectées forme un "serpent". Nous pouvons utiliser différentes couleurs pour le représenter. Comme dans l'image ci-dessus, j'utilise des couleurs sombres pour représenter l'arrière-plan. , la couleur claire signifie « serpent ».
Nous pouvons utiliser des coordonnées pour représenter chaque petit carré, et la plage des axes X et Y peut être définie. Utilisez une liste pour stocker les coordonnées du "corps du serpent", puis un "serpent" sortira. Enfin, il suffit de l'afficher dans différentes couleurs.
2. Comment le serpent bouge-t-il ?
La première réaction est d'avancer chaque petit carré comme un ver de terre, mais c'est très difficile à mettre en œuvre. J'étais coincé ici depuis le début.
Imaginez le serpent gourmand que nous avons joué. Chaque fois que le « serpent » bouge, vous avez l'impression que tout le corps a avancé d'un espace. Éliminez les « mouvements » du « serpent » dans votre esprit et réfléchissez bien au « serpent ». " avant et après le déménagement. " La position a changé. En fait, à l'exception de la tête et de la queue, les autres parties n'ont pas changé du tout. C'est simple, ajoutez les coordonnées de la grille suivante au début de la liste et supprimez le dernier élément de la liste, ce qui équivaut au serpent avançant d'une grille.
3. Comment déterminer quand le jeu est terminé ?
Si le « serpent » dépasse la portée de la zone de jeu ou se touche, il sera perdu. La plage des coordonnées de l'axe est prédéterminée, et il est facile de juger s'il dépasse la plage. Alors, comment jugez-vous lorsque vous vous rencontrez ?
Si vous pensez à l'image d'un "serpent" bougeant dans votre esprit, c'est vraiment difficile, mais dans le code, notre "serpent" est une liste, il vous suffit alors de déterminer si les coordonnées de la grille suivante sont déjà inclus dans le "serpent" "Ne suffirait-il pas de le mettre dans la liste ?
Une fois ces problèmes résolus, nous pouvons commencer à coder.
Définir les éléments et l'interface du jeu :
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
Initialiser les serpents et la nourriture :
# 初始化蛇 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()
Code complet :
""" 贪吃蛇小游戏 """ 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()
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!