Day1
实验要求:
- 实现贪吃蛇游戏基本功能,屏幕上随机出现一个“食物”,称为豆子,
上下左右控制"蛇"的移动,吃到“豆子”以后“蛇" 的身体加长- -点。
“蛇”碰到边界或蛇头与蛇身相撞,蛇死亡,游戏结束。 - 为游戏设计友好的交互界面;例如欢迎界面,游戏界面
- 游戏结束界面。要有开始键、暂停键和停止退出的选项。
- 对蛇吃到豆子进行分值计算,可以设 置游戏速度,游戏音乐
等拓展元素。
相关知识:
Pygame
Pygame是一套用来写游戏的Python模块。 它是基于SDL库而且是免费的,它使你可以用Python语言创建完全界面化的游戏和多媒体程序。Pygame可以运行在几乎所有的平台操作系统上。
安装:
安装时是需要设置python环境变量,下载python的时候底下有个选项(没有默认选中)Add Python 3.7 to PATH需要选择的。如果没有则要自己设置环境变量,具体过程就不再多说,这里有个教程自己可以尝试着设置一下,设置好之后则是Python版本问题,win+R键打开cmd命令框,输入命令python来查看自己的Python版本。
之后便是在官网下载Pygame了,进入官网点击PyPI,输入pygame后面下载即可
附上相关链接:
Pygame安装过程
设置Python环境变量
Python官网
如果官网下载Python太慢,可以选择国内镜像源。附上阿里镜像源官网。
Python下载镜像源
Day2
相关知识:
-
pygame图形绘制
图形绘制就是向屏幕上绘制一些简单的图形,比如矩形、圆形、椭圆形等等。任何一个图形绘
制之后pygame都会用一个Rect类表示该形状。绘制图形pygame使用pygame.draw绘制图形。
不管绘制的是什么图形,pygame模块最后都会用一一个与这个图形四面相切的矩形来表示,用来表
达绘制之后需图形所覆盖的区间范围。pygame.Rect类表达绘制之后图形区域范围, 仅表达矩形范
围。pygame.Rect有四个参数,分别为:矩形左上角的坐标(left,top)以及矩形的宽度width和高
度height。矩形的Rect类有很多属性,每个属性都会返回一个数值。比如size返回Rect的大小,
width矩形的宽度,height矩形的高度等等。 Rect类还提供 了许多方法类操纵这个矩形区域,比
如:.copy()用来拷贝生成一个新的矩形、.move()用来移动矩形等等。 -
框架绘制
在此项目中,我们需要pygame.drew来绘制图形框架,调用pygame.drew.rect来绘制一个矩形。
其中第一个参数是在哪里画,参数二是背景颜色(这里的颜色要用十进制表示,,可以容纳多个颜色),参数三是填充背景颜色范围。
显示结果如下:
-
场景绘制
1.设置格子行和列
先设置这个格子的行和列,行决定了它的纵向,列决定了它的横向,现在我们就得到了每个格子有多大比如:宽度=总宽度(width) ,这里我弄一个Point对象, 让每一个点是让行和列组成的
2.蛇身,蛇头,食物绘制
注意:食物是随机生成的且不能在蛇里面。所以我们需要定义一个函数来解决。
其次是颜色
最后我初始化蛇只有一个头部以及坐标定在中间
# 蛇头坐标定在中间
head = Point(row=int(ROW / 2), col=int(COL / 2))
# 初始化蛇身的元素数量为0
snake = [
]
- 移动方向及判断
这里我们需要用到event.get()函数来监听鼠标与键盘事件,来实现当用户按下方向键后执行下一步操作。
刚开始蛇的默认移动方向
首先我们要考虑一个问题,就是在程序执行过程中如果按下与当前蛇移动方向相反的键或者其他方向键,蛇会执行这个方向的操作。比如说蛇向上移动,用户按下一个往下的键之后,蛇会直接往下移动了。这里蛇不可以直接上下左右,得判断当前是在什么状态下前行的
这里我用了一个嵌套的IF条件语句来控制蛇的移动方向
其中273,119等都是方向键所对应的编码。有了这段代码之后,就不会出现蛇立即执行与当前方向相反的反向移动了
其次是移动问题,当按下方向键移动后,蛇的头部所在行列数就会发生变化
- 事件处理
吃东西:
当蛇的头部与食物重合后也就是指当蛇吃东西后,他的尾部会增加一个。这个就是贪吃蛇游戏的核心。我们要做出一个判断,就是当蛇吃到食物和没吃到食物时候分别该怎么样。这里用简单的IF语句就可以实现。
eat = (head.row == snakeFood.row and head.col == snakeFood.col)
# 处理蛇的身子
if eat:
snakeFood = Point(row=random.randint(0, ROW - 1), col=random.randint(0, COL - 1))
snake.insert(0, head.copy()) # 把原来的头插入到当前snake的头上
if not eat:
snake.pop() #把最后一个snake删掉尾部消失,因为头往前了一格
结束判断:
除此之外,我们还要考虑当蛇撞到墙壁和头部碰到自己身体后的情况。当蛇撞到墙壁和头部碰到自己身体后,结束游戏
dead = False
if head.col < 0 or head.row < 0 or head.col >= COL or head.row >= ROW:
dead = True
#撞到自己
for body in snake:
if head.col == body.col and head.row == body.row:
dead = True
break
-结果
- 最后
由衷地感谢社区上各位大佬,看了他们的博客以及相关指导,我学到了很多东西。
博客制作不易
respect
代码:
import pygame
from sys import exit
import random
import time
#设置格子的行和列
class Point():
row = 0
col = 0
def __init__(self, row, col):
self.row = row
self.col = col
#创建一个新point,方便复制
def copy(self):
return Point(row=self.row, col=self.col)
# 初始化
pygame.init()
width = 1000
hight = 600
#设置游戏背景音乐
pygame.mixer.init()
pygame.mixer.music.load("2.mp3")
pygame.mixer.music.play()
#设置行数列数
ROW = 30
COL = 40
direct = 'left' #刚开始蛇的移动方向
window = pygame.display.set_mode((width, hight))#创建一个名为window的窗口
pygame.display.set_caption('贪吃蛇游戏') #设置当前窗口标题
# 蛇头坐标定在中间
head = Point(row=int(ROW / 2), col=int(COL / 2))
# 初始化蛇身的元素数量为0
snake = [ ]
# random随机生成食物并且不让食物生成在蛇的身体里面
def gen_food():
while 1:
position = Point(row=random.randint(0, ROW - 1), col=random.randint(0, COL - 1))
is_coll = False
if head.row == position.row and head.col == position.col:
is_coll = True
for body in snake:
if body.row == position.row and body.col == position.col:
is_coll = True
break
if not is_coll: #取反,条件为if True
break
return position
# 定义坐标
# 蛇头颜色可以自定义
head_color = (4772300)
# 食物坐标
snakeFood = gen_food()
# 食物颜色
snakeFood_color = (255,255,0)
#尾巴颜色
snake_color = (11591910)
# 需要执行很多步画图操作 所以定义一个函数
def rect(point, color):
# 定位 画图需要left和top
left = point.col * width / COL #左间距为列数*格子宽度
top = point.row * hight / ROW #上间距为行数*格子高度
# 将方块涂色
pygame.draw.rect(window, color, (left, top, width / COL, hight / ROW))
quit = True
# 设置帧频率
clock = pygame.time.Clock()
while quit:
# 处理帧频 锁帧
clock.tick(8)
# pygame.event.get()监听鼠标与键盘事件,可以同时发生很多事件
for event in pygame.event.get():
if event.type == pygame.QUIT: #判断用户是否点击了关闭按钮
quit = False
elif event.type == pygame.KEYDOWN: #判断用户是否按下键盘
# 这里蛇不可以直接左右上下 要判断当前是在什么状态下前行
if event.key == 273 or event.key == 119:
if direct == 'left' or direct == 'right':
direct = 'top'
if event.key == 274 or event.key == 115:
if direct == 'left' or direct == 'right':
direct = 'bottom'
if event.key == 276 or event.key == 97:
if direct == 'top' or direct == 'bottom':
direct = 'left'
if event.key == 275 or event.key == 100:
if direct == 'top' or direct == 'bottom':
direct = 'right'
# 吃东西
eat = (head.row == snakeFood.row and head.col == snakeFood.col)
# 处理蛇的身子
if eat:
snakeFood = Point(row=random.randint(0, ROW - 1), col=random.randint(0, COL - 1)) #食物重新生成
snake.insert(0, head.copy()) # 把原来的头插入到snake的头上
if not eat:
snake.pop() #把最后一个snake删掉尾部消失,因为头往前了一格
# 移动判断
if direct == 'left':
head.col -= 1
if direct == 'right':
head.col += 1
if direct == 'top':
head.row -= 1
if direct == 'bottom':
head.row += 1
#结束判断
dead = False
#撞到墙壁
if head.col < 0 or head.row < 0 or head.col >= COL or head.row >= ROW:
head = Point(row=int(ROW/2), col=int(COL/2))
#撞到自己
for body in snake:
if head.col == body.col and head.row == body.row:
dead = True
break
if dead:
print('Game Over')
quit = False
# 背景画图,背景颜色以及颜色填充范围
pygame.draw.rect(window, (245,135,155), (0, 0, width, hight))
# 蛇头
rect(head, head_color)
# 绘制食物
rect(snakeFood, snakeFood_color)
# 绘制蛇的身子
for body in snake:
rect(body, snake_color)
# 让最近绘制的屏幕可见
pygame.display.flip()
补充:
给游戏加上了背景音乐。代码如下:
pygame.mixer.init()
pygame.mixer.music.load("2.mp3")# 加载音乐
pygame.mixer.music.play() #播放音乐
PS:需要将音源放在跟.py文件同一文件夹里