【python小游戏】用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)]

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

初始化

snake_speed = 10 #贪吃蛇的速度
windows_width = 800
windows_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 = 1
DOWN = 2
LEFT = 3
RIGHT = 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)}


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

#开始信息显示
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 #结束此函数, 开始游戏

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

#游戏结束信息显示
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)

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

感兴趣的小伙伴,完整代码和全套Python学习资料免费赠送,具体看下方。

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述
若有侵权,请联系删除
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,下面是一个简单的Python单机小游戏贪吃蛇的实现过程: 1. 导入必要的模块 ```python import pygame import random ``` 2. 初始化Pygame ```python pygame.init() ``` 3. 设置游戏窗口大小和标题 ```python window_width = 640 window_height = 480 game_window = pygame.display.set_mode((window_width, window_height)) pygame.display.set_caption('Snake Game') ``` 4. 定义颜色和字体 ```python white = (255, 255, 255) black = (0, 0, 0) red = (255, 0, 0) font = pygame.font.SysFont(None, 25) ``` 5. 定义贪吃蛇和食物的初始位置和大小 ```python block_size = 10 snake_speed = 15 def snake(snake_list, block_size): for x_y in snake_list: pygame.draw.rect(game_window, black, [x_y[0], x_y[1], block_size, block_size]) def message_to_screen(msg, color): screen_text = font.render(msg, True, color) game_window.blit(screen_text, [window_width/6, window_height/6]) def gameLoop(): game_exit = False game_over = False lead_x = window_width/2 lead_y = window_height/2 lead_x_change = 0 lead_y_change = 0 snake_list = [] snake_length = 1 food_x = round(random.randrange(0, window_width-block_size)/10.0)*10.0 food_y = round(random.randrange(0, window_height-block_size)/10.0)*10.0 while not game_exit: while game_over == True: game_window.fill(white) message_to_screen('Game over, press Q to quit or C to play again', red) pygame.display.update() for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_q: game_exit = True game_over = False elif event.key == pygame.K_c: gameLoop() for event in pygame.event.get(): if event.type == pygame.QUIT: game_exit = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: lead_x_change = -block_size lead_y_change = 0 elif event.key == pygame.K_RIGHT: lead_x_change = block_size lead_y_change = 0 elif event.key == pygame.K_UP: lead_y_change = -block_size lead_x_change = 0 elif event.key == pygame.K_DOWN: lead_y_change = block_size lead_x_change = 0 if lead_x >= window_width or lead_x < 0 or lead_y >= window_height or lead_y < 0: game_over = True lead_x += lead_x_change lead_y += lead_y_change game_window.fill(white) pygame.draw.rect(game_window, red, [food_x, food_y, block_size, block_size]) snake_head = [] snake_head.append(lead_x) snake_head.append(lead_y) snake_list.append(snake_head) if len(snake_list) > snake_length: del snake_list[0] for each_segment in snake_list[:-1]: if each_segment == snake_head: game_over = True snake(snake_list, block_size) pygame.display.update() if lead_x == food_x and lead_y == food_y: food_x = round(random.randrange(0, window_width-block_size)/10.0)*10.0 food_y = round(random.randrange(0, window_height-block_size)/10.0)*10.0 snake_length += 1 clock.tick(snake_speed) pygame.quit() quit() ``` 6. 调用游戏主函数 ```python gameLoop() ``` 这样一个简单的Python单机小游戏贪吃蛇就完成了。希望对您有所帮助! ### 回答2: 贪吃蛇一款经典的单机小游戏,使用Python语言可以实现这个游戏。下面我将简单介绍一下实现贪吃蛇游戏所需的主要步骤: 1. 导入相关的模块:使用Pythonpygame模块实现游戏窗口的创建和操作。 2. 定义蛇的初始位置和长度:可以使用列表来表示蛇的身体,列表中的每一项表示蛇身的一个部分的坐标。初始时可以定义一个长度为3的蛇,即初始时有三个坐标。 3. 设置游戏的主循环:使用pygame模块的事件循环来实现游戏的核心逻辑。在每一次循环中检测用户的操作,判断是否按下了方向键,如果按下方向键则改变蛇头的方向,同时更新蛇的位置。 4. 监测蛇头和食物的碰撞:在游戏的主循环中检测蛇头的位置是否与食物的位置重叠,如果重叠则蛇的长度加一,并在后面添加一个新的蛇身坐标。同时生成一个新的食物,并将其位置显示在屏幕上的随机位置。 5. 监测蛇头与蛇身的碰撞:每当蛇移动一步,都需要检测蛇头和蛇身的碰撞情况。如果蛇头和蛇身的任何一个部分的位置重合,则游戏结束。 6. 更新游戏界面:在每一次循环结束后,将蛇的身体和食物的位置更新显示在屏幕上。 以上是实现贪吃蛇游戏的主要步骤,具体的实现细节可以根据个人的想法进行扩展和优化,比如可以增加难度级别、计分系统等。希望这个简单的回答能帮助到你理解贪吃蛇游戏的实现过程。 ### 回答3: 贪吃蛇是一个非常经典的单机小游戏,通过使用Python编程语言可以很好地实现。 首先,我们需要使用Pygame库来创建游戏窗口,并且设置蛇的移动规则、食物的生成和蛇与食物的交互。游戏窗口的大小、背景等可以根据个人喜好进行设置。 接下来,我们可以定义蛇的初始位置和长度,并且设置蛇的运动方向。每当蛇吃到食物时,蛇的长度会增加,并且在新的位置生成食物。蛇的运动方向由玩家控制,可以通过键盘的方向键来控制移动。 在游戏过程中,需要判断蛇是否吃到食物或者是否吃到自己的身体,这可以通过检查蛇的位置和碰撞检测来实现。如果蛇吃到食物,则增加长度,并且生成新的食物,如果蛇吃到自己的身体,则游戏结束。 游戏还可以设置计分系统,每当蛇吃到食物时,计分会增加,并且在游戏界面上显示出来。当蛇吃到自己的身体或者撞到边界时,游戏结束,最终会显示玩家的得分。 为了增加游戏的难度和趣味性,我们可以设置蛇的速度随着长度的增加而加快,或者在游戏界面上放置一些障碍物,需要蛇绕过。 总结一下,使用Python编程语言可以很方便地实现贪吃蛇这个经典的单机小游戏,并且可以通过设置窗口、蛇的移动规则、食物的生成和交互、碰撞检测、计分系统等来增加游戏的乐趣和挑战。这个游戏编程初学者非常适合练手的项目,也是可以让玩家回忆童年经典游戏的一种方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值