The "Snake" mini-game written by pygame:
The "Snake-eating Snake" mini-game is used in programming learning frequent visitor, because:
Simple, the most basic game elements only require two snakes and food. (You need three more elements to masturbate. Think about what they are?) As for the direction, you only need four fixed directions: up, down, left, and right. There are basic data structures and object-oriented ideas in it. Game development itself uses many object-oriented concepts, and the snake's body is a natural "linked list" structure, which is very suitable for practicing data structures. Another interesting point is that the word Python means python in English, and Snake can be regarded as the "game of the same name". Many schools have program development course assignments that include snake topics, and students often ask us about related codes. (Nokia mobile phones also have a soft spot for this game.) I have previously made a Python version of "Snake Fight", developed based on cocos2d-python. But that’s a bit complicated for beginners.
Here we give a brief introduction:
This code is developed based on pygame, so please make sure that pygame has been successfully installed in your Python before running. Then run game2.py directly in the code to start the game. In addition to the final code, we also specially decomposed several py files in the process for reference by students who want to develop their own.
Let’s first analyze what points need to be paid attention to when writing this game.
1. How does the snake represent?
We can divide the entire game area into small grids, and a group of small grids connected together form a "snake". We can use different colors to represent it, as in the picture above, I used dark colors for the background and light colors for the "snake".
We can use coordinates to represent each small square, and the range of the X-axis and Y-axis can be set. Use a list to store the coordinates of the "snake body", then a "snake" will come out. Finally, it only needs to be displayed in different colors.
2. How does the snake move?
The first reaction is to move each small square forward like an earthworm, but this is very troublesome to implement. I was stuck here from the beginning.
Imagine the greedy snake we have played. Every time the "snake" moves, it feels like the whole body has moved forward. Eliminate the "movement" of the "snake" in your mind, and think carefully about the before and after movement. The position of the "snake" has changed. In fact, except for the head and tail, other parts have not changed at all. That's simple, add the coordinates of the next grid to the beginning of the list and remove the last element of the list, which is equivalent to the snake moving forward one grid.
3. How to determine the end of the game?
If the "Snake" moves beyond the scope of the game area or touches itself, it will be lost. The range of the axis coordinates is predetermined, and it is easy to judge if it exceeds the range. So how do you judge when you encounter yourself?
If you are thinking about the picture of a "snake" moving in your mind, it is really difficult, but in the code, our "snake" is a list, then we only need to determine whether the coordinates of the next grid are already included in Wouldn't "snake" be on the list?
After clarifying these issues, we can start coding.
Define game elements and interface:
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
Initialize snake and food:
# 初始化蛇 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()
All codes:
""" 贪吃蛇小游戏 """ 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()
The above is the detailed content of How to use python to implement a simple snake game. For more information, please follow other related articles on the PHP Chinese website!