用python做一个贪吃蛇小游戏。
直接上效果
实际效果是下面的
因为是简单的做一个贪吃蛇,并没有做其他的分数显示界面,以及结果的显示,具体效果就是运行程序后,出现上面的界面,然后只有你一动wasd的其中一个键,贪吃蛇便开始运行。
贪吃蛇的主要的功能,一个界面,一个食物的显示,一个蛇的初始化,蛇的运动,死亡的判断。
这里我直接用类来创建贪吃蛇
class Snake:
#定义一个蛇类
def __init__(self):
self.len = 1 #蛇的长度
self.score = 0 #得分
self.sp = [] #保存蛇的序列
self.sp.append(list(divmod(random.randrange(0, 400), 10)))
#随机加入蛇的位置
self.food = list(divmod(random.randrange(0, 400), 10))
#随机加入食物的位置
self.fnum = 1 #食物的数量
self.f = 4 #蛇运动的方向,先为4,无方向
pygame.init() #初始化pygame窗口 self.screen = pygame.display.set_mode((400, 400))
#设置窗口的大小
pygame.display.set_caption('贪吃蛇') #设置窗口名
这里就是先初始化好的需要的数据。
然后接着就是绘制地图的以及绘制食物和蛇:
这里画地图就是还是使用pygame.draw.rect函数,加入食物的位置也用divmod,一个是除数,一个是余数。
判断死亡的函数:
其实可以加个rect,结束的时候,在界面的中间输出game over,不过我这里没做,而是直接关闭窗口,pygame.quit()
蛇的运动:
本来我觉得这个是最难,其实也很简单。
只需要移动的时候,头的位置加上前一个方向的位置,然后结尾再删除一个序列,这样就可以了。
0 = w = 往上,1 = s = 往下,2 = a = 往左,3 = d = 往右
不过本着实验的态度,我连续做了好几种整条蛇的移动,加入好几种移动的方法,但是效果却很不理想,加入过用一个序列来保存转弯的位置和数量,这样再对应蛇的节数。最终还是用了最简单的代码量最少的那种方法,实现出了想要的效果。
def move(self):
if self.f == 0:
self.sp.insert(0,[self.sp[0][0],self.sp[0][1]-1])
self.sp.remove(self.sp[self.len])
elif self.f ==1:
self.sp.insert(0,[self.sp[0][0],self.sp[0][1]+1])
self.sp.remove(self.sp[self.len])
elif self.f ==2:
self.sp.insert(0,[self.sp[0][0]-1,self.sp[0][1]])
self.sp.remove(self.sp[self.len])
elif self.f == 3:
self.sp.insert(0,[self.sp[0][0]+1,self.sp[0][1]])
self.sp.remove(self.sp[self.len])
这里贴下main函数的代码:
def main(self):
while 1:
self.drawmap()
self.addfood()
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
elif event.type == pygame.KEYDOWN:
if self.f ==0 or self.f ==1:
if event.key == pygame.K_a:
self.f = 2
elif event.key == pygame.K_d:
self.f = 3
elif self.f == 2 or self.f ==3:
if event.key == pygame.K_w:
self.f = 0
elif event.key == pygame.K_s:
self.f = 1
else:
if event.key == pygame.K_w:
self.f = 0
elif event.key == pygame.K_s:
self.f = 1
elif event.key == pygame.K_a:
self.f = 2
elif event.key == pygame.K_d:
self.f = 3
self.bf = self.f
self.move()
self.addsnake()
time.sleep(0.3)
if self.sp[0][0] == self.food[0] and self.sp[0][1] == self.food[1]:
if self.f == 0:
self.sp.insert(0, [self.food[0], self.food[1]-1])
elif self.f == 1:
self.sp.insert(0, [self.food[0], self.food[1] + 1])
elif self.f == 2:
self.sp.insert(0, [self.food[0] - 1, self.food[1]])
elif self.f == 3:
self.sp.insert(0, [self.food[0] + 1, self.food[1]])
self.fnum = 0
self.len += 1
print(self.sp)
print(self.sp[0])
self.check()
pygame.display.update()
if __name__ == '__main__':
s = Snake()
s.main()
print(s.len)
一个简单的贪吃蛇这样就可以了。被这个蛇的移动托了好几天的时间。
不得不说,最简单的未必是不好,往往是越简单越好。