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中用于返回绝对值的abs()方法
May 14 Python
Python3编程实现获取阿里云ECS实例及监控的方法
Aug 18 Python
python3写的简单本地文件上传服务器实例
Jun 04 Python
django配置连接数据库及原生sql语句的使用方法
Mar 03 Python
python使用mitmproxy抓取浏览器请求的方法
Jul 02 Python
python urllib爬虫模块使用解析
Sep 05 Python
python中图像通道分离与合并实例
Jan 17 Python
Python关于反射的实例代码分享
Feb 20 Python
Python过滤掉numpy.array中非nan数据实例
Jun 08 Python
Django中F函数的使用示例代码详解
Jul 06 Python
python 动态绘制爱心的示例
Sep 27 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
Nov 02 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源码之 ext/mysql扩展部分
2009/07/17 PHP
使用PHP强制下载PDF文件示例
2014/01/17 PHP
Yii框架引入coreseek分页功能示例
2019/02/08 PHP
javascript编程起步(第一课)
2007/01/10 Javascript
js 数组克隆方法 小结
2010/03/20 Javascript
JavaScript prototype属性使用说明
2010/05/13 Javascript
jquery 结合C#后台的数组对文章的关键字自动添加链接的代码
2011/07/15 Javascript
jquery创建一个新的节点对象(自定义结构/内容)的好方法
2013/01/21 Javascript
运行Node.js的IIS扩展iisnode安装配置笔记
2015/03/02 Javascript
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
对JavaScript客户端应用编程的一些建议
2015/06/24 Javascript
AngularJS 2.0新特性有哪些
2016/02/18 Javascript
使用jquery.form.js实现图片上传的方法
2016/05/05 Javascript
noty ? jQuery通知插件全面解析
2016/05/18 Javascript
AngularJS入门教程之双向绑定详解
2016/08/18 Javascript
javascript中闭包概念与用法深入理解
2016/12/15 Javascript
Bootstrap的popover(弹出框)在append后弹不出(失效)
2017/02/27 Javascript
使用JS中的Replace()方法遇到的问题小结
2017/10/20 Javascript
深入浅析js原型链和vue构造函数
2018/10/25 Javascript
vue router导航守卫(router.beforeEach())的使用详解
2019/04/19 Javascript
JS拖动选择table里的单元格完整实例【基于jQuery】
2019/05/28 jQuery
jquery.pager.js实现分页效果
2019/07/29 jQuery
Vue实现点击按钮复制文本内容的例子
2019/11/09 Javascript
[41:08]2014 DOTA2国际邀请赛中国区预选赛 HGT VS NE
2014/05/22 DOTA
对Python 文件夹遍历和文件查找的实例讲解
2018/04/26 Python
python批量读取文件名并写入txt文件中
2020/09/05 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
2019/11/11 Python
使用python实现时间序列白噪声检验方式
2020/06/03 Python
为什么python比较流行
2020/06/19 Python
Django rest framework分页接口实现原理解析
2020/08/21 Python
Wilson体育用品官网:美国著名运动器材品牌
2019/05/12 全球购物
Java的基础面试题附答案
2016/01/10 面试题
《金钱的魔力》教学反思
2014/02/24 职场文书
年会搞笑主持词串词
2014/03/24 职场文书
防灾减灾宣传标语
2014/10/07 职场文书
教你修复 Win11应用商店加载空白问题
2021/12/06 数码科技