Python自制游戏:还原经典款贪吃蛇,表弟玩着玩着都哭了(附源码)

x33g5p2x  于2021-11-21 转载在 Python  
字(4.0k)|赞(0)|评价(0)|浏览(264)

一、写在前面

贪吃蛇这个游戏,在游戏机横行的年代,基本上闲下来就会玩玩贪吃蛇、俄罗斯方块这些。

现在更有各种更加精致好玩的版本

但是今天我们要来用python还原一下复古版贪吃蛇,怀念经典~

二、准备工作

1、用到的软件

  • Python
  • pycharm

2、用到的模块

  • random
  • sys
  • time
  • pygame

模块安装的话豆瓣镜像源有点失灵,我这里用清华的。

pip install pygame -i https://pypi.tuna.tsinghua.edu.cn/simple/

还没安装Python、不会安装模块的都看这篇:Python下载/安装/环境配置/模块安装/解决pip下载模块慢

pycharm安装及永久使用:pycharm安装/基本操作/快捷键/永久使用

三、来吧 展示

1)导入模块

1、把我们要用到的模块导入进去

import random
import sys
import time
import pygame
from pygame.locals import *
from collections import deque

2、基础设置

SCREEN_WIDTH = 600      # 屏幕宽度
SCREEN_HEIGHT = 480     # 屏幕高度
SIZE = 20               # 小方格大小
LINE_WIDTH = 1          # 网格线宽度

这些都不是固定的,看你自己想怎么改就看着改。

3、设置游戏区域的坐标范围

SCOPE_X = (0, SCREEN_WIDTH // SIZE - 1)
SCOPE_Y = (2, SCREEN_HEIGHT // SIZE - 1)

4、食物的分值及颜色

FOOD_STYLE_LIST = [(10, (255, 100, 100)), (20, (100, 255, 100)), (30, (100, 100, 255))]

LIGHT = (100, 100, 100)
DARK = (200, 200, 200)      # 蛇的颜色
BLACK = (0, 0, 0)           # 网格线颜色
RED = (200, 30, 30)         # 红色,GAME OVER 的字体颜色
BGCOLOR = (40, 40, 60)      # 背景色

5、文本输出格式设置

def print_text(screen, font, x, y, text, fcolor=(255, 255, 255)):
    #font.render参数意义:.render(内容,是否抗锯齿,字体颜色,字体背景颜色)
    imgText = font.render(text, True, fcolor)
    screen.blit(imgText, (x, y))

6、初始化蛇

def init_snake():
    snake = deque()
    snake.append((2, SCOPE_Y[0]))
    snake.append((1, SCOPE_Y[0]))
    snake.append((0, SCOPE_Y[0]))
    return snake

7、食物设置

def create_food(snake):
    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])
    return food_x, food_y

8、食物风格

def get_food_style():
    return FOOD_STYLE_LIST[random.randint(0, 2)]#返回随机的分值和颜色

def main():
    pygame.init()
    screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
    pygame.display.set_caption('贪吃蛇')

    font1 = pygame.font.SysFont('SimHei', 24)  # 得分的字体
    font2 = pygame.font.Font(None, 72)  # GAME OVER 的字体
    fwidth, fheight = font2.size('GAME OVER')

    # 如果蛇正在向右移动,那么快速点击向下向左,由于程序刷新没那么快,向下事件会被向左覆盖掉,导致蛇后退,直接GAME OVER
    # b 变量就是用于防止这种情况的发生
    b = True

    # 蛇
    snake = init_snake()
    # 食物
    food = create_food(snake)
    food_style = get_food_style()
    # 方向
    pos = (1, 0)

    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
                        snake = init_snake()
                        food = create_food(snake)
                        food_style = get_food_style()
                        pos = (1, 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[1]:
                        pos = (0, -1)
                        b = False
                elif event.key in (K_s, K_DOWN):
                    if b and not pos[1]:
                        pos = (0, 1)
                        b = False
                elif event.key in (K_a, K_LEFT):
                    if b and not pos[0]:
                        pos = (-1, 0)
                        b = False
                elif event.key in (K_d, K_RIGHT):
                    if b and not pos[0]:
                        pos = (1, 0)
                        b = False

9、填充背景色

screen.fill(BGCOLOR)

10、画网格线、竖线

for x in range(SIZE, SCREEN_WIDTH, SIZE):
    pygame.draw.line(screen, BLACK, (x, SCOPE_Y[0] * SIZE), (x, SCREEN_HEIGHT), LINE_WIDTH)

11、画网格线、横线

or y in range(SCOPE_Y[0] * SIZE, SCREEN_HEIGHT, SIZE):
   pygame.draw.line(screen, BLACK, (0, y), (SCREEN_WIDTH, y), LINE_WIDTH)

12、蛇的爬行过程

if not game_over:
    curTime = time.time()
    if curTime - last_move_time > speed:
        if not pause:
            b = True
            last_move_time = curTime
            next_s = (snake[0][0] + pos[0], snake[0][1] + pos[1])
            if next_s == food:
                # 吃到了食物
                snake.appendleft(next_s)
                score += food_style[0]
                speed = orispeed - 0.03 * (score // 100)
                food = create_food(snake)
                food_style = get_food_style()
            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

13、画食物

if not game_over:
    # 避免 GAME OVER 的时候把 GAME OVER 的字给遮住了
    pygame.draw.rect(screen, food_style[1], (food[0] * SIZE, food[1] * SIZE, SIZE, SIZE), 0)

14、画蛇

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}')

if game_over:
    if start:
        print_text(screen, font2, (SCREEN_WIDTH - fwidth) // 2, (SCREEN_HEIGHT - fheight) // 2, 'GAME OVER', RED)

    pygame.display.update()
    #完整代码私信我

四、效果

五、打包成exe可执行文件

如果写好之后想分享给别人玩的话,咱们就把它打包成exe可执行文件,直接发送给对方打开就能玩。

打包exe教程看这篇:Python打包exe

兄弟们,赶紧试试,有什么不同的想法都可以在评论区交流。

相关文章