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处理PDF的方法
Nov 10 Python
python3+PyQt5重新实现自定义数据拖放处理
Apr 19 Python
python使用xlrd和xlwt读写Excel文件的实例代码
Sep 05 Python
Python文件循环写入行时防止覆盖的解决方法
Nov 09 Python
Python实现的矩阵转置与矩阵相乘运算示例
Mar 26 Python
python代理工具mitmproxy使用指南
Jul 04 Python
在python 中split()使用多符号分割的例子
Jul 15 Python
pygame实现五子棋游戏
Oct 29 Python
Python延迟绑定问题原理及解决方案
Aug 04 Python
python 实现客户端与服务端的通信
Dec 23 Python
举例讲解Python装饰器
Dec 24 Python
Python读取ini配置文件传参的简单示例
Jan 05 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 GUID生成函数和类
2014/03/10 PHP
实用的JS正则表达式(手机号码/IP正则/邮编正则/电话等)
2013/01/11 Javascript
jquery设置控件位置的方法
2013/08/21 Javascript
jquery ajax中使用jsonp的限制解决方法
2013/11/22 Javascript
javascript if条件判断方法小结
2014/05/17 Javascript
javascript消除window.close()的提示窗口
2015/05/20 Javascript
JS实现具备延时功能的滑动门菜单效果
2015/09/17 Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
2016/10/26 Javascript
JavaScript基本类型值-Undefined、Null、Boolean
2017/02/23 Javascript
微信小程序 后台登录(非微信账号)实例详解
2017/03/31 Javascript
完美解决linux下node.js全局模块找不到的情况
2018/05/16 Javascript
浅谈vue 单文件探索
2018/09/05 Javascript
vue双向绑定及观察者模式详解
2019/03/19 Javascript
koa-router路由参数和前端路由的结合详解
2019/05/19 Javascript
Python版的文曲星猜数字游戏代码
2013/09/02 Python
python获取当前运行函数名称的方法实例代码
2017/04/06 Python
python中lambda()的用法
2017/11/16 Python
Python模拟简单电梯调度算法示例
2018/08/20 Python
Python解析、提取url关键字的实例详解
2018/12/17 Python
Python实现串口通信(pyserial)过程解析
2019/09/25 Python
Python基于time模块表示时间常用方法
2020/06/18 Python
django haystack实现全文检索的示例代码
2020/06/24 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
python向xls写入数据(包括合并,边框,对齐,列宽)
2021/02/02 Python
html5中去掉input type date默认样式的方法
2018/09/06 HTML / CSS
HTML5 Canvas 起步(1) - 基本概念
2009/05/12 HTML / CSS
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
详解如何在登录过期后跳出Ifram框架
2020/09/10 HTML / CSS
世界上最大的在线旅行社新加坡网站:Expedia新加坡
2016/08/25 全球购物
物业管理公司实习生自我鉴定
2013/09/19 职场文书
银行实习人员自我鉴定
2013/09/22 职场文书
理货员的岗位职责
2013/11/23 职场文书
自主招生推荐信范文
2014/05/10 职场文书
政风行风建设责任书
2014/07/23 职场文书
三关爱志愿服务活动方案
2014/08/17 职场文书
新党章心得体会
2014/09/04 职场文书