pygame实现贪吃蛇游戏(上)
作者:冰风漫天 发布时间:2022-07-10 20:48:10
本文实例为大家分享了pygame贪吃蛇游戏的具体代码,供大家参考,具体内容如下
1.准备工作
我们已经初始化了一个400*400的界面,为方便看我们的游戏,我们先在界面上画40*40的格子,即纵向切10份,横向切10份,这样我们就需要画20个线段,下面是20个线段的画法
for x in range(0,400,40):
pygame.draw.line(screen,(255,255,255),(x,0),(x,400),1)
for y in range(0,400,40):
pygame.draw.line(screen,(255,255,255),(0,y),(400,y),1)
绘制后效果如下
2.蛇头和豆子的位置
可以使用random取一个随机位置
import random
snake_x = random.randint(0,9)*40+20
snake_y = random.randint(0,9)*40+20
绘制一个圆形的蛇头
yellow = 255,255,0
pygame.draw.circle(screen,yellow,[snake_x,snake_y],20,2)
豆子的绘制类似,我们可以把豆子的圈画小一点,把线宽画宽一点,这样就有一个实心的豆子
pygame.draw.circle(screen,yellow,[bean_x,bean_y],10,10)
现在看到的界面是这样的
目前的完整代码是这样的
# -*- coding=utf-8 -*-
import random
import pygame
pygame.init()
screencaption = pygame.display.set_caption('first pygame')
screen = pygame.display.set_mode((400,400)) #设置400*400窗口
snake_x = random.randint(0,9)*40+20
snake_y = random.randint(0,9)*40+20
def get_bean_pos():
return random.randint(0,9)*40+20,random.randint(0,9)*40+20
yellow = 255,255,0
bean_x,bean_y = get_bean_pos()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
screen.fill((0,0,255)) # 将界面设置为蓝色
for x in range(0,400,40):
pygame.draw.line(screen,(255,255,255),(x,0),(x,400),1)
for y in range(0,400,40):
pygame.draw.line(screen,(255,255,255),(0,y),(400,y),1)
pygame.draw.circle(screen,yellow,[snake_x,snake_y],20,2)
pygame.draw.circle(screen,yellow,[bean_x,bean_y],10,10)
pygame.display.update() # 必须调用update才能看到绘图显示
3.用键盘控制蛇头的移动
导入事件判断的变量
from pygame.locals import KEYDOWN,K_LEFT,K_RIGHT,K_UP,K_DOWN
在事件判断中增加一下程序
if event.type == KEYDOWN:
if event.key == K_LEFT:
if snake_x-40>0: snake_x-=40
if event.key == K_RIGHT:
if snake_x+40<400: snake_x+=40
if event.key == K_UP:
if snake_y-40>0: snake_y-=40
if event.key == K_DOWN:
if snake_y+40<400: snake_y+=40
现在再运行程序时,已经看到可以对蛇头进行方向的控制了
4.使蛇头向某一方向匀速移动
首先我们定义一个用于计算时间间隔的时间戳
diff_ticks = 500 # 移动一次蛇头的事件,单位毫秒
ticks = pygame.time.get_ticks()
ticks += diff_ticks
在主循环里判断,如果时间满了则触发蛇头移动到下一个
if pygame.time.get_ticks() >= ticks:
snake_x,snake_y = set_snake_next_pos(snake_x,snake_y)
ticks += diff_ticks
set_snake_next_pos函数的实现如下
dire = random.randint(0,3) # 假设0、1、2、3分别代表方向左、右、上、下
def set_snake_next_pos(snake_x, snake_y):
if dire == 0:
if snake_x - 40 > 0:
snake_x -= 40
if dire == 1:
if snake_x + 40 < 400:
snake_x += 40
if dire == 2:
if snake_y - 40 > 0:
snake_y -= 40
if dire == 3:
if snake_y + 40 < 400:
snake_y += 40
return snake_x,snake_y
此外,主循环里键盘的判断也要做下修改,一是要在键盘按下后修改移动方向,二是按下时不用马上移动蛇头,等待时间满后的自动移动,判断代码修改后如下
if event.type == KEYDOWN:
if event.key == K_LEFT:
if dire!=0 and dire!=1 and snake_x - 40 > 0: # 和当前方向不是同方向或反方向并且可以左移
dire = 0
if event.key == K_RIGHT:
if dire!=0 and dire!=1 and snake_x + 40 < 400: # 和当前方向不是同方向或反方向并且可以右移
dire = 1
if event.key == K_UP:
if dire!=2 and dire!=3 and snake_y - 40 > 0: # 和当前方向不是同方向或反方向并且可以上移
dire = 2
if event.key == K_DOWN:
if dire!=2 and dire!=3 and snake_y + 40 < 400: # 和当前方向不是同方向或反方向并且可以下移
dire = 3
为避免蛇头出来就撞墙,我们对初始的蛇头方向再做个处理,让蛇头往空白多的地方前进,代码如下
#dire = random.randint(0,3) # 假设0、1、2、3分别代表方向左、右、上、下
if snake_x < 5:
dire = 1 # 往右移动
else:
dire = 0 # 往左移动
5.使给蛇增加身体
我们用一个方块做蛇的身体,身体应该是头的后面一格,按蛇头的移动方向放到后面一格,如果后面一个已经没有位置了,则往垂直方向上放到上方或者下方
定义身体初始位置的代码如下
body_y = snake_y
if dire == 0: # 向左移动
if snake_x + 40 < 400:
body_x = snake_x + 40
else: # 身体不能放右侧了,只能往上下方向放
if snake_y > 200:
body_x = snake_x
body_y -= 40
else:
body_x = snake_x
body_y += 40
else: # 向右移动
if snake_x - 40 > 0:
body_x = snake_x - 40
else: # 身体不能放左侧了,只能往上下方向放
if snake_y > 200:
body_x = snake_x
body_y -= 40
else:
body_x = snake_x
body_y += 40
主循环里增加矩形身体的绘制
pygame.draw.rect(screen,yellow,[body_x-20,body_y-20,40,40],5)
在每次更新蛇位置时可以先把身体的位置变成蛇头的位置,再进行蛇头移动操作
if pygame.time.get_ticks() >= ticks:
body_x = snake_x
body_y = snake_y
snake_x,snake_y = set_snake_next_pos(snake_x,snake_y)
ticks += diff_ticks
目前的效果图如下
最后附下目前的完整代码,下章再介绍吃豆和身体变长部分的代码修改
# -*- coding=utf-8 -*-
import random
import pygame
from pygame.locals import KEYDOWN,K_LEFT,K_RIGHT,K_UP,K_DOWN
pygame.init()
screencaption = pygame.display.set_caption('first pygame')
screen = pygame.display.set_mode((400,400)) #设置400*400窗口
snake_x = random.randint(0,9)*40+20
snake_y = random.randint(0,9)*40+20
def get_bean_pos():
return random.randint(0,9)*40+20,random.randint(0,9)*40+20
yellow = 255,255,0
bean_x,bean_y = get_bean_pos()
diff_ticks = 500 # 移动一次蛇头的事件,单位毫秒
ticks = pygame.time.get_ticks()
ticks += diff_ticks
#dire = random.randint(0,3) # 假设0、1、2、3分别代表方向左、右、上、下
if snake_x < 5:
dire = 1 # 往右移动
else:
dire = 0 # 往左移动
body_y = snake_y
if dire == 0: # 向左移动
if snake_x + 40 < 400:
body_x = snake_x + 40
else: # 身体不能放右侧了,只能往上下方向放
if snake_y > 200:
body_x = snake_x
body_y -= 40
else:
body_x = snake_x
body_y += 40
else: # 向右移动
if snake_x - 40 > 0:
body_x = snake_x - 40
else: # 身体不能放左侧了,只能往上下方向放
if snake_y > 200:
body_x = snake_x
body_y -= 40
else:
body_x = snake_x
body_y += 40
def set_snake_next_pos(snake_x, snake_y):
if dire == 0:
if snake_x - 40 > 0:
snake_x -= 40
if dire == 1:
if snake_x + 40 < 400:
snake_x += 40
if dire == 2:
if snake_y - 40 > 0:
snake_y -= 40
if dire == 3:
if snake_y + 40 < 400:
snake_y += 40
return snake_x,snake_y
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
if event.type == KEYDOWN:
if event.key == K_LEFT:
if dire!=0 and dire!=1 and snake_x - 40 > 0: # 和当前方向不是同方向或反方向并且可以左移
dire = 0
if event.key == K_RIGHT:
if dire!=0 and dire!=1 and snake_x + 40 < 400: # 和当前方向不是同方向或反方向并且可以右移
dire = 1
if event.key == K_UP:
if dire!=2 and dire!=3 and snake_y - 40 > 0: # 和当前方向不是同方向或反方向并且可以上移
dire = 2
if event.key == K_DOWN:
if dire!=2 and dire!=3 and snake_y + 40 < 400: # 和当前方向不是同方向或反方向并且可以下移
dire = 3
screen.fill((0,0,255)) # 将界面设置为蓝色
for x in range(0,400,40):
pygame.draw.line(screen,(255,255,255),(x,0),(x,400),1)
for y in range(0,400,40):
pygame.draw.line(screen,(255,255,255),(0,y),(400,y),1)
pygame.draw.circle(screen,yellow,[snake_x,snake_y],20,2)
pygame.draw.rect(screen,yellow,[body_x-20,body_y-20,40,40],5)
pygame.draw.circle(screen,yellow,[bean_x,bean_y],10,10)
pygame.display.update() # 必须调用update才能看到绘图显示
if pygame.time.get_ticks() >= ticks:
body_x = snake_x
body_y = snake_y
snake_x,snake_y = set_snake_next_pos(snake_x,snake_y)
ticks += diff_ticks
来源:https://blog.csdn.net/zhangenter/article/details/89044217


