持续创作,加快生长!这是我参与「掘金日新计划 10 月更文应战」的第3天,点击查看活动详情

我们好,我是极客飞虎,今日给我们共享一款自制小游戏。如何用python编写贪吃蛇

今日,突发奇想的想用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 背后的事情。

示例如下:

//author:爱吃饼干的小白鼠
import sys
modules = sys.modules       # 将 sys 模块的 modules 特点 赋值给 modules 并打印输出 Python启动时加载的模块调集
print(modules)
# sys.exit(0)               # 取消注释该行代码,下方所有的代码将不再履行
path = sys.path
print(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)]

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

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

初始化

snake_speed = 10 #贪吃蛇的速度
windows_width = 800
windows_height = 600 #游戏窗口的巨细
cell_size = 20       #贪吃蛇身体方块巨细,留意身体巨细有必要能被窗口长宽整除

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

色彩界说

# 色彩界说
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 #游戏布景色彩

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

咱们接下来界说一下四个方向

# 界说方向
UP = 1
DOWN = 2
LEFT = 3
RIGHT = 4
HEAD = 0 #贪吃蛇头部下标

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

主函数

#主函数
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)

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

游戏运转主体

#游戏运转主体
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

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

接下来,便是咱们今日的主角–贪吃蛇和它的食物。

#将食物画出来
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)

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

然后咱们规划贪吃蛇有没有吃到食物,判定贪吃蛇逝世以及食物随机产生。

#判别蛇死了没
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)}

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

接下来,咱们规划一个局面画面,代码如下:

#开端信息显现
def show_start_info(screen):
	font = pygame.font.Font('myfont.ttf', 40)
	tip = font.render('按恣意键开端游戏~~~', True, (65, 105, 225))
	gamestart = pygame.image.load('gamestart.png')
	screen.blit(gamestart, (140, 30))
	screen.blit(tip, (240, 550))
	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):  #停止程序
					terminate() #停止程序
				else:
					return #完毕此函数, 开端游戏

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

咱们再来规划游戏结算的画面

#游戏完毕信息显现
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 #完毕此函数, 从头开端游戏

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

当咱们贪吃蛇吃一个食物得多少分,咱们能够这样写:

#画成绩
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)

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

到这儿,咱们贪吃蛇的主体程序现已写出来,咱们稍加完善就能运转。

哈哈,我现已开端玩自己做的贪吃蛇了,如果想要完整程序,能够关注我下一篇博文。

谢谢我们,今日的共享就到这儿了。喜欢的话点个关注吧。