Python自制游戏:还原经典款贪吃蛇,表弟玩着玩着都哭了(附源码)
文章目录
- 一、写在前面
- 二、准备工作
- 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)程序总体设计 贪吃蛇游戏我们并不陌生,简单来说就是一条小蛇通过吃在地图上随机 ...
- [原创]jQuery推箱子小游戏(100关且可扩展可选关),休闲,对战,娱乐,小游戏,下载即用,兼容iPad移动端,代码注释全(附源码)
Sokoban 介绍 [原创]jQuery推箱子小游戏(100关且可扩展可选关),休闲,对战,娱乐,小游戏,下载即用,兼容iPad移动端,代码注释全(附源码) 游戏说明 经典的推箱子是一个来自日本的古 ...
- 2款不同样式的CSS3 Loading加载动画 附源码
原文:2款不同样式的CSS3 Loading加载动画 附源码 我们经常看到的Loading加载很多都是转圈圈的那种,今天我们来换一种有创意的CSS3 Loading加载动画,一种是声波形状的动画,另一 ...
- Adroid游戏开发实例讲解(五)-哄娃神器之随机五彩泡(附源码)
Adroid游戏开发实例讲解(五)-哄娃神器之随机五彩泡(附源码) 程序之美 泡泡 一直被孩子认为是神奇的东西.记得儿时,经常 趁大人不注意,偷偷抓一把洗衣粉撞到口袋里,然后自己悄悄的找来一个小瓶子, ...
- 【Python】基金/股票 最大回撤率计算与绘图详解(附源码和数据)
如果你想找的是求最大回撤的算法,请跳转:[Python] 使用动态规划求解最大回撤详解 [Python]基金/股票 最大回撤率计算与绘图详解(附源码和数据) 0. 起因 1. 大成沪深300指数A 5 ...
- 一款仿网易云音乐Java开源系统(附源码)
嗨喽!Java后端编程的各位小伙伴们,由于公众号做了乱序推送改版,为了保证公众号的推文能够第一时间及时送达到大家手上,大家记得将公众号 加星标置顶 ,公众号每天会送上Java技术干货推文 ! 上篇推文 ...
- Python嘎嘎涨知识的7个小游戏,玩过的都爱不释手(附源码,直接运行就可)
前言 今天星期七,是一个快乐的日子.上班族不用上班,学生不用学习.我也不想分享太多的知识去为难大家,就给大家七个小游戏 吧,从周一玩到周日的那种,学会了记得来找我PK- 1.消消乐 玩法:三个相连就能 ...
- 【Python工具】Python实现一款支持各大平台的视频下载器 | 附源码
相关文件 想学Python的小伙伴可以关注小编的公众号[Python日志] 有很多的资源可以白嫖的哈,不定时会更新一下Python的小知识的哈!! 需要源码的小伙伴可以在公众号回复视频下载器 简介 一 ...
- Python 自动化收取蚂蚁森林能量,不错过暗恋的她(附源码)
作者 | 锅g头 来源 | Crossin的编程教室 最近在家远程工作,结果作息更混乱了,早上起不来,导致我蚂蚁森林能量天天被偷,严重影响我沙漠造树"大业".于是我决定用pytho ...
最新文章
- Python生物信息学⑤DNA转录RNA
- 基于xmpp openfire smack开发之smack类库介绍和使用[2]
- PB做的史上最强的矢量图监控软件(什么组态软件与监控软件的核心都源于此原理)...
- buu [BJDCTF 2nd]Y1nglish-y1ng
- 如何在调用线程的时候传递参数
- 机器学习实战(用Scikit-learn和TensorFlow进行机器学习)(五)
- java jsf_使用Java和JSF构建一个简单的CRUD应用
- python 单位根检验代码_python时间序列分析
- java与javac版本不一致问题
- TurboDrive技术
- delphi html 登录,delphi 几个实用的HTML解析函数
- url去重:布隆过滤器-python实现
- 决策树模型及案例(Python)
- MDK5 代码折叠功能
- 玩家密无忧 v7.0.7 绿色
- 上传图片到淘宝 API 返回值说明
- 深入 JavaScript 中的默认参数!
- 基于LMS及FxLMS算法的ANC主动降噪仿真分析
- Python: 异常处理
- 华为项目管理10大模板Excel版(可直接套用_非常实用)
热门文章
- 二、Python判断语句
- 基于Python+SQLite实现校园信息化统计平台【100010095】
- 微信营销十(微信公众号排版技巧)
- Omron HostLink通讯协议
- 开源算力引擎 BridgX 发布 0.6.0 版本:新增三种权限管理功能
- excel函数技巧:什么是模糊查找,如何操作?
- Cadence IUS 之一:简介
- 查找本地所有视频,选择视频上传到服务器
- Springboot错误--would dispatch back to the current handler URL [/XXX] again. Check your ViewResolv
- 面试常见基础知识点及问题