首页 > 分享 > python 250行代码开发一个贪吃蛇

python 250行代码开发一个贪吃蛇

python 250行代码开发一个贪吃蛇 1. 前提工作准备2. 全局变量的定义与包的导入3. 游戏开始界面初始化4. 游戏界面的设置4.1 游戏界面,使用一个Point类进行划分4.2 预处理4.3 窗口实现 5. 得分的记录6. 游戏结束(是否打破记录)7. 项目运行8. 项目获取

python,总所周知是比较简单的,而且代码也不会像java那样多,下面就使用python的第三方库pygame进行开发一个贪吃蛇游戏。

当然了,如果你对Java实现贪吃蛇游戏也可以看 Java实现贪吃蛇游戏 这篇文章。 Java实现大概在450行左右,但是只是一个蛇的移动与吃食物的功能。下面使用python编写的还包括了得分获取是否打破记录以及游戏的难易程度的选择。

1. 前提工作准备

安装好Python,直接在官网下载安装即可。安装pygame第三方库,直接在cmd当中使用 pip install pygame 进行安装。或者在pycharm当中自动导入安装也OK。

2. 全局变量的定义与包的导入

在代码当中会使用到很多这种变量的值,直接在最开始进行定义,后面获取变量即可。这样子会比较方便,并且使得代码也会比较规范。

W = 600 #屏幕宽 H = 400 #高 fps = 12 # 帧率,也可以理解为蛇运动的速度 size = (W, H) ROW = 20 # 行 COL = 30 # 列 snake_color = (200, 200, 200) #蛇的颜色 MSGCOLOR = (3, 54, 73) # 背景色 MSGBGCOLOR = (255, 255, 193) #字体色 blue = (64, 160, 171) # 蓝色 count = 0 #计分 pos = [160, 130] #坐标 pos1 = [190, 200] #坐标1 import pygame, sys import random import time 1234567891011121314151617

3. 游戏开始界面初始化

使用while True循环对界面次序刷新,绘制字体以及添加背景图片进入当中 (图片可直接选择600X 400 的图片即可),并且对按压的键进行监听,123 分别表示选中不同的难度,即蛇移动的速度。
绘制字体的使用使用了字体文件,也可以使用本机的字体:参考这篇文章,文字的绘制

# 初始化 pygame.init() screen = pygame.display.set_mode(size) pygame.display.set_caption("贪吃蛇") out = True while out: FPSClock = pygame.time.Clock() img = pygame.image.load("bg.png") screen.blit(img, (0, 0)) # 添加文字 使用到了字体文件 ,可使用默认 font = pygame.font.Font("STKAITI.TTF", 24) fontRect = font.render("请选择游戏难度 (单击键盘)", True, MSGCOLOR, MSGBGCOLOR) fontRect1 = font.render("1:简单 2:中等 3:复杂 ", True, MSGCOLOR, MSGBGCOLOR) screen.blit(fontRect, pos) screen.blit(fontRect1, pos1) for event in pygame.event.get(): #接收单击事件, if event.type == pygame.QUIT: sys.exit() elif event.type == pygame.KEYDOWN: #键盘单击事件 print(event.key) if event.key == 257: fps = 8 out = False elif event.key == 258: fps = 16 out = False elif event.key == 259: fps = 24 out = False pygame.display.update() FPSClock.tick(fps) 12345678910111213141516171819202122232425262728293031

效果图如下:绘制了文字,并且加入监听事件进入。
在这里插入图片描述

4. 游戏界面的设置

4.1 游戏界面,使用一个Point类进行划分

Point类可以对整个屏幕进行划分为多少个小格子,使用到python当中的类进行定义

class Point: row = 0 col = 0 def __init__(self, row=0, col=0): self.row = row self.col = col def copy(self): return Point(row=self.row, col=self.col) 12345678910'

4.2 预处理

给定初始化蛇头坐标,蛇头的颜色, 蛇的身体,在这里都是Point类的对象。
获取顶点坐标,返回的也是Point对象
随机食物的产生,不能出现在蛇头或者蛇的身体的位置。
食物产生调用这个方法即可
蛇的移动方向给定一个向左

