写点什么

【python 小游戏】用 python 写一款小游戏 -- 贪吃蛇

作者:BROKEN
  • 2022 年 8 月 04 日
  • 本文字数:4317 字

    阅读完需:约 14 分钟

【python小游戏】用python写一款小游戏--贪吃蛇

今天,突发奇想的想用 python 写一款小游戏--贪吃蛇。相信大家都玩过,那么玩一款自己写的是一种什么样的体验呢。


我们首先导入相关模块

## 导入相关模块

import random

import pygame

import sys 

那么这三个模块有什么意思呢。我们一一介绍。

1.random

Python 中的 random 模块用于生成随机数,它提供了很多函数。常用函数总结如下:1. random.random()用于生成一个 0 到 1 的随机浮点数: 0 <= n < 1.0

2. random.seed(n)用于设定种子值,其中的 n 可以是任意数字。random.random() 生成随机数时,每一次生成的数都是随机的。但是,使用 random.seed(n) 设定好种子之后,在先调用 seed(n)时,使用 random() 生成的随机数将会是同一个。

3. random.uniform(a,b)返回 a,b 之间的随机浮点数,若 a<=b 则范围[a,b],若 a>=b 则范围[b,a] ,a 和 b 可以是实数。

4. random.randint(a,b)返回 a,b 之间的整数,范围[a,b],注意:传入参数必须是整数,a 一定要比 b 小。

5. random.randrange([start=0], stop[, step=1])返回前闭后开区间[start,stop)内的整数,可以设置 step。只能传入整数。

6. random.choice(sequence)从 sequence(序列,列表、元组和字符串)中随机获取一个元素。7. random.choice(sequence, k)从 sequence(序列,列表、元组和字符串)中随机获取 k 个元素,可能重复,k 用参数名传值,k 省略则默认取 1 个,返回 list。

8. random. shuffle(x)用于将列表中的元素打乱顺序,俗称为洗牌。

9. random. sample(sequence,k)从指定序列中随机获取 k 个不重复元素作为一个列表返回, sample 函数不会修改原有序列。

知识点扩展

python random 模块导入及用法

random 是程序随机数,很多地方用到,验证码,图片上传的图片名称等,下面说说 python random 模块导入及用法

1,模块导入 import random

2,random 用法

random.randomrange(1,10) 返回 1-10 随机数,不包括 10

random.randomint(1,10) 返回 1-10 随机数,包括 10

random.randomrange(1,100,2)  随机选取 0-100 的偶数

random.random() 返回浮点数

random.choice()random.sample() 从多个字符选取特定字符

2.pygame

pygame 简介 pygame 可以实现 python 游戏的一个基础包。pygame 实现窗口初始化 pygame,init()类似于 java 类的初始化方法,用于 pygame 初始化。pygame.init()设置屏幕,(500,400)设置屏幕初始大小为 500 * 400 的大小,0 和 32 是比较高级的用法。这样我们便设置了一个 500*400 的屏幕。surface = pygame.display.set_mode((500, 400), 0, 32)如果不设置 pygame 事件的话,窗口会一闪而逝。这里去捕捉 pygame 的事件,如果没有按退出,那么窗口就会一直保持着,这样方便我们去设置不同的内容展示。

3.sys

sys 模块 与 os 包一样,也是对系统资源进行调用。功能同样也是非常丰富,接下来我们会对 sys 模块的一些简单且常用的函数进行介绍,主要针对一些非功能性的函数与属性来认识一些不太常见的 Python 背后的事件。

sys 中的常用方法



​编辑

 示例如下:

//author:爱吃饼干的小白鼠import sys
modules = sys.modules # 将 sys 模块的 modules 属性 赋值给 modules 并打印输出 Python启动时加载的模块集合print(modules)
# sys.exit(0) # 取消注释该行代码,下方所有的代码将不再执行
path = sys.pathprint(path) # 将 sys 模块的 path 属性 赋值给 path 并打印输出 python 环境可以导入内置、第三方包与函数的所在路径
code = sys.getdefaultencoding() # 将 sys 模块 的 getdefaultencoding()函数 赋值给 code 并打印输出当前系统的编码[utf-8]print(code)
# >>> 执行结果如下:# >>> utf-8
print(sys.platform) # 获取当前系统平台(如windows、Mac、linux)
# >>> 执行结果如下:# >>> darwin
print(sys.version) # 获取当前 Python 的版本
# >>> 执行结果如下:# >>> 3.8.7 (v3.8.7:6503f05dd5, Dec 21 2020, 12:45:15) # >>> [Clang 6.0 (clang-600.0.57)]
复制代码

​​

 言归正传,我们继续说说下一步我们要怎么做。

初始化

snake_speed = 10 #贪吃蛇的速度windows_width = 800windows_height = 600 #游戏窗口的大小cell_size = 20       #贪吃蛇身体方块大小,注意身体大小必须能被窗口长宽整除
复制代码


颜色定义 

# 颜色定义white = (255, 255, 255)black = (0, 0, 0)gray = (230, 230, 230)dark_gray = (40, 40, 40)DARKGreen = (0, 155, 0)Green = (0, 255, 0)Red = (255, 0, 0)blue = (0, 0, 255)dark_blue =(0,0, 139)

BG_COLOR = black #游戏背景颜色
复制代码


  我们接下来定义一下四个方向

# 定义方向UP = 1DOWN = 2LEFT = 3RIGHT = 4
HEAD = 0 #贪吃蛇头部下标
复制代码


主函数

#主函数def main():	pygame.init() # 模块初始化	snake_speed_clock = pygame.time.Clock() # 创建Pygame时钟对象	screen = pygame.display.set_mode((windows_width, windows_height)) #	screen.fill(white)
pygame.display.set_caption("Python 贪吃蛇小游戏") #设置标题 show_start_info(screen) #欢迎信息 while True: running_game(screen, snake_speed_clock) show_gameover_info(screen)

