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 相关文章推荐
python3+PyQt5实现文档打印功能
Apr 24 Python
python数字图像处理之骨架提取与分水岭算法
Apr 27 Python
python实现C4.5决策树算法
Aug 29 Python
python爬虫之自动登录与验证码识别
Jun 15 Python
django解决跨域请求的问题
Nov 11 Python
在python中pandas读文件,有中文字符的方法
Dec 12 Python
100行Python代码实现每天不同时间段定时给女友发消息
Sep 27 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
Apr 30 Python
python3访问字典里的值实例方法
Nov 18 Python
django 认证类配置实现
Nov 11 Python
python机器学习Github已达8.9Kstars模型解释器LIME
Nov 23 Python
移除Selenium中window.navigator.webdriver值
Jun 10 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
PHP文件上传原理简单分析
2011/05/29 PHP
[原创]php简单防盗链验证实现方法
2016/07/09 PHP
$.ajax返回的JSON无法执行success的解决方法
2011/09/09 Javascript
jquery创建并行对象或者合并对象的实现代码
2012/10/10 Javascript
动态的改变IFrame的高度实现IFrame自动伸展适应高度
2012/12/28 Javascript
JavaScript Math.round() 方法
2015/12/18 Javascript
移动web开发之touch事件实例详解
2018/01/17 Javascript
详解vue+vuex+koa2开发环境搭建及示例开发
2018/01/22 Javascript
vue.js通过路由实现经典的三栏布局实例代码
2018/07/08 Javascript
vue富文本框(插入文本、图片、视频)的使用及问题小结
2018/08/17 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
HTML+JavaScript实现扫雷小游戏
2019/09/30 Javascript
vue点击Dashboard不同内容 跳转到同一表格的实例
2020/11/13 Javascript
nodejs中使用worker_threads来创建新的线程的方法
2021/01/22 NodeJs
python通过正则查找微博@(at)用户的方法
2015/03/13 Python
Python合并字典键值并去除重复元素的实例
2016/12/18 Python
Python读取sqlite数据库文件的方法分析
2017/08/07 Python
用 Python 连接 MySQL 的几种方式详解
2018/04/04 Python
Tensorflow实现神经网络拟合线性回归
2019/07/19 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
2020/06/15 Python
中国海淘族值得信赖的海淘返利网站:55海淘
2017/01/16 全球购物
美国转售二手商品的电子商务平台:BLINQ
2018/12/13 全球购物
Zavvi西班牙:电子游戏、极客服装、Blu-ray、Funko Pop等
2019/05/03 全球购物
美国围栏公司:Walpole Outdoors
2019/11/19 全球购物
描述RIP和OSPF区别以及特点
2015/01/17 面试题
软件测试英文面试题
2012/10/14 面试题
技术总监岗位职责
2013/12/05 职场文书
小学爱国卫生月活动总结
2014/06/30 职场文书
民主生活会对照检查材料思想汇报
2014/09/27 职场文书
寒假社会实践个人总结
2015/03/06 职场文书
心理健康教育培训研修感言
2015/11/18 职场文书
幼儿园开学家长寄语(2016春季)
2015/12/03 职场文书
八年级英语教学反思
2016/02/15 职场文书
《实心球》教学反思
2016/02/23 职场文书
PyQt5实现多张图片显示并滚动
2021/06/11 Python
javascript对象3个属性特征
2021/11/17 Javascript