用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)
一个简单的贪吃蛇这样就可以了。被这个蛇的移动托了好几天的时间。
不得不说,最简单的未必是不好,往往是越简单越好。