Python游戏开发,Python实现贪吃蛇小游戏与吃豆豆 附带源码

Python游戏开发,Python实现贪吃蛇小游戏与吃豆豆 附带源码,第1张

Python版本: 3.6.4

相关模块:

pygame模块;

以及一些Python自带的模块。

安装Python并添加到环境变量,pip安装需要的相关模块即可。

贪吃蛇游戏 规则应该不需要我多做介绍了吧T_T。写个贪吃蛇 游戏 其实还是很简单的。首先,我们进行一下 游戏 初始化:

然后定义一个贪吃蛇类:

其中head_coord用来记录蛇头所在位置,而tail_coords是一个二维数组,用来记录所有蛇身的位置。一开始,贪吃蛇长为3,并且位置是随机生成的。用户通过 键来控制贪吃蛇的行动:

需要注意的是,贪吃蛇不能180 大拐弯,只能90 地拐弯。例如正在向左行动的贪吃蛇不能瞬间变成向右行动。具体而言,代码实现如下:

然后,我们需要随机生成一个食物,且需要保证该食物的位置不与贪吃蛇的位置相仔蚂同:

在更新贪吃蛇的时候,如果它吃到了食物,则蛇身长加一,否则只是简单的按照给定的方向行动而不改变蛇身长度:

同时,当贪吃蛇吃到食物时,需要重新生成一个新的食物:

最后,当贪吃蛇碰到墙壁或者蛇头碰到蛇身时, 游戏 结束:

并显示一下 游戏 结束界面:

玩家通过 键控制 游戏 的主角吃豆人吃掉藏在迷宫内的所有豆子,并且不能被鬼魂抓到。

若能顺利吃完迷宫内的所有豆子并且不被鬼魂抓到,则 游戏 胜利,否则 游戏 失败。

逐步实现:

Step1:定义 游戏 精灵类

首先,让我们先来明确一下该 游戏 需要哪些 游戏 精灵类。

① 墙类

② 食物类(即豆豆)

③ 角色类

角色类包括吃豆人和鬼魂,鬼魂由电脑控制其运动轨迹,吃豆人由玩家控制其运动轨迹。

显然,其均需具备更新角色位置和改变角色运动方向的能力,其源代码如下:

Step2:设计 游戏 地图

利用Step1中定义的 游戏 精灵类,我们就可以开始设计 游戏 地图神敏了。由于时间有限,我只写了一个关卡的 游戏 地图,有兴趣的小伙伴可以在此基础上进行扩展(在我的源代码基础上进行扩展是很方便滴~)。 游戏 地图的设计包括以下四方面内容:

① 创建墙

② 创建门(一开始关幽灵用的)

image.gif

③ 创建角色

④ 创建食物

因为食物不能和墙、门以及角色的位游戚枝置重叠,所以为了方便设计 游戏 地图,要先创建完墙、门以及角色后再创建食物:

Step3:设计 游戏 主循环

接下来开始设计 游戏 主循环。首先是初始化:

然后定义主函数:

其中startLevelGame函数用于开始某一关 游戏 ,其源代码如下:

showText函数用于在 游戏 结束或关卡切换时在 游戏 界面中显示提示性文字,其源代码如下:

游戏描述如下:

1. 贪吃蛇可以自动直线前进,或者玩家可以通过方向键 *** 纵贪吃蛇上下左右前进,每次前进一格。

2. 贪吃蛇在规定的区域内活动,当:

①贪吃蛇触碰到墙壁时;

②贪吃蛇的蛇头触碰到蛇身或者蛇尾时;

③玩家的键盘输入不是方向键时;

命令行显示“Game Over!”并且退出游戏。

3. 贪吃蛇活动的区域内每次随机产生一颗“豆豆”,当贪吃蛇吃到“豆豆”后蛇身增长一格,自动前进时间缩

短100ms(默认是1000ms,且不能少于100ms)。贪蔽羡世吃蛇长度每为8的倍数Improve a Level。

C++代码如下:

#include <bios.h> 

#include <conio.h> 

#include <dos.h> 

#include <graphics.h> 

#include <stdlib.h> 

#include <time.h> 

using namespace std 

  

inline void display(char gsDomain[][22], int level, int moveSpeed) 

system("cls") //清屏 

cout << endl << endl 

for (int i = 0 i < 22 i++) 

cout << "\t" 

for (int j = 0 j < 22 j++) 

cout << gsDomain[i][j] << " " 

if (i == 0) 

cout << "\tLevel:" << level 

else if (i == 3) 

cout << "\t自动前进时间" 

else if (i == 5) 

cout << "\t间隔:" << moveSpeed << " ms" 

  

cout << endl 

  

int main() 

char gsDomain[22][22] //贪吃蛇活动区域(包括墙壁) 

//初始化贪吃蛇活动区域(不包括墙壁) 

for (int i = 1 i <= 21 i++) 

for (int j = 1 j <= 21 j++) 

gsDomain[i][j] = ' ' 

//初始化贪吃蛇活动区域的上下墙壁 

for (int i = 0 i < 22 i++) 

