python---写贪吃蛇

用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)

 


一个简单的贪吃蛇这样就可以了。被这个蛇的移动托了好几天的时间。

不得不说,最简单的未必是不好,往往是越简单越好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值