前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python---贪吃蛇

python---贪吃蛇

作者头像
sjw1998
发布2019-09-28 12:45:13
6160
发布2019-09-28 12:45:13
举报
文章被收录于专栏:孤独的S孤独的S

用python做一个贪吃蛇小游戏。


直接上效果

实际效果是下面的

因为是简单的做一个贪吃蛇,并没有做其他的分数显示界面,以及结果的显示,具体效果就是运行程序后,出现上面的界面,然后只有你一动wasd的其中一个键,贪吃蛇便开始运行。

贪吃蛇的主要的功能,一个界面,一个食物的显示,一个蛇的初始化,蛇的运动,死亡的判断。

这里我直接用类来创建贪吃蛇

代码语言:javascript
复制
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 = 往右

不过本着实验的态度,我连续做了好几种整条蛇的移动,加入好几种移动的方法,但是效果却很不理想,加入过用一个序列来保存转弯的位置和数量,这样再对应蛇的节数。最终还是用了最简单的代码量最少的那种方法,实现出了想要的效果。

代码语言:javascript
复制
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函数的代码:

代码语言:javascript
复制
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)

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 孤独的S 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档