# 坐标定义 蛇头 head = Point(row=int(ROW / 2), col=int(COL / 2)) head_color = (80, 80, 128) # 蛇的身体,使用一个列表进行储存对应的值构成一个数组,新的蛇初始化给3个长度的身体 snakenodes = [ Point(head.row, head.col), Point(head.row, head.col + 1), Point(head.row, head.col + 2) ] # 求出这个顶点的坐标 def rect(Point, color): left = Point.col * (W / COL) top = Point.row * (H / ROW) pygame.draw.rect(screen, color, (left, top, W / COL, H / ROW)) # 随机产生食物 def gen_food(): while True: pos = Point(row=random.randint(0, ROW - 1), col=random.randint(0, COL - 1)) # 判断产生的食物是否与蛇相撞 is_coll = False # 1.与蛇头相撞 if head.row == pos.row and head.col == pos.col: is_coll = True # 2.食物与蛇的身体相撞 for node in snakenodes: if node.row == pos.row and node.col == pos.col: is_coll = True break if not is_coll: break return pos # 食物坐标 food = gen_food() food_color = (255, 255, 0) # 移动方向 dir = 'left' 1234567891011121314151617181920212223242526272829303132333435363738394041424344

4.3 窗口实现

在窗口当中对实体进行绘制,并且加入逻辑,比如说,相撞之后就表示游戏结束,
蛇头经过食物,计分的相加,以及再一次的产生新的食物

# 初始化 pygame.init() screen = pygame.display.set_mode(size) pygame.display.set_caption("贪吃蛇") out = True while out: FPSClock = pygame.time.Clock() img = pygame.image.load("bg.png") screen.blit(img, (0, 0)) # 添加文字 font = pygame.font.Font("STKAITI.TTF", 24) fontRect = font.render("请选择游戏难度 (单击键盘)", True, MSGCOLOR, MSGBGCOLOR) fontRect1 = font.render("1:简单 2:中等 3:复杂 ", True, MSGCOLOR, MSGBGCOLOR) screen.blit(fontRect, pos) screen.blit(fontRect1, pos1) for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() elif event.type == pygame.KEYDOWN: print(event.key) if event.key == 257: fps = 8 out = False elif event.key == 258: fps = 16 out = False elif event.key == 259: fps = 24 out = False pygame.display.update() FPSClock.tick(fps) time.sleep(1) quit = True while quit: screen = pygame.display.set_mode((600, 460)) FPSClock = pygame.time.Clock() for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() elif event.type == pygame.KEYDOWN: # print(event.key) if event.key == 273 or event.key == pygame.K_UP: if dir == 'left' or dir == 'right': dir = 'up' elif event.key == 274 or event.key == pygame.K_DOWN: if dir == 'left' or dir == 'right': dir = 'down' if event.key == 276 or event.key == pygame.K_LEFT: if dir == 'up' or dir == 'down': dir = 'left' if event.key == 275 or event.key == pygame.K_RIGHT: if dir == 'up' or dir == 'down': dir = 'right' # 1. 画一个方块,也就是整个背景方块 # pygame.draw.rect(screen, bg_color, (0, 0, W, H)) # 2. 使用图片填入的方式 img = pygame.image.load("bg.png") screen.blit(img, (0, 0)) # 用一个白框进行分割开 pygame.draw.rect(screen, (255, 255, 255), (0, H, W, 10)) # 下方显示分数的方块 pygame.draw.rect(screen, blue, (0, H + 10, W, 60)) # 显示当前得分 font = pygame.font.Font("STKAITI.TTF", 24) fontRect = font.render(" 当前得分 : " + str(count), True, MSGCOLOR, blue) screen.blit(fontRect, (420, 420)) # 画出蛇头 rect(head, head_color) # 画出食物 rect(food, food_color) # 画出蛇身 for node in snakenodes: rect(node, snake_color) # 吃食物,当蛇头与食物重合的时候吃掉食物,此时蛇的长度加一,在原先的删除蛇尾的时候加上一个判断即可 eat = (head.row == food.row and head.col == food.col) # 食物重新产生,食物重新产生的时候,对计分进行增加 if eat: food = gen_food() if fps == 8: count += 3 elif fps == 16: count += 5 elif fps == 24: count += 10 # 处理蛇身 # 1.把蛇头插入到数组列表当中 snakenodes.insert(0, head.copy()) # 2.删除最后一个蛇尾节点,表示没有吃到食物就删除尾节点 if not eat: snakenodes.pop() # 移动头 if dir == 'left': head.col -= 1 elif dir == 'right': head.col += 1 elif dir == 'up': head.row -= 1 elif dir == 'down': head.row += 1 # 与墙壁相撞 dead = False if head.row < 0 or head.col < 0 or head.row >= ROW or head.col >= COL: dead = True print("撞墙") for snake in snakenodes: if head.col == snake.col and head.row == snake.row: dead = True print("撞到自己") break if dead: print("游戏结束") quit = False pygame.display.update() FPSClock.tick(fps) 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131

