Python游戏开发实战:从贪吃蛇到吃豆豆,保姆级教程+源码分享

创始人
2024-12-15 18:32:51
0 次浏览
0 评论

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相关的代码。

1.初识curses

Python已经内置了curse库,但是对于Windows操作系统我们需要安装补丁进行适配。
安装Windows的完成包:pipinstallwindows-curses。
Curses是一个广泛使用的图形函数库,可以在终端中绘制简单的用户界面。
这里我们只做简单的介绍,只探讨Snake需要的功能。

1.1易于使用

Python内置了curse库,非常易于使用。
下面的脚本可以显示当前对应的键号:。
您也可以尝试将nodelay(True)更改为nodelay(False)并再次运行。
此时,程序会阻塞在stdscr.getch()中,只有按下某个键后才会继续执行。

1.2一些技巧

你可能认为上面的例子太幼稚了。
只需打印几张即可达到相同的效果。
现在让我们做一些技巧来实现一些不可能实现的效果。
使用正常输出。

1.2.1创建一个新的子窗口

如果我们想在绘图中实现一个Gameover!窗口,我们可以使用newwin方法:

除了curses.newwin之外,还可以创建一个Gameover!新建独立窗口,我们也可以使用subwin或subpad方法在任意窗口中创建新的子窗口,例如如stdscr.subwin、stdscr.subpad、new_win.subwin、new_win.subpad等,它们的使用与本节创建的new_win或stdscr没有什么不同,只不过新窗口使用独立的缓存区域,而子窗口与父窗口的缓存区域共享。

如果一个窗口在使用后要被删除,最好使用newwin方法创建一个新的独立窗口,这样删除子窗口不会导致父窗口的缓存内容出现问题。

1.2.2颜色多一点

白色和黑色的搭配时间长了会显得单调。
Curses提供了内置颜色,允许我们自定义前景和背景。

在使用颜色模式之前,我们需要使用Curs.start_color()进行初始化:

需要注意的是,位置0处的颜色是默认的黑白配色方案并且无法更改

1.2.3详情

本节最后我们来说一下如何给文字添加一点文字效果:

2.贪吃蛇

现在这是最后是我们的主菜。
在这一部分中,我将逐步教您如何从头开始制作一条简单但详细的蛇。

2.1设计

对于一个项目来说,与其尽快写出第一行代码,不如花一些时间进行必要的设计。
毕竟,结构决定了项目的功能。
没有好的结构。
没有未来。
Snake将贪吃蛇游戏分为三个主要部分:蛇、食物和游戏逻辑。
让我们看看如何实现这一点。

2.2SnakeWhisperer

游戏中的蛇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初学者的代码?

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)

文章标签:
Python 贪吃蛇
热门文章
1
Python编程入门:全面解析Pytho... python的基本语法基本的Python语法如下:1.变量的定义。在编程语言中,...

2
Python字典操作全解析:添加、修改、... Pythondict字典基本操作(包括添加、修改、删除键...

3
Python错误处理与异常处理:构建稳定... 2.5错误处理与异常在编程领域,错误处理和异常处理是保证程序稳定性和健壮性的关键...

4
Python数据转换攻略:字符串、列表、... Python字典、字符串及列表的相互转换Python中数据转换的艺术:从字典和字...

5
Python列表相加与求和技巧解析 重温python基础:列表相加的方法(两个list[]加法)今天,我们来看看Py...

6
Python运行快捷键大揭秘:高效操作,... python运行按哪个键运行Python时的快捷键包括Ctrl+Shift+F1...

7
Python字符与数字互转攻略:轻松掌握... python 字符与数字如何转换Python是一种功能强大且结...

8
Python字符串转列表:两种常用方法解... python怎么将字符串转换为列表Python中将字符串转换为列表的方法有多种,...

9
Python字符串转列表:两种常用方法解... python怎么将字符串转换为列表在Python中将字符串转换为列表的方法有很多...

10
Python列表转字符串全攻略:掌握四种... Python列表到字符串–如何在Python中转换列表在Python中,将列表转...