小白第二次发博客,可能有很多问题,望指正!
讲的比较简单,不是很详细,提供一个思路。
目录:
- 成果展示
- 代码说明
- 完整代码
- 其他补充和参考资料
——————分割线————————
1.成果展示
最初的:
我扩展后的:(杂乱的点太多,不讲这个)
主要思路:
- 把窗口界面划分为网格,每个格子有横纵坐标(可以理解为x、y或者行、列)
- 主要分为三个部分:蛇头、蛇身和食物,都由一个或多个格子组成
- 蛇头移动时,移动一个格子,而不是一个像素
- 蛇身移动时,删除最后一个蛇身,在最前面插入一个新的蛇身
- 蛇头坐标和食物坐标重合时,不删除最后的蛇身(这样就增加一个蛇身),食物重新随机生成
2.代码说明
扩展的部分就不多说了,拿最根本的部分来讲
(1)初始框架,创建方格类
# 初始框架
import random
from pygame import *
# 基础窗口数值(许多类和方法中用的到,所以设成全局变量)
W = 800
H = 600
ROW = 30
COL = 40
# 基础方格类,用于生成方格
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)
- 创建方格类,后面蛇头,蛇身,食物都是用方格类生成的
- 变量W、H、ROW、COL分别表示窗口的宽、高,方格的行数、列数
- copy方法方便后面插入新的蛇身
(2)创建蛇头类
# 蛇头类
class SnakeHead:
row = int(ROW / 2)
col = int(COL / 2)
head = Point(row=row, col=col)
direct = 'left'
def __init__(self, window):
self.window = window
pass
def head_move(self):
if self.direct == 'left':
self.head.col -= 1
elif self.direct == 'right':
self.head.col += 1
elif self.direct == 'up':
self.head.row -= 1
elif self.direct == 'down':
self.head.row += 1
pass
- 蛇头类有一个方格对象head属性,具有横纵坐标属性,方便后续比较坐标关系
- head_move方法用来实现蛇头的移动
(3)创建蛇身类
# 蛇身类
class SnakeBody:
headBFollow = SnakeHead
body = [
Point(row=headBFollow.head.row, col=headBFollow.head.col + 1),
Point(row=headBFollow.head.row, col=headBFollow.head.col + 2),
Point(row=headBFollow.head.row, col=headBFollow.head.col + 3)
]
def __init__(self, window):
self.window = window
def body_move_i(self):
self.body.insert(0, self.headBFollow.head.copy())
def body_move_o(self):
self.body.pop()
def normal_move(self):
self.body_move_i()
self.body_move_o()
def body_add(self):
self.body_move_i()
# 优化蛇头吃到食物后蛇头消失一下的情况(实际上只是加快了一下,并没有解决)
if self.headBFollow.direct == 'left':
self.headBFollow.head.col -= 1
elif self.headBFollow.direct == 'right':
self.headBFollow.head.col += 1
elif self.headBFollow.direct == 'up':
self.headBFollow.head.row -= 1
elif self.headBFollow.direct == 'down':
self.headBFollow.head.row += 1
- 和蛇头类一样,蛇身类有一个方格对象列表body属性,具有横