运行效果:得分会在吃掉食物之后进行刷新的,并且在前面选择的不同的难度加的分也是不同的。123难度对应的是一个食物分别是 3、5、10 分。

在这里插入图片描述

5. 得分的记录

在前面选择不同的难度之后,每一次吃掉食物之后。分数加的也不同,在这里对最终得分记录下来,并且获取count文件进行比较,判断是否打破记录。打破记录,把新的记录写进文件当中。

# 记录最高分到count文件当中 f = open("count", "r") counts = f.read() if count > int(counts): file = open("count", "w") file.write(str(count)) file.close() f.close() 123456789

6. 游戏结束(是否打破记录)

得分已经获取到了,根据是否打破了记录来绘制不同的效果。同样的使用这个pygame进行初始化构造出一个新的窗口。

# 得分展示 pygame.init() screen = pygame.display.set_mode(size) pygame.display.set_caption("贪吃蛇") while True: FPSClock = pygame.time.Clock() pygame.draw.rect(screen, MSGBGCOLOR, (0, 0, W, H)) # 添加文字 font = pygame.font.Font("STKAITI.TTF", 24) if count <= int(counts): fontRect = font.render(" 你的得分是: " + str(count) + " 继续加油哦!", True, MSGCOLOR, MSGBGCOLOR) elif count > int(counts): fontRect = font.render(" 恭喜你打破了记录!你的得分是 : " + str(count), True, MSGCOLOR, MSGBGCOLOR) screen.blit(fontRect, (140, 140)) for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() pygame.display.update() FPSClock.tick(fps) 12345678910111213141516171819

比如说这里,在得分没有超过count文件当中的得分记录的时候就会打印出继续加油,反之打印的是恭喜你打破记录。count得分进行输出的时候,count是一个int型的变量,要转换成string才能进行绘制,所以在上面使用到了 str() 函数,数据类型转换。

在这里插入图片描述

7. 项目运行

小萌新看过来,在获取到整个项目之后,运行Snake.py文件,之后会让你选择游戏难度,分别对应键盘上的123,可自己选择,难度选择之后,就会出现贪吃蛇的游戏界面了。虽然标题写的是250行开发一个贪吃蛇游戏,但是真的把多余的换行以及注释去掉之后,估计也就200行左右。而且很多代码也是大致相同的。

8. 项目获取

本来还说着用Github拉取项目,但是还是怕有些朋友不会用Git,所以说还是使用百度网盘进行项目获取把。所有代码都在上面有所展示,如果遇到一些bug,可在下方百度网盘进行获取源码
源码获取:链接:https://pan.baidu.com/s/1_66rlKQelO4CuSaH0__2ig
提取码:2nom

相关知识

用TypeScript写贪吃蛇(1):开发环境搭建
【Python教程】教你用Python代码制作一个桌面宠物,专属桌宠,体验感升级1000%(附源码)
结队
【Python程序】用200行Python代码制作有趣的桌面宠物(源码可分享),大打工人解压放松程序,如何用Python制作一个桌面宠物!
请问这个代码应该怎样写?(一个Tommy虚拟宠物猫的游戏,求用Python编写
如何用python写一个桌面宠物
【附源码】教你用Python代码制作一只你的专属宠物,桌面体验感升级100%!!
python宠物狗年龄
数你用Python代码。制作一个专属桌宠,附源代码
基于C#制作一个桌面宠物代码

网址: python 250行代码开发一个贪吃蛇 https://m.mcbbbk.com/newsview657224.html

所属分类:萌宠日常
上一篇: 扫舍选今天吉利吗 2024年8月
下一篇: 贪吃蛇小程序(功能完善)