Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本,随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Pygame包含图像、声音。
建立在SDL基础上,允许实时电子游戏研发而无需被低级语言束缚。基于这样一个设想,所有需要的游戏功能和理念都(主要是图像方面)都完全简化为游戏逻辑本身,所有的资源结构都可以由Python提供。贪吃的小蛇这款小游戏是基于python开发的一款简单的小游戏。
1.引言
贪吃蛇是我们小时候都玩过的一款小游戏,游戏规则也比较简单易懂,游戏体验也十分轻松,在现在紧张的社会环境中,仍然可以起到很好的放松效果。游戏难度较低,让人们不用投入过多的精力,大脑处于放松的状态。贪吃的小蛇的游戏规则与贪吃蛇的功能类似,但是相对于贪吃蛇更为简单一些,化繁为简,让用户更易上手,同时也减少了游戏时间,在用户觉得无法冷静或者焦虑的时候,玩一局,能够很好的冷静下来,不至于因为冲动作出错误的决定,冷静的过程也有助于大脑更全面思考问题。从这个角度出发,贪吃的小蛇不失为一款解压神器。
2. 系统结构
2.1 代码实现流程图
3.2 绘制场景
3.2.1 利用行列来确定坐标的位置,定义一个point类用来存放坐标
class Point:
row=0
col=0
def __init__(self, row, col):
self.row=row
self.col=col
def copy(self):
return Point(row=self.row, col=self.col)
3.2.2 定义每个小方格的移动,小蛇的移动的位置,食物的位置
def rect(point, color):
cell_width=W/COL # 每个格的宽度
cell_height=H/ROW # 每个格的高度
left=point.col*cell_width
top=point.row*cell_height
pygame.draw.rect(
window, color,(left, top, cell_width, cell_height)
)
pass
3.3.1 定义蛇头
# 背景
pygame.draw.rect(window, bg_color, (0,0,W,H))
# 蛇头
rect(head,head_color)
3.3.2 绘制食物
3.4.1 移动蛇头
# 定义方向 默认左边
direct = 'left'
# 移动
if direct=='left':
head.col-=1
elif direct=='right':
head.col+=1
elif direct=='up':
head.row-=1
elif direct=='down':
head.row+=1
while quit:
# 处理事件
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='up'
elif event.key==274 or event.key==115:
if direct == 'left' or direct == 'right':
direct='down'
elif event.key==276 or event.key==97:
if direct == 'up' or direct == 'down':
direct='left'
elif event.key==275 or event.key==100:
if direct == 'up' or direct == 'down':
direct='right'
3.5.1 绘制蛇的身体
用列表来表示蛇的身体,主要实现两步:1.把原来的头插到前面的格子;2.把原来的尾巴的位置删掉。以此来实现蛇的移动。
#先处理身子,再处理头
#1.把原来的头,插入到snakes的头上
snakes.insert(0, head.copy())
#2.把snakes的最后一个删掉
snakes.pop()
# 定义一个snakes列表
snakes=[
Point(row=head.row, col=head.col+1),
Point(row=head.row, col=head.col+2),
Point(row=head.row, col=head.col+3)
]
3.5.2 随机出现食物
import random
#生成食物
def gen_food():
while 1:
pos=Point(row=random.randint(0,ROW-1), col=random.randint(0,COL-1))
# 是否碰上,默认没有
is_coll = False
# 食物是否跟蛇碰上了,碰上了就重新生成
# 碰上蛇的头
if head.row==pos.row and head.col==pos.col:
is_coll=True
# 碰上蛇的身子
for snake in snakes:
if snake.row==pos.row and snake.col==pos.col:
is_coll=True
break
if not is_coll:
break
return pos
写在游戏循环中:
# 吃东西 头的行和食物的行以及头的列和食物的列重叠,就吃食物
eat=(head.row==food.row and head.col==food.col)
# 重新产生食物
if eat:
food = gen_food()
#处理小蛇身子
#1.把原来的头,插入到snakes的头上
snakes.insert(0, head.copy())
#2.把snakes的最后一个删掉
# 如果没有吃到东西,就删掉最后的一格,如果吃到东西就不删掉
if not eat:
snakes.pop()
3.6.1 检测
蛇是否碰到自己或者是否撞到墙
#检测
dead=False
#1.撞墙
if head.col<0 or head.row<0 or head.col>=COL or head.row>=ROW:
dead=True
#2.撞自己
for snake in snakes:
if head.col==snake.col and head.row==snake.row:
dead=True
break
if dead:
print('游戏结束!')
quit=False
撞墙或者咬到自己后,关闭界面提示,游戏结束。
5. 总结和展望
贪吃的小蛇这个小游戏虽然实现了简洁的理念,但是还是存在许多需要完善的地方,比如启动游戏和结束游戏的窗口提示等等。同时这个小游戏也让我学到了许多Python的知识,提升了个人能力。希望能够在以后的学习中再接再厉。我也感受到了python这门语言功能的强大和简洁。