写在开始
萌新的第一份博客,希望能通过这样的形式记录下自己的成长吧。废话不多说,下面进入正题。
项目描述
贪吃蛇游戏:
1.一款终端控制游戏,通过四个方向键wsad控制蛇的移动,蛇头和食物重叠后,发生吞食,蛇的长度变长,在其他位置生成新的食物。
2.蛇头和边框,或身体的任意部分碰触,游戏结束
3.随着分数的提高,蛇的移动速度逐渐加快
框架
在着手实现代码之前先把框架理清楚

代码实现
构造地图
要写一个贪吃蛇出来,其实实现的功能说少也不算少,总之先从简单的来,一步一步实现吧,先把小蛇的舞台给它搭好。
# 假设游戏区域是24x24的方块矩阵,则每个方块(像素)拥有一个坐标
# 先建一个坐标类,用这个类创建的对象就是一个像素了
class Point:
def __init__(self, x=0, y=0):
self.__x = x # 行
self.__y = y # 列
# property属性
@property
def x(self):
return self.__x
@x.setter
def x(self, value):
self.__x = value
@property
def y(self):
return self.__y
@y.setter
def y(self, value):
self.__y = value
这里我用了property属性,主要是为了练习一下。x,y直接设为公有属性这里应该也无伤大雅。
有了像素接下来就是用位置信息一点点把围墙造出来了,这里建的就是一个普通的正方形围墙。
# 创建围墙
class Wall:
def __init__(self):
# 创建一个空列表用来存放像素对象
self.__position = []
size = 24 # 设置size为24 即24*24的分辨率
# 利用for循环将围墙的像素对象存进列表
for i in range(0, size):
# 第一列和最后一列
self.__position.append(Point(0, i)) # Point即之前创建的坐标类(像素点)
self.__position.append(Point(size-1, i))
# 第一行和最后一行
if i != 0 and i != size-1: # 防止四个角的冲突(其实不加影响也不大)
self.__position.append(Point(i, 0))
self.__position.append(Point(i, size-1))
# 设置一个返回围墙位置信息的方法
def get_position(self):
return self.__position
有了围墙的信息,接下来就是让它显示在屏幕上了。再创建一个显示模块。
class Display:
@staticmethod
def display(wall_list): # 传入的参数就是墙的像素点的位置信息(列表)
size = 24 # 分辨率24*24
s = ""
for x in range(0, size):
for y in range(0, size):
for i in wall_list:
if x == i.x and y == i.y: # 判断当前坐标的点是否在列表里(是否被占用)
temp = True
break
else:
temp = False
if temp:
s += " o" # 存在则这个点的内容就是“ o”
else:
s += " " # 否则就是“ ”
s += "\n"
print(s)
试试效果
wall = Wall()
Display.display(wall.get_position())

需要补充的一点就是,最后display模块每次打印之前需要先清一次屏,这里我没有写上以免混淆。最后的完整代码会加上
创建小蛇
跟造围墙同样的思路,总之先不考虑小蛇的功能先把它的身体造出来
class Snake:
def __init__(self):
self.__position = [] # 存储位置信息
self.__position.append(Point(1, 2)) # 两个初始位置
self.__position.append(Point(1, 1))
self.speed = 1.6 # 移动速度
self.__toward = "d" # 移动方向 开始时默认向右走
@property
def toward(self):

最低0.47元/天 解锁文章
207

被折叠的 条评论
为什么被折叠?



