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类继承用法实例分析
Oct 10 Python
python获取本机外网ip的方法
Apr 15 Python
python学习 流程控制语句详解
Jun 01 Python
python 剪切移动文件的实现代码
Aug 02 Python
django Serializer序列化使用方法详解
Oct 16 Python
Python之时间和日期使用小结
Feb 14 Python
Python两个字典键同值相加的几种方法
Mar 05 Python
PyQt QListWidget修改列表项item的行高方法
Jun 20 Python
简单了解Python matplotlib线的属性
Jun 29 Python
python简单区块链模拟详解
Jul 03 Python
django中使用POST方法获取POST数据
Aug 20 Python
python实现的分析并统计nginx日志数据功能示例
Dec 21 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
使用Apache的rewrite技术
2006/06/22 PHP
PHP+MySQL5.0中文乱码解决方法
2006/11/20 PHP
《PHP编程最快明白》第六讲:Mysql数据库操作
2010/11/01 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
2014/12/17 PHP
使用PHP生成PDF方法详解
2015/01/23 PHP
PHP中Socket连接及读写数据超时问题分析
2016/07/19 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
2017/11/06 PHP
php+redis实现消息队列功能示例
2019/09/19 PHP
关于可运行代码无法正常执行的使用说明
2010/05/13 Javascript
javascript如何创建表格(javascript绘制表格的二种方法)
2013/12/10 Javascript
js的延迟执行问题分析
2014/06/23 Javascript
jQuery html()方法使用不了无法显示内容的问题
2014/08/06 Javascript
PHP使用方法重载实现动态创建属性的get和set方法
2014/11/17 Javascript
javacript使用break内层跳出外层循环分析
2015/01/12 Javascript
NodeJS创建基础应用并应用模板引擎
2016/04/12 NodeJs
JS实现星星评分功能实例代码(两种方法)
2016/06/09 Javascript
javascript常用经典算法详解
2017/01/11 Javascript
详解Javascript百度地图接口开发文档中的类和方法
2017/02/07 Javascript
小程序实现订单倒计时功能
2019/04/23 Javascript
Vue中axios的封装(报错、鉴权、跳转、拦截、提示)
2019/08/20 Javascript
Vue插件之滑动验证码
2019/09/21 Javascript
python使用电子邮件模块smtplib的方法
2016/08/28 Python
使用Python对SQLite数据库操作
2017/04/06 Python
详解Django解决ajax跨域访问问题
2018/08/24 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
2019/11/15 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
2020/06/05 Python
Django通过设置CORS解决跨域问题
2020/11/26 Python
太阳镜仓库,售价20美元或更少:Sunglass Warehouse
2016/09/28 全球购物
软件缺陷的分类都有哪些
2014/08/22 面试题
Java面试题:说出如下代码的执行结果
2015/10/30 面试题
草船借箭教学反思
2014/02/03 职场文书
离职证明范本(5篇)
2014/09/19 职场文书
2014年科室工作总结范文
2014/12/19 职场文书
财产保全担保书
2015/01/20 职场文书
实名检举信范文
2015/03/02 职场文书
创业计划书详解
2019/07/19 职场文书