本文主要介绍python用代码实现一个简单的吃蛇游戏。文章围绕主题,详细介绍了内容,有一定的参考价值,有需要的朋友可以参考一下。
前言:
不知道有多少同学和我一样,最初的动力是给自己做一个游戏。
今天要给大家分享的是一个 pygame 写的“贪吃蛇”小游戏:
“贪吃蛇”这个小游戏在编程学习中的常客,因为:
简单,最基本的游戏元素只需要两条蛇和食物。(打飞机还需要三个要素。有什么区别?)方向只要上、下、左、右四个固定方向。有基本的数据结构和面向对象的思想在其中。游戏本身会用到很多面向对象的概念,蛇的身体是天然的“链表”结构,太适合练数据结构了。还有一个很有意思的地方是,python这个词在英文里是Python的意思,贪吃蛇也算是一款同名游戏。很多学校的程序开发课程的作业都会有蛇的题目,学生也会经常问我们的相关代码。(诺基亚手机也对这款游戏情有独钟。)我之前做了一个Python版本的《贪吃蛇大作战》,是基于cocos2d-python开发的。但是对于初学者来说,这有点复杂。
下面简单介绍一下:
这个代码是基于pygame开发的,所以运行之前请确保pygame已经成功安装在你的Python中。然后直接在代码中运行game2.py开始游戏。除了最后的代码,我们还特意在过程中分解了几个py文件,供想自己开发的同学参考。
我们先来分析一下写这个游戏需要注意哪些点。
1、蛇怎么表示?
我们可以把整个游戏区域分成小方块,一组小方块连在一起就形成了一条“蛇”。我们可以用不同的颜色来表示它。如上图所示,我用深色代表背景,浅色代表“蛇”。
我们可以用坐标来表示每个小方块,X轴和Y轴的范围可以设置。用一个列表来存储“蛇身”的坐标,那么一条“蛇”就出来了。最后,用不同的颜色表现出来就好了。
2、蛇怎么移动?
第一反应是,像蚯蚓爬行一样,每个小方块向前移动一格,但要实现这一点很麻烦。我一开始就被困在这里了。
想象一下我们玩过的贪吃蛇。蛇每移动一次,感觉就好像前进了一格。在脑海中消除蛇的动作,考虑移动前后蛇的位置变化。其实除了头和尾,其他部位一点都没变。那很简单。将下一个网格的坐标添加到列表的开头,并删除列表的最后一个元素,这相当于蛇向前移动了一个网格。
3、如何判定游戏结束?
如果蛇移动超出了游戏区域的范围或者遇到了自己,即使输了,轴坐标的范围也是事先设定好的,很容易判断是否超出范围。那么遇到自己怎么判断呢?
如果你在脑子里想到一个蛇在动的画面,那真的很难,但是当你放到代码里的时候,我们的蛇是一个列表,那么只要判断下一个网格的坐标是否已经包含在蛇的列表里就可以了。
整理完这些问题,就可以开始编码了。
定义游戏元素及界面:
def main():
pygame.init()
SCREEN=py game . display . set _ mode((SCREEN _ WIDTH,SCREEN_HEIGHT))
py game . display . set _ caption(' Snake ')
Light=(100,100,100) #蛇的颜色
深色=(200,200,200) #食物颜色
1=pygame.font.sysfont ('simhei ',24) #分数的字体
Font=pygame.font.font (none,72) # Gameover font
红色的字体颜色=(200,30,30) #游戏结束
fwidth,FH height=font 2 . size('游戏结束')
Line_width=1 #网格线宽度
Black=(0,0,0) #网格线颜色
Bgcolor=(40,40,60) #背景色
#方向,从右边开始
pos_x=1
pos_y=0
#如果蛇向右移动,请快速向左下方点击。由于程序刷新没有那么快,所以down事件会被覆盖到左边,导致蛇撤退,直接游戏结束。
# b变量就是用于防止这种情况的发生
b=真
# 范围
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():
非本地蛇
snake.clear()
snake.append((2,scope_y[0]))
snake.append((1,scope_y[0]))
snake.append((0,scope_y[0]))
# 食物
def _create_food():
非本地食物x,食物y
food _ x=random。randint(scope _ x[0],scope_x[1])
food _ y=随机。randint(scope _ y[0],scope_y[1])
蛇中的while (food_x,food_y):
# 为了防止食物出到蛇身上
food _ x=random。randint(scope _ x[0],scope_x[1])
food _ y=随机。randint(scope _ y[0],scope_y[1])
_init_snake()
_create_food()
全部代码:
'''
贪吃蛇小游戏
'''
随机导入
导入系统
导入时间
导入pygame
从pygame.locals导入*
从集合导入队列
屏幕宽度=600
SCREEN_HEIGHT=480
尺寸=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()
屏幕=py游戏。展示。set _ mode((屏幕_宽度,屏幕_高度))
pygame.display.set_caption('贪吃蛇)
light=(100,100,100) #蛇的颜色
dark=(200,200,200) #食物颜色
font 1=py游戏。字体。sys font(' sim hei ',24) #得分的字体
font2=pygame.font.Font(None,72) #游戏结束的字体
red=(200,30,30) #游戏结束的字体颜色
fwidth,FH height=font 2。大小('游戏结束)
线条宽度=1 #网格线宽度
black=(0,0,0) #网格线颜色
bgcolor=(40,40,60) #背景色
# 方向,起始向右
pos_x=1
pos_y=0
# 如果蛇正在向右移动,那么快速点击向下向左,由于程序刷新没那么快,向下事件会被向左覆盖掉,导致蛇后退,直接游戏结束
# b变量就是用于防止这种情况的发生
b=真
# 范围
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():
非本地蛇
snake.clear()
snake.append((2,scope_y[0]))
snake.append((1,scope_y[0]))
snake.append((0,scope_y[0]))
# 食物
def _create_food():
非本地食物x,食物y
food _ x=random。randint(scope _ x[0],scope_x[1])
food _ y=随机。randint(scope _ y[0],scope_y[1])
蛇中的while (food_x,food_y):
# 为了防止食物出到蛇身上
food _ x=random。randint(scope _ x[0],scope_x[1])
food _ y=随机。randint(scope _ y[0],scope_y[1])
_init_snake()
_create_food()
游戏结束=真
start=False #是否开始,当start=True,game_over=True时,才显示游戏结束
分数=0 #得分
orispeed=0.5 #原始速度
速度=或速度
最后移动时间=无
暂停=假#暂停
虽然正确:
对于pygame.event.get()中的事件:
如果event.type==退出:
sys.exit()
elif event.type==KEYDOWN:
if event.key==K_RETURN:
如果游戏结束:
开始=真
游戏结束=假
b=真
_init_snake()
_create_food()
pos_x=1
pos_y=0
# 得分
分数=0
last_move_time=time.time()
elif event.key==K_SPACE:
如果游戏没有结束:
暂停=不暂停
elif event.key in (K_w,K_UP):
# 这个判断是为了防止蛇向上移时按了向下键,导致直接游戏结束
如果b且不是位置y:
pos_x=0
pos_y=-1
b=假
elif event.key in (K_s,K_DOWN):
如果b且不是位置y:
pos_x=0
pos_y=1
b=假
elif event.key in (K_a,K_LEFT):
如果b而不是位置x:
pos_x=-1
pos_y=0
b=假
elif event.key in (K_d,K_RIGHT):
如果b而不是位置x:
pos_x=1
pos_y=0
b=假
# 填充背景色
屏幕填充(背景颜色)
# 画网格线竖线
对于范围内的x(大小,屏幕宽度,大小):
pygame.draw.line(screen,black,(x,scope_y[0] * SIZE),(x,SCREEN_HEIGHT),line_width)
# 画网格线横线
对于范围内的y(scope _ y[0]* SIZE,SCREEN_HEIGHT,SIZE):
pygame.draw.line(screen,black,(0,y),(SCREEN_WIDTH,y),line_width)
如果游戏结束:
如果开始:
print_text(screen,font2,(SCREEN_WIDTH - fwidth) //2,(SCREEN _ HEIGHT-FH HEIGHT)//2,'游戏结束,
红色)
否则:
curTime=time.time()
如果curTime -最后移动时间速度:
如果没有暂停:
b=真
last_move_time=curTime
next_s=(snake[0][0] pos_x,snake[0][1] pos_y)
if next_s[0]==food_x和next_s[1]==food_y:
# 吃到了食物
_create_food()
snake.appendleft(next_s)
得分=10
速度=或速度-0.03 *(得分//100)
否则:
如果scope _ x[0]=next _ s[0]=scope _ x[1]并且scope _ y[0]=next _ s[1]=scope _ y[1]\
下一个_s不在蛇中:
snake.appendleft(next_s)
snake.pop()
否则:
游戏结束=真
# 画食物
如果游戏没有结束:
# 避免游戏结束的时候把游戏结束的字给遮住了
pygame.draw.rect(screen,light,(food_x * SIZE,food_y * SIZE,SIZE,SIZE),0)
# 画蛇
对于蛇中的学生:
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__ ':
主()
tips:这个贪吃蛇的游戏还是很简单的,大家可以尝试运行哦。
到此这篇关于大蟒实现一个简单的贪吃蛇游戏附代码的文章就介绍到这了,更多相关大蟒贪吃蛇游戏内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。