Python写的贪吃蛇游戏例子


Posted in Python onJune 16, 2014

第一次用Python写这种比较实用且好玩的东西,权当练手吧

游戏说明:

* P键控制“暂停/开始”
* 方向键控制贪吃蛇的方向

源代码如下:

from Tkinter import *
import tkMessageBox,sys
from random import randint
class Grid(object):
    def __init__(self,master=None,window_width=800,window_height=600,grid_width=50,offset=10):
        self.height = window_height
        self.width = window_width
        self.grid_width = grid_width
        self.offset = offset
        self.grid_x = self.width/self.grid_width
        self.grid_y = self.height/self.grid_width
        self.bg = "#EBEBEB"
        self.canvas = Canvas(master, width=self.width+2*self.offset, height=self.height+2*self.offset, bg=self.bg)
        self.canvas.pack()
        self.grid_list()
    def draw(self, pos, color,):
        x = pos[0]*self.grid_width + self.offset
        y = pos[1]*self.grid_width + self.offset
        self.canvas.create_rectangle(x, y, x+self.grid_width, y+self.grid_width,fill=color,outline=self.bg)
    def grid_list(self):
        grid_list = []
        for y in range(0,self.grid_y):
            for x in range(0,self.grid_x):
                grid_list.append((x,y))
        self.grid_list = grid_list
class Food(object):
    def __init__(self, Grid):
        self.grid = Grid
        self.color = "#23D978"        
        self.set_pos()
    def set_pos(self):
        x = randint(0,self.grid.grid_x - 1)
        y = randint(0,self.grid.grid_y - 1)
        self.pos =  (x, y)    
    def display(self):
        self.grid.draw(self.pos,self.color)
class Snake(object):
    def __init__(self, Grid):
        self.grid = Grid
        self.body = [(10,6),(10,7),(10,8)]
        self.direction = "Up"
        self.status = ['run','stop']
        self.speed = 300
        self.color = "#5FA8D9"        
        self.food = Food(self.grid)
        self.display_food()
        self.gameover = False
        self.score = 0
    def available_grid(self):
        return [i for i in self.grid.grid_list if i not in self.body[2:]]
    def change_direction(self, direction):
        self.direction = direction
    def display(self):
        for (x,y) in self.body:
            self.grid.draw((x,y),self.color)
    def display_food(self):
        while(self.food.pos in self.body):
            self.food.set_pos()
        self.food.display()
    def move(self):
        head = self.body[0]
        if self.direction == 'Up':
            new = (head[0], head[1]-1)
        elif self.direction == 'Down':
            new = (head[0], head[1]+1)
        elif self.direction == 'Left':
            new = (head[0]-1,head[1])
        else:
            new = (head[0]+1,head[1])
        if not self.food.pos == head:         
            pop = self.body.pop()
            self.grid.draw(pop,self.grid.bg)
        else:
            self.display_food()
            self.score += 1
        self.body.insert(0,new)      
        if not new in self.available_grid():
            self.status.reverse()            
            self.gameover = True
        else:
            self.grid.draw(new,color=self.color)
class SnakeGame(Frame):
    def __init__(self,master=None, *args, **kwargs):
        Frame.__init__(self, master)
        self.master = master
        self.grid = Grid(master=master,*args, **kwargs)
        self.snake = Snake(self.grid)
        self.bind_all("", self.key_release)
        self.snake.display()
    def run(self):
        if not self.snake.status[0] == 'stop':
            self.snake.move()
        if self.snake.gameover == True:
            message =  tkMessageBox.showinfo("Game Over", "your score: %d" % self.snake.score)
            if message == 'ok':
                sys.exit()
        self.after(self.snake.speed,self.run)
    def key_release(self, event):
        key = event.keysym
        key_dict = {"Up":"Down","Down":"Up","Left":"Right","Right":"Left"}
        if key_dict.has_key(key) and not key == key_dict[self.snake.direction]:
            self.snake.change_direction(key)
            self.snake.move()
        elif key == 'p':
            self.snake.status.reverse()
