文章目录

  • 一、写在前面
  • 二、准备工作
    • 1、用到的软件
    • 2、用到的模块
  • 三、来吧 展示
  • 四、效果
  • 五、打包成exe可执行文件

一、写在前面

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

现在更有各种更加精致好玩的版本
但是今天我们要来用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 = Truestart = False       # 是否开始,当start = True,game_over = True 时,才显示 GAME OVERscore = 0           # 得分orispeed = 0.5      # 原始速度speed = orispeedlast_move_time = Nonepause = 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 = Truegame_over = Falseb = Truesnake = init_snake()food = create_food(snake)food_style = get_food_style()pos = (1, 0)# 得分score = 0last_move_time = time.time()elif event.key == K_SPACE:if not game_over:pause = not pauseelif event.key in (K_w, K_UP):# 这个判断是为了防止蛇向上移时按了向下键,导致直接 GAME OVERif b and not pos[1]:pos = (0, -1)b = Falseelif event.key in (K_s, K_DOWN):if b and not pos[1]:pos = (0, 1)b = Falseelif event.key in (K_a, K_LEFT):if b and not pos[0]:pos = (-1, 0)b = Falseelif 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 = Truelast_move_time = curTimenext_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

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

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

  1. 贪吃蛇——汇编综合性实验(含实验报告+源码)

    贪吃蛇--汇编综合性实验 完整的实验报告和源码见贪吃蛇--汇编综合性实验(含实验报告+源码) 实现效果 实验原理分析 (1)程序总体设计 贪吃蛇游戏我们并不陌生,简单来说就是一条小蛇通过吃在地图上随机 ...

  2. [原创]jQuery推箱子小游戏(100关且可扩展可选关),休闲,对战,娱乐,小游戏,下载即用,兼容iPad移动端,代码注释全(附源码)

    Sokoban 介绍 [原创]jQuery推箱子小游戏(100关且可扩展可选关),休闲,对战,娱乐,小游戏,下载即用,兼容iPad移动端,代码注释全(附源码) 游戏说明 经典的推箱子是一个来自日本的古 ...

  3. 2款不同样式的CSS3 Loading加载动画 附源码

    原文:2款不同样式的CSS3 Loading加载动画 附源码 我们经常看到的Loading加载很多都是转圈圈的那种,今天我们来换一种有创意的CSS3 Loading加载动画,一种是声波形状的动画,另一 ...

  4. Adroid游戏开发实例讲解(五)-哄娃神器之随机五彩泡(附源码)

    Adroid游戏开发实例讲解(五)-哄娃神器之随机五彩泡(附源码) 程序之美 泡泡 一直被孩子认为是神奇的东西.记得儿时,经常 趁大人不注意,偷偷抓一把洗衣粉撞到口袋里,然后自己悄悄的找来一个小瓶子, ...

  5. 【Python】基金/股票 最大回撤率计算与绘图详解(附源码和数据)

    如果你想找的是求最大回撤的算法,请跳转:[Python] 使用动态规划求解最大回撤详解 [Python]基金/股票 最大回撤率计算与绘图详解(附源码和数据) 0. 起因 1. 大成沪深300指数A 5 ...

  6. 一款仿网易云音乐Java开源系统(附源码)

    嗨喽!Java后端编程的各位小伙伴们,由于公众号做了乱序推送改版,为了保证公众号的推文能够第一时间及时送达到大家手上,大家记得将公众号 加星标置顶 ,公众号每天会送上Java技术干货推文 ! 上篇推文 ...

  7. Python嘎嘎涨知识的7个小游戏,玩过的都爱不释手(附源码,直接运行就可)

    前言 今天星期七,是一个快乐的日子.上班族不用上班,学生不用学习.我也不想分享太多的知识去为难大家,就给大家七个小游戏 吧,从周一玩到周日的那种,学会了记得来找我PK- 1.消消乐 玩法:三个相连就能 ...

  8. 【Python工具】Python实现一款支持各大平台的视频下载器 | 附源码

    相关文件 想学Python的小伙伴可以关注小编的公众号[Python日志] 有很多的资源可以白嫖的哈,不定时会更新一下Python的小知识的哈!! 需要源码的小伙伴可以在公众号回复视频下载器 简介 一 ...

  9. Python 自动化收取蚂蚁森林能量,不错过暗恋的她(附源码)

    作者 | 锅g头 来源 | Crossin的编程教室 最近在家远程工作,结果作息更混乱了,早上起不来,导致我蚂蚁森林能量天天被偷,严重影响我沙漠造树"大业".于是我决定用pytho ...

最新文章

  1. Python生物信息学⑤DNA转录RNA
  2. 基于xmpp openfire smack开发之smack类库介绍和使用[2]
  3. PB做的史上最强的矢量图监控软件(什么组态软件与监控软件的核心都源于此原理)...
  4. buu [BJDCTF 2nd]Y1nglish-y1ng
  5. 如何在调用线程的时候传递参数
  6. 机器学习实战(用Scikit-learn和TensorFlow进行机器学习)(五)
  7. java jsf_使用Java和JSF构建一个简单的CRUD应用
  8. python 单位根检验代码_python时间序列分析
  9. java与javac版本不一致问题
  10. TurboDrive技术
  11. delphi html 登录,delphi 几个实用的HTML解析函数
  12. url去重:布隆过滤器-python实现
  13. 决策树模型及案例(Python)
  14. MDK5 代码折叠功能
  15. 玩家密无忧 v7.0.7 绿色
  16. 上传图片到淘宝 API 返回值说明
  17. 深入 JavaScript 中的默认参数!
  18. 基于LMS及FxLMS算法的ANC主动降噪仿真分析
  19. Python: 异常处理
  20. 华为项目管理10大模板Excel版(可直接套用_非常实用)

热门文章

  1. 二、Python判断语句
  2. 基于Python+SQLite实现校园信息化统计平台【100010095】
  3. 微信营销十(微信公众号排版技巧)
  4. Omron HostLink通讯协议
  5. 开源算力引擎 BridgX 发布 0.6.0 版本:新增三种权限管理功能
  6. excel函数技巧:什么是模糊查找,如何操作?
  7. Cadence IUS 之一:简介
  8. 查找本地所有视频,选择视频上传到服务器
  9. Springboot错误--would dispatch back to the current handler URL [/XXX] again. Check your ViewResolv
  10. 面试常见基础知识点及问题