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 字符串split的用法分享
Mar 23 Python
Python中Class类用法实例分析
Nov 12 Python
简述Python中的进程、线程、协程
Mar 18 Python
Python实现运行其他程序的四种方式实例分析
Aug 17 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
Aug 01 Python
python进行TCP端口扫描的实现
Dec 21 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
Dec 30 Python
python实现连续变量最优分箱详解--CART算法
Nov 22 Python
浅谈keras2 predict和fit_generator的坑
Jun 17 Python
为什么python比较流行
Jun 19 Python
Python实时监控网站浏览记录实现过程详解
Jul 14 Python
详解Python中@staticmethod和@classmethod区别及使用示例代码
Dec 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
PHP中获取文件扩展名的N种方法小结
2012/02/27 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
onpropertypchange
2006/07/01 Javascript
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
类似GMAIL的Ajax信息反馈显示
2010/02/16 Javascript
8个实用的jQuery技巧
2014/03/04 Javascript
node.js中的url.parse方法使用说明
2014/12/10 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
2015/06/11 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
星期几的不同脚本写法(推荐)
2016/06/01 Javascript
浅谈jQuery为哪般去掉了浏览器检测
2016/08/29 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
2017/01/22 Javascript
微信小程序 setData使用方法及常用错误解决办法
2017/05/11 Javascript
使用vs code开发Nodejs程序的使用方法
2017/09/21 NodeJs
深入浅出webpack之externals的使用
2017/12/04 Javascript
webpack4.x开发环境配置详解
2018/08/04 Javascript
JS 验证码功能的三种实现方式
2018/11/26 Javascript
微信小程序事件对象中e.target和e.currentTarget的区别详解
2019/05/08 Javascript
Vue利用Blob下载原生二进制数组文件
2019/09/25 Javascript
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
Element InfiniteScroll无限滚动的具体使用方法
2020/07/27 Javascript
深入理解Python中的元类(metaclass)
2015/02/14 Python
在Python中使用PIL模块对图片进行高斯模糊处理的教程
2015/05/05 Python
Linux下为不同版本python安装第三方库
2016/08/31 Python
使用python3实现操作串口详解
2019/01/01 Python
python整合ffmpeg实现视频文件的批量转换
2019/05/31 Python
Python lambda表达式filter、map、reduce函数用法解析
2019/09/11 Python
Python unittest基本使用方法代码实例
2020/06/29 Python
中国最大隐形眼镜网上商城:视客眼镜网
2016/10/30 全球购物
Under Armour澳大利亚官网:美国知名的高端功能性运动品牌
2018/02/22 全球购物
七匹狼男装广告词
2014/03/21 职场文书
公司年底活动方案
2014/08/17 职场文书
公司收款委托书范本
2014/09/20 职场文书
退学证明范本3篇
2014/10/29 职场文书
党员转正党支部意见
2015/06/02 职场文书
详解Python中*args和**kwargs的使用
2022/04/07 Python