gsDomain[0][i] = gsDomain[21][i] = '-' 

//初始化宏肢贪吃蛇活动区域的左右墙壁 

for (int i = 1 i < 21 i++) 

gsDomain[i][0] = gsDomain[i][21] = '|' 

//初始化蛇身 

for (int i = 1 i <= 3 i++) 

gsDomain[1][i] = '*' 

//初始化蛇头 

gsDomain[1][4] = '#' 

  

int snake[2][100] //记录贪吃蛇每次出现的位置的坐标 

for (int i = 0 i < 4 i++) 

snake[0][i] = 1 //记录贪吃蛇所在位置的x坐标 

snake[1][i] = i + 1 //记录贪吃蛇所在位置的y坐标 

int head = 3, tail = 0, length = 4 

  

int beanX, beanY //豆豆出现的位置 

srand(time(0)) 

do

beanX = rand() % 20 + 1 

beanY = rand() % 20 + 1 

} while (gsDomain[beanX][beanY] != ' ') 

gsDomain[beanX][beanY] = '*' //豆豆 

  

cout << "\n\n\t\t贪吃蛇游戏即将开始!\n" 

long start 

int level = 1, moveSpeed = 1000 

for (int i = 3 i >= 0 i--) 

start = clock() 

while (clock() - start <= 1000){} 

system("cls") 

if (i) 

cout << "\n\n\t\t进入游戏倒计时:" << i << endl 

else

display(gsDomain, level, moveSpeed) 

  

char direction = 77 //贪吃蛇默认自动向右直线前进 

while (true) 

bool timeFlag = true 

int x, y 

start = clock() 

  

//若时间超过自动前进时间或者键盘上有键按下则终止循环 

while ((timeFlag = (clock() - start <= moveSpeed)) && !kbhit()){} 

  

if (timeFlag) 

//键盘上有键按下时读取键盘输入 

getch() 

direction = getch() 

  

switch 派雀(direction) 

//向上 

case 72: x = snake[0][head] - 1, y = snake[1][head] 

break 

//向下 

case 80: x = snake[0][head] + 1, y = snake[1][head] 

break 

//向左 

case 75: x = snake[0][head], y = snake[1][head] - 1 

break 

//向右 

case 77: x = snake[0][head], y = snake[1][head] + 1 

break 

default: cout << "\tGame Over!\n" 

return 0 

  

if (x == 0 || x == 21 || y == 0 || y == 21) 

//贪吃蛇触碰到墙壁 

cout << "\tGame Over!\n" 

return 0 

  

if (gsDomain[x][y] != ' ' && !(x == beanX && y == beanY)) 

//贪吃蛇的蛇头触碰到蛇身或者蛇尾 

cout << "\tGame Over!\n" 

return 0 

  

if (x == beanX && y == beanY) 

//吃豆豆 

length++ //长度加1 

if (length >= 8) 

//游戏升级处理 

length -= 8 

level++ 

if (moveSpeed > 100) 

moveSpeed -= 100 

gsDomain[snake[0][head]][snake[1][head]] = '*' 

gsDomain[x][y] = '#' 

head = (head + 1) % 100 

snake[0][head] = x 

snake[1][head] = y 

do

beanX = rand() % 20 + 1 

beanY = rand() % 20 + 1 

} while (gsDomain[beanX][beanY] != ' ') 

gsDomain[beanX][beanY] = '*' 

  

display(gsDomain, level, moveSpeed) //屏幕上显示 

else

//不吃豆豆 

gsDomain[snake[0][tail]][snake[1][tail]] = ' ' //蛇尾前移一格 

tail = (tail + 1) % 100 

gsDomain[snake[0][head]][snake[1][head]] = '*' 

head = (head + 1) % 100 

snake[0][head] = x 

snake[1][head] = y 

gsDomain[x][y] = '#' //蛇头前移一格 

display(gsDomain, level, moveSpeed) //屏幕上显示 

  

return 0 

}

二月二吃炒豆子的寓意是农民对新一年好收成的期望。

在二月二寅时前,人们就会把豆子炒好,让家里的一家老小在一大早就能吃到炒豆子。听家里的老人说,二月二吃炒豆子相当于吃虫子,吃了豆子,地里的害虫就会少,因此二月二吃炒豆子是农民旅野对新一年好收成的期望。二袭镇伍月二称为龙头节,以各种与龙相关的民俗活动来祈求平安和丰收就成为全国各地的一种习俗。龙抬头又被称为春耕节、农事节、春龙节,是中国民间传统节日。“龙”是指二十八宿中的东方苍龙七宿星象,每到仲春卯拍或月之初,黄昏时“龙角星”。(

由于节期重叠,南方部分地区“二月二”既有龙抬头节习俗又有祭社习俗,如在浙江、福建、广东、广西等地区,“二月二”(古时为立春后第五个戊日)多以祭社(土地神)为主,祭龙多在“龙飞天”的端阳。节日来源天文星象“龙抬头”。郑重声明,回答内容仅供参考,请勿盲目迷信。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12279880.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存