if __name__ == '__main__':
    root = Tk()
    snakegame = SnakeGame(root)
    snakegame.run()
    snakegame.mainloop()
Python 相关文章推荐
Python二维码生成库qrcode安装和使用示例
Dec 16 Python
理解python正则表达式
Jan 15 Python
使用apidoc管理RESTful风格Flask项目接口文档方法
Feb 07 Python
python实现自动获取IP并发送到邮箱
Dec 26 Python
Python matplotlib画图与中文设置操作实例分析
Apr 23 Python
python全栈知识点总结
Jul 01 Python
对python 中re.sub,replace(),strip()的区别详解
Jul 22 Python
Python pandas库中的isnull()详解
Dec 26 Python
PyTorch实现更新部分网络,其他不更新
Dec 31 Python
python如何变换环境
Jul 21 Python
python 如何停止一个死循环的线程
Nov 24 Python
DRF使用simple JWT身份验证的实现
Jan 14 Python
Python中的yield浅析
Jun 16 #Python
python中使用enumerate函数遍历元素实例
Jun 16 #Python
Python中字典(dict)和列表(list)的排序方法实例
Jun 16 #Python
Python实现的几个常用排序算法实例
Jun 16 #Python
Python中文件遍历的两种方法
Jun 16 #Python
Python里隐藏的“禅”
Jun 16 #Python
Python程序设计入门(5)类的使用简介
Jun 16 #Python
You might like
《雄兵连》《烈阳天道》真的来了
2020/07/13 国漫
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
Bootstrap+PHP实现多图上传功能实例详解
2018/04/08 PHP
JQuery1.6 使用方法三
2011/11/23 Javascript
javascript学习笔记(十七) 检测浏览器插件代码
2012/06/20 Javascript
JS画线(实例代码)
2013/11/20 Javascript
提升PHP安全:8个必须修改的PHP默认配置
2014/11/17 Javascript
基于canvas实现的绚丽圆圈效果完整实例
2016/01/26 Javascript
JavaScript常用本地对象小结
2016/03/28 Javascript
js+html5实现canvas绘制网页时钟的方法
2016/05/21 Javascript
Ionic默认的Tabs模板使用实例
2016/08/29 Javascript
JS中Select下拉列表类(支持输入模糊查询)功能
2017/01/17 Javascript
jQuery is not defined 错误原因与解决方法小结
2017/03/19 Javascript
node.js中http模块和url模块的简单介绍
2017/10/06 Javascript
jQuery 同时获取多个标签的指定内容并储存为数组
2018/11/20 jQuery
javascript中join方法实例讲解
2019/02/21 Javascript
echarts饼图各个板块之间的空隙如何实现
2020/12/01 Javascript
Python中使用动态变量名的方法
2014/05/06 Python
Python调用C语言开发的共享库方法实例
2015/03/18 Python
在Python中用has_key()方法查找键是否存在的教程
2015/05/21 Python
在win和Linux系统中python命令行运行的不同
2016/07/03 Python
Python 递归函数详解及实例
2016/12/27 Python
小米5s微信跳一跳小程序python源码
2018/01/08 Python
python爬虫爬取网页表格数据
2018/03/07 Python
python利用ffmpeg进行录制屏幕的方法
2019/01/10 Python
Python简单基础小程序的实例代码
2019/04/28 Python
python 批量修改 labelImg 生成的xml文件的方法
2019/09/09 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
2021/02/26 Python
20世纪40年代连衣裙和复古服装:The Seamstress Of Bloomsbury
2018/07/24 全球购物
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
保证书范文大全
2014/04/28 职场文书
爱国演讲稿400字
2014/05/07 职场文书
业务员岗位职责范本
2015/04/03 职场文书
各类场合主持词开场白范文集锦
2019/08/16 职场文书
2019年自助餐厅创业计划书模板
2019/08/22 职场文书
PostgreSQL自动更新时间戳实例代码
2021/11/27 PostgreSQL