复制代码


 游戏运行主体

#游戏运行主体def running_game(screen,snake_speed_clock):	startx = random.randint(3, map_width - 8) #开始位置	starty = random.randint(3, map_height - 8)	snake_coords = [{'x': startx, 'y': starty},  #初始贪吃蛇                  {'x': startx - 1, 'y': starty},                  {'x': startx - 2, 'y': starty}]
direction = RIGHT # 开始时向右移动
food = get_random_location() #实物随机位置
while True: for event in pygame.event.get(): if event.type == QUIT: terminate() elif event.type == KEYDOWN: if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT: direction = LEFT elif (event.key == K_RIGHT or event.key == K_d) and direction != LEFT: direction = RIGHT elif (event.key == K_UP or event.key == K_w) and direction != DOWN: direction = UP elif (event.key == K_DOWN or event.key == K_s) and direction != UP: direction = DOWN elif event.key == K_ESCAPE: terminate()
move_snake(direction, snake_coords) #移动蛇
ret = snake_is_alive(snake_coords) if ret: break #蛇跪了. 游戏结束 snake_is_eat_food(snake_coords, food) #判断蛇是否吃到食物
screen.fill(BG_COLOR) #draw_grid(screen) draw_snake(screen, snake_coords) draw_food(screen, food) draw_score(screen, len(snake_coords) - 3) pygame.display.update() snake_speed_clock.tick(snake_speed) #控制fps
复制代码

​接下来,就是我们今天的主角--贪吃蛇和它的食物。

#将食物画出来def draw_food(screen, food):	x = food['x'] * cell_size	y = food['y'] * cell_size	appleRect = pygame.Rect(x, y, cell_size, cell_size)	pygame.draw.rect(screen, Red, appleRect)#将贪吃蛇画出来def draw_snake(screen, snake_coords):	for coord in snake_coords:		x = coord['x'] * cell_size		y = coord['y'] * cell_size		wormSegmentRect = pygame.Rect(x, y, cell_size, cell_size)		pygame.draw.rect(screen, dark_blue, wormSegmentRect)		wormInnerSegmentRect = pygame.Rect(                #蛇身子里面的第二层亮绿色			x + 4, y + 4, cell_size - 8, cell_size - 8)		pygame.draw.rect(screen, blue, wormInnerSegmentRect)
复制代码

  然后我们设计贪吃蛇有没有吃到食物,判定贪吃蛇死亡以及食物随机产生。

#判断蛇死了没def snake_is_alive(snake_coords):	tag = True	if snake_coords[HEAD]['x'] == -1 or snake_coords[HEAD]['x'] == map_width or snake_coords[HEAD]['y'] == -1 or \			snake_coords[HEAD]['y'] == map_height:		tag = False # 蛇碰壁啦	for snake_body in snake_coords[1:]:		if snake_body['x'] == snake_coords[HEAD]['x'] and snake_body['y'] == snake_coords[HEAD]['y']:			tag = False # 蛇碰到自己身体啦	return tag#判断贪吃蛇是否吃到食物def snake_is_eat_food(snake_coords, food):  #如果是列表或字典,那么函数内修改参数内容,就会影响到函数体外的对象。	if snake_coords[HEAD]['x'] == food['x'] and snake_coords[HEAD]['y'] == food['y']:		food['x'] = random.randint(0, map_width - 1)		food['y'] = random.randint(0, map_height - 1) # 实物位置重新设置	else:		del snake_coords[-1]  # 如果没有吃到实物, 就向前移动, 那么尾部一格删掉#食物随机生成def get_random_location():	return {'x': random.randint(0, map_width - 1), 'y': random.randint(0, map_height - 1)}

复制代码


接下来,我们设计一个开局画面,代码如下:

while True:  #键盘监听事件  for event in pygame.event.get():  # event handling loop    if event.type == QUIT:      terminate()     #终止程序    elif event.type == KEYDOWN:      if (event.key == K_ESCAPE):  #终止程序        terminate() #终止程序      else:        return #结束此函数, 开始游戏
复制代码



​我们再来设计游戏结算的画面

#游戏结束信息显示def show_gameover_info(screen):	font = pygame.font.Font('myfont.ttf', 40)	tip = font.render('按Q或者ESC退出游戏, 按任意键重新开始游戏~', True, (65, 105, 225))	gamestart = pygame.image.load('gameover.png')	screen.blit(gamestart, (60, 0))	screen.blit(tip, (80, 300))	pygame.display.update()
while True: #键盘监听事件 for event in pygame.event.get(): # event handling loop if event.type == QUIT: terminate() #终止程序 elif event.type == KEYDOWN: if event.key == K_ESCAPE or event.key == K_q: #终止程序 terminate() #终止程序 else: return #结束此函数, 重新开始游戏
复制代码

 当我们贪吃蛇吃一个食物得多少分,我们可以这样写:

#画成绩def draw_score(screen,score):	font = pygame.font.Font('myfont.ttf', 30)	scoreSurf = font.render('得分: %s' % score, True, Green)	scoreRect = scoreSurf.get_rect()	scoreRect.topleft = (windows_width - 120, 10)	screen.blit(scoreSurf, scoreRect)
复制代码


到这里,我们贪吃蛇的主体程序已经写出来,我们稍加完善就能运行。 

发布于: 刚刚阅读数: 3
用户头像

BROKEN

关注

还未添加个人签名 2022.08.02 加入

还未添加个人简介

评论

发布
暂无评论
【python小游戏】用python写一款小游戏--贪吃蛇_8月日更_BROKEN_InfoQ写作社区