Python游戏开发实战:从贪吃蛇到吃豆豆,保姆级教程+源码分享
Python游戏开发,Python实现贪吃蛇小游戏与吃豆豆附带源码
Python版本:3.6.4
pygame模块;
以及Python自带的一些模块。
需要pip来安装Python并将其添加到环境变量中以安装所需的相关模块。
贪吃蛇游戏的规则就不用我多介绍了T_T。
编写贪吃蛇游戏实际上非常简单。
第一的,我们开始游戏吧:
然后定义贪吃蛇:
Head_coord用来记录蛇头的位置,tail_coords是一个二维数组,用来记录。
所有蛇的位置。
最初,蛇的长度为3,其位置是随机生成的。
用户通过按键控制蛇的动作:
需要注意的是,蛇不能转动180度,只能转动90度。
例如,贪婪的蛇向左移动,不能立即向右移动。
具体来说,代码实现如下:
然后我们需要生成一个随机食物,并保证食物的位置与贪吃蛇的位置不一样:
修改贪吃蛇后,当蛇吃到食物时,蛇的体长增加一;否则,它向给定的方向移动,而不改变蛇的身体长度:
同时;当贪婪的蛇吃东西时,它会产生新的食物必填:
最后,当贪吃蛇接触到墙壁或者蛇头接触到蛇身时。
游戏结束:
显示游戏结束画面:
玩家用钥匙引导游戏主角吃豆人吃掉迷宫中隐藏的所有豆子。
玩家无法控制和捕捉。
一个幽灵。
如果您成功吃掉迷宫中的所有豆子而不被鬼魂抓住,则游戏获胜。
否则,游戏就会失败。
分步实现:
第一步:定义游戏精灵类
首先,让我们明确一下游戏需要什么游戏精灵类。
①墙壁类型
②食物类型(如豆豆)
③角色类型
角色类型包括吃豆人和幽灵;幽灵的移动路径由计算机控制,而吃豆人的移动路径由玩家控制。
当然,它们都需要具备更新角色位置和改变角色移动方向的能力,源码如下:
第二步:设计游戏地图。
使用步骤1在游戏精灵类中我们可以开始设计游戏地图。
由于时间有限,有兴趣的朋友可以在此基础上进行扩展(根据我的源码进行扩展很方便~)。
游戏地图的设计包括以下四个要素:
①创建一堵墙
②创建一扇门(一开始用来关鬼魂)
图片.gif
③创建一个角色
④创造食物
食物就是墙,为了方便游戏地图的设计,因为门和人物不能重叠。
在创造食物之前先建墙;必须首先创建门和角色:
第3步:设计。
游戏主循环
然后,开始设计游戏的主链。
首先是初始化:
然后定义主函数:
startLevelGame函数用于启动游戏的一个关卡,其源码如下:
当游戏结束或者关卡改变时,代码如下:
用Python写个贪吃蛇,保姆级教程!
本文基于Windows环境,适合Python新手。
本文作者:HelloGitHub-Anthony。
HelloGitHub正在推出开源项目解释系列。
本集介绍了一个动手实践的Python项目,Snake!本来想推荐吃蛇的开源项目:python-console-snake,但由于该项目上次更新是在8年前,所以一路上遇到了很多问题。
所以我就用Python重写了贪吃蛇游戏。
项目地址:github.com/AnthonySun25...
我们使用Python从命令行实现一个简单有趣的贪吃蛇游戏,通过运行命令:。
本文包括设计和讲解,分为两部分:第一部分介绍Python命令行图形库的curses,其次是snake相关的代码。
Python已经内置了curse库,但是对于Windows操作系统我们需要安装补丁进行适配。
安装Windows的完成包:pipinstallwindows-curses。
Curses是一个广泛使用的图形函数库,可以在终端中绘制简单的用户界面。
这里我们只做简单的介绍,只探讨Snake需要的功能。
Python内置了curse库,非常易于使用。
下面的脚本可以显示当前对应的键号:。
您也可以尝试将nodelay(True)更改为nodelay(False)并再次运行。
此时,程序会阻塞在stdscr.getch()中,只有按下某个键后才会继续执行。
你可能认为上面的例子太幼稚了。
只需打印几张即可达到相同的效果。
现在让我们做一些技巧来实现一些不可能实现的效果。
使用正常输出。
如果我们想在绘图中实现一个Gameover!窗口,我们可以使用newwin方法:
除了curses.newwin之外,还可以创建一个Gameover!新建独立窗口,我们也可以使用subwin或subpad方法在任意窗口中创建新的子窗口,例如如stdscr.subwin、stdscr.subpad、new_win.subwin、new_win.subpad等,它们的使用与本节创建的new_win或stdscr没有什么不同,只不过新窗口使用独立的缓存区域,而子窗口与父窗口的缓存区域共享。
如果一个窗口在使用后要被删除,最好使用newwin方法创建一个新的独立窗口,这样删除子窗口不会导致父窗口的缓存内容出现问题。
白色和黑色的搭配时间长了会显得单调。
Curses提供了内置颜色,允许我们自定义前景和背景。
在使用颜色模式之前,我们需要使用Curs.start_color()进行初始化:
需要注意的是,位置0处的颜色是默认的黑白配色方案并且无法更改
1.2.3详情本节最后我们来说一下如何给文字添加一点文字效果:
2.贪吃蛇现在这是最后是我们的主菜。
在这一部分中,我将逐步教您如何从头开始制作一条简单但详细的蛇。
对于一个项目来说,与其尽快写出第一行代码,不如花一些时间进行必要的设计。
毕竟,结构决定了项目的功能。
没有好的结构。
没有未来。
Snake将贪吃蛇游戏分为三个主要部分:蛇、食物和游戏逻辑。
让我们看看如何实现这一点。
游戏中的蛇Snake可以做三件事:移动、死亡(吃掉自己、撞墙)和吃东西。
基于这三个函数,我们可以先写一个简单的snake,其类图如图所示:
这条snake可以检查自己是否死了。
任何内容并更新您的位置信息。
其中,body和Last_body是列表,分别存储蛇身体的当前坐标和蛇身体的先前坐标。
列表中的第一个默认元素是蛇的头。
Direction是当前的移动方向,windowsize是蛇可以移动的区域的大小。
使用rest方法重置蛇状态。
它和__init__共同负责初始化蛇:
Position是我自己的类,只包含两个x。
y属性,存储点的坐标。
一开始我们可能有一种隐约的感觉,这几个应该是……,但是内容和初始化方法并不是完全清楚。
这很好。
我们要做的就是继续实现必要的功能,在实践中补充和完善原来的想法。
之后我们自上而下继续实施。
与类图相比,我们应该实现update_snake_pos来更新蛇的位置。
这部分很简单:
其实Last_body只能记录最后一次修改的body,我这里偷懒了。
这里有一个细节。
如果我们是第一次编写这个函数,那么为了让蛇头根据玩家的动作正确移动,我们需要知道蛇头元素在x和y方向上移动了多少。
。
最简单的方法是直接执行if-elif行,确定方向,然后将它们相加。
但问题是,如果我们的需求发生变化(比如我现在说的是蛇可以同时移动两个方格,或者吃特殊道具并在x和y方向上移动不同的距离等),直接修改这样的代码会让人感觉非常痛苦。
所以这里最好的解决方案是使用dis_increment_factor来存储蛇在x和y坐标中移动的距离,并创建一个新函数get_dis_inc_factor来估计:
当然,这样做吧可能有点多余,但是尝试让每个函数只做一件事可以帮助简化我们的代码,并减少编写冗长且难以调试的代码的可能性。
解决了位移问题后,下一步就是考虑贪吃蛇如何吃食物。
这里我们使用两个函数check_eat_food和eat_food来完成:
这里的food是一个函数。
存储所有食物位置信息的列表。
蛇每次移动时,都会调用check_eat_food函数来检查它是否吃了某种食物。
你可能会发现我已经划分了对两个函数进行检查“is”和“is”的两个动作,使得每个函数都能“有的放矢”,方便后续的修改。
现在我们的蛇可以奔跑和进食了。
但就像一条贪婪的蛇只能照顾自己一样,我们也必须能够判断自己目前的状况。
例如,我需要知道的最重要的事情是我是否只是咬了自己。
如果蛇头已经移入体内:
或者我想知道我是否跑得太快而撞到了墙上:
这些功能再简单不过了,但相信自己,这只是几行。
在代码中,您可以实现一条蛇,它可以根据您的命令执行复杂的运动。
完整代码:github.com/AnthonySun25...
命令行2.3?画板!在上一节中,我们实现了游戏中的第一个角色:蛇。
为了显示它,我们现在需要将命令行转换为“绘图板”。
开始之前我们也会想:我们需要在命令行上画什么?直接跳转到类图:
感觉有点不知所措,不知道从哪里开始?事实上,虽然Graphic类中有很多方法,但大多数都只执行特定的功能,并且每次更新游戏时,只需要调用draw_game方法即可:
按照开头-自上而下的设计和自下而上的实现原则。
可以看出draw_game实际上已经执行了所有的Graphic函数。
再深入下去,我们可以发现draw_foods和draw_snake_body的实现基本是一样的。
它们都是通过坐标列表移动,并直接将符号添加到相应的位置:
单独实现它们。
这对于确保代码干净且易于理解以及使后续修改更容易也是必要的。
draw_help、draw_fps、draw_lives_and_scores也相应打印各种文本信息,没有任何新花样。
update_fps实现帧率估算,并调整等待时间以稳定帧率:
draw_message_window实现绘制胜负图片:
B因此,我们实现了游戏动画的显示!
2.4控制!目前我们实现了游戏内容和游戏角色的渲染。
在本节中,我们将探讨Snake的最新内容:控件。
老规矩:在敲代码之前,我们首先要思考:如果我们要写一个控件类,它应该包含哪些方法?仔细想一想也不难:应该有一个循环,游戏会一直持续到你输或者赢,并且每一轮都要更新屏幕,蛇移动的方向等等,这就是我们的开始:
当我们写开头的时候,剩下的结构就可以很容易地实现。
比如读取一个按键控件,最简单的就是比较数字是否大小相同:
更新蛇的状态时,只需要判断它是死了、打败了还是吃了东西:
2.5直接使用为了让这个包能够直接使用pythonsnake运行游戏,我们来看看__main__.py:
当我们尝试直接运行该包时,Python运行和__main__.py执行,我们写的代码只需要三行就可以运行游戏了!
3.结束贪吃蛇游戏编程到此结束!写一个小游戏其实并不难。
对于初学者来说,困难在于如何组织程序的结构。
我所实现的只是其中一种方法。
每个人对游戏结构的理解都会不同,写出的代码也会不同。
但无论怎样,我们必须遵循一个目标:尽量遵循代码规范,养成良好的风格。
这不仅可以帮助其他人阅读您的代码,还可以帮助您修复错误并添加新功能。
最后,感谢您的阅读。
HelloGitHub在GitHub上分享有趣的入门级开源项目。
您的每一次点赞、评论、转发都是对我们最大的支持!订阅HelloGitHub公众号,第一时间接收更新。
期待更多的开源项目和宝库。
python代码大全简单?
python有趣的编程代码class?Point:
row=0
col=0
def?__init__(self,?row,?col):
self.row=row
self.col=col
def?copy(自我):
?return?Point(row=self.row,?col=self.col)
#Initial初始框架
import?pygame
import?random
#初始化
pygame.init()
W=800
H=600
ROW=30
COL=40
size=(W,H)
window=pygame.display.set_mode(size)
pygame.display.set_caption('蛇')
bg_color=(255,255,255)
snake_color=(200,200,200)
head=Point(row=int(ROW/2),?col=int(COL)/2))
head_color=(0,128,128)
snake=[
Point(row=head.row,?col=head.col+1),
Point(row=head.row,?col=head.col+2),
Point(row=head.row,?col=head.col+3)
]
#Generate食物
def?gen_food():
while?1:
pos=Point(row=random.randint(0,ROW-1),?col=random.randint(0,COL-1))
#
is_coll=False
?#你遇到蛇了吗
if?head.row==pos.row?and?head.col==pos.col:
is_coll=True
?#SNAKEBODY
为?蛇?在?蛇:
如果?蛇。
row==pos.row?and?snake.col==pos.col:
is_coll=True
break
?if?not?is_coll:
?break
return?pos
#标准坐定义
food=gen_food()
food_color=(255,255,0)
direct='left'#左、右、上、下
#
def?rect(点,?颜色):
cell_width=W/COL
cell_height=H/ROW
left=point.col*cell_width
top=point.row*cell_height
pygame.draw.rect(
window,?颜色,
(左,?顶部,?cell_width,?cell_height)
)
pass
#游戏循环
quit=True
clock=pygame.time.Clock()
在退出期间:
#Handlingevents
for?event?in?pygame.event.get():
?if?event.type==pygame.STOP:
quit=False
?elif?event.type==pygame.KEYDOWN:
if?event.key==273?or?event.key==119:
?if?direct=='left'?or?direct=='right':
direct='up'
elif?event.key==274?or?event.key==115:
如果?继续==?'左'?或?继续?==?'右':
?direct='down'
elif?event.key==276?or?event.key==97:
如果?直接?==?'向上'?或?直接?==?':
direct='left'
elif?event.key==275?or?event.key==100:
如果?==?'向上'?或?直接==?'向下':
?direct='右'
?#吃
eat=(head.row==food.row?and?head.col==food.col)
#重新生成食物
if?eat:
food?=?gen_food()
#处理正文
#1。
将原来的蛇头插入蛇头
snakes.insert(0,?head.copy())
#2删除最后一条蛇
如果?不?吃:
?snakes.pop()
#mobile
if?directt=='left':
head.col-=1
elif?direct=='right':
head.col+=1
elif?direct=='up':
head.row-=1
elif?direct=='down':
head.row+=1
#Detection
dead=False
#1.撞墙
if?head.col0?or?head.row0?or?head.col=COL?or?head.row=ROW:
dead=True
for?snake?in?snake:if?head.col==snake.col?and?head.row==snake.row:
?dead=True
?break
if?dead:
print('dead')
stop=False
#渲染——绘制
#背景
pygame.draw.rect(window,?bg_color,?(0,0,W,H))
#SNAKEHEAD
for?snake?in?snakes:
?矩形(sular,?sular_color)
矩形(头,?head_color)
矩形(食物,?food_color))
#
pygame.display.flip()
#设置帧率(速度)
clock.tick(8)
#最终作品
这是Greedy的简化版本Snake代码虽然结构简单,但是功能齐全,可玩性很好,能提供一下python数据标准化代码吗?
使用python对数据进行归一化的代码如下:
fromsklearnimportpreprocessing
importnumpyasnp
X=np.array([[1.,-1.,2.],[2.,0.,0.],[0.,1.,-1.]])
X_scaled=preprocessing.scale(X)
print(X_scaled)
Python圣诞树代码很简单````python#Python圣诞树代码foriinrange(1,6):forjinrange(1,i+1):print('*',end='')print('\n')```
扩展:如果你想改变形状树,可以在代码中添加更多的控制参数,比如添加每行有不同数量的空格,使树的形状不同。
同时可以更改颜色、背景、文字等。
通过添加HTML标签和使用CSS样式来制作圣诞树。
10个极简Python代码,随时可用
大家好,我是程序员王小成~
Python虽然是语言简单易学,但很多人仍然问如何最快地学习Python答案当然是通过练习各种小项目只有自己思考和编写才能记住规则。
本文介绍了初学者可以尝试自己完成的10个极简任务;
以下方法可以检查给定列表中是否存在重复元素,它将使用set()函数删除所有重复元素。
给定一定的大小,定义一个函数以按此大小拆分列表。
该方法可以去除布尔值,例如(False,None,0,""),这些值使用filter()函数。
我们经常使用For循环来遍历列表,也可以统计列表的索引和值。
以下代码片段可以将打包对列表解包为两个不同的元组集合。
此方法将递归地将嵌套列表扩展为单个列表。
此方法将返回第一个列表中不在第二个列表中的元素。
如果想同时反馈第二个列表的唯一元素,则需要添加set_b.difference(set_a)。
下面的代码块可用于计算执行某些代码所需的时间。
该算法会打乱列表元素的顺序,尤其是通过Fisher-Yates算法对新列表进行排序:
交换两个值不需要额外的操作。
上面是我列出的十个Python极简代码。
您可以将其取出并使用。
我希望它能帮助你。
Python新手代码如下:
defnot_empty(s)。
returnsandlen(s.strip())0。
#returnsands.条()。
#如果直接写s。
strip(),那么如果s为None,就会报错,因为None没有strip方法。
#如果s为None,则None及任意值均为False,直接返回false。
#如果s不为None,则指定s。
任一trip()为空。
相关介绍。
Python解释器很容易扩展,可以使用C或C++(或可以从C调用的其他语言)来扩展新的函数和数据类型。
Python还可以用作可定制软件中的高级编程语言。
Python丰富的标准库提供了适合各个主要系统平台的源代码或机器代码。
2021年10月,语言流行度指数的编译者Tiobe将Python评为最受欢迎的编程语言,20年来首次将其排在Java、C和JavaScript之上。
代码质数表?
素数表代码是指使用编程语言生成一系列素数的代码。
素数是指只能被自身和1整除的自然数,如2、3、5、7等。
不同的编程语言有不同的实现方法,我可以给你一些参考。
以下是一些网上找到的质数表代码示例:
LanguageC:
#includestdio.hintmain(){inti,j;printf("2\n");for(i=3;i=100;i+=2)//遍历从3开始的奇数
{for(j=3;ji;j++)//判断是否能被更少的奇数整除其中
{?if(i%j==0)//如果可整除,则退出循环
break;
?}if(j==i)//如果循环正常结束,说明是素数,打印出
printf("%d\n",我);
}return0;
}
Python:
#!/usr/bin/python#-*-coding:UTF-8-*-
#输出指定范围内的素数
#用户输入数据lower=int(input("输入最小值区间:"))
upper=int(input("输入区域·值最大值:"))
fornuminrange(bottom,top+1):?#大于1的素数
?ifnum1:?foriinrange(2,num):?if(num%i)==0:break
?else:?print(number)