猜你喜欢
- 前言今天给大家带来的是Vue 3 中的极致防抖/节流(含常见方式防抖/节流)这篇文章,文章中不仅会讲述原来使用的防抖或节流方式,还会带来新的
- Python工程师面试必备25条Python知识点:1.到底什么是Python?你可以在回答中与其他技术进行对比下面是一些关键点:Pytho
- SQL Server从2005起开始支持xml类型,这个数据类型对于后期的改变非常有用。一对多的关系在后期变成了多对多的关系,XML类型就是
- 本文主要研究的是Python语言实现温度转换的相关实例,具体如下。代码如下:#TempConvert.py val=input("
- python 字符串替换 是python 操作字符串的时候经常会碰到的问题,这里简单介绍下字符串替换方法。python 字符串替换可以用2种
- 很多朋友说JavaScript的decodeURI函数也可以实现,但有bug所有呢,下面看下下面的函数,经过测试使用暂时没什么问题,我在之前
- 简介简介:零代码的22个小游戏集合 作者:Grant Jenks版本:2.4.0安装:D:\>pip install fre
- 由于xlwt目前只支持xls格式,至于xlsx格式,后面会继续更新import xlwtimport codecsdef Txt_to_Ex
- 一维插值插值不同于拟合。插值函数经过样本点,拟合函数一般基于最小二乘法尽量靠近所有样本点穿过。常见插值方法有拉格朗日插值法、分段插值法、样条
- 我们在网页中使用CSS来设置网页、表格和字体大小,一般使用的是网络上较流行的9磅字:<STYLE type=TEXT/CSS
- 介绍此教程为我的数篇文章中的一个重点。主题是魔术方法。 什么是魔术方法?他们是面向对象的Python的一切。他们是可以给你的类增加"
- 目录1. 正则表达式_匹配单个字符2. 正则表达式_匹配多个字符3. 正则表达式_匹配分组小提示:4. 小练习答案:总结1. 正则表达式_匹
- IE6/7/8/9中Table/Select的innerHTML赋值会报错,如下 <!DOCTYPE HTML> <htm
- 程序执行时需要读取两个文件command.txt和ipandpass.txt。格式如下:command.txt:ThreadNum:1por
- 1. 调度器scheduler的作用我们都知道,在Go语言中,程序运行的最小单元是gorouines。然而程序的运行最终都是要交给操作系统来
- 前言前面写过一篇用Python制作PPT的博客,感兴趣的可以参考用Python制作PPT这篇是关于用Python进行数据可视化的,准备作为一
- 我们有时候会批量处理同一个文件夹下的文件,并且希望读取到一个文件里面便于我们计算操作。比方我有下图一系列的txt文件,我该如何把它们写入一个
- 最近在写vue项目,需要由后台传来当前用户对应权限的路由表,前端通过调接口拿到后处理(后端处理路由),就是配置vue动态路由啦。由于错信了一
- 在刚接触C#的时候由于公司使用的就是Oracle数据库,那么C#怎么连接Oracle数据库就成了首要去掌握的知识点了。在那时没有ODP.NE
- 前言许多任务程序如果为其构造为一个命令行界面,就可以通过接受不同的参数来改变它的工作方式。例如,在爬虫程序中,不同 URL&nbs