python实战-贪吃的小蛇

贪吃的小蛇

摘要

Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本,随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Pygame包含图像、声音。
建立在SDL基础上,允许实时电子游戏研发而无需被低级语言束缚。基于这样一个设想,所有需要的游戏功能和理念都(主要是图像方面)都完全简化为游戏逻辑本身,所有的资源结构都可以由Python提供。贪吃的小蛇这款小游戏是基于python开发的一款简单的小游戏。
1.引言
贪吃蛇是我们小时候都玩过的一款小游戏,游戏规则也比较简单易懂,游戏体验也十分轻松,在现在紧张的社会环境中,仍然可以起到很好的放松效果。游戏难度较低,让人们不用投入过多的精力,大脑处于放松的状态。贪吃的小蛇的游戏规则与贪吃蛇的功能类似,但是相对于贪吃蛇更为简单一些,化繁为简,让用户更易上手,同时也减少了游戏时间,在用户觉得无法冷静或者焦虑的时候,玩一局,能够很好的冷静下来,不至于因为冲动作出错误的决定,冷静的过程也有助于大脑更全面思考问题。从这个角度出发,贪吃的小蛇不失为一款解压神器。
2. 系统结构
2.1 代码实现流程图

python实战-贪吃的小蛇_第1张图片

  1. 实现代码
    3.1 初始框架
    简单搭好初始框架

python实战-贪吃的小蛇_第2张图片python实战-贪吃的小蛇_第3张图片
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
  1. 实验

python实战-贪吃的小蛇_第4张图片
撞墙或者咬到自己后,关闭界面提示,游戏结束。
在这里插入图片描述
5. 总结和展望
贪吃的小蛇这个小游戏虽然实现了简洁的理念,但是还是存在许多需要完善的地方,比如启动游戏和结束游戏的窗口提示等等。同时这个小游戏也让我学到了许多Python的知识,提升了个人能力。希望能够在以后的学习中再接再厉。我也感受到了python这门语言功能的强大和简洁。

你可能感兴趣的:(python,pygame,Python,游戏,pygame)