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中使用异步Socket编程性能测试
Jun 25 Python
Python中Collection的使用小技巧
Aug 18 Python
Python读写配置文件的方法
Jun 03 Python
一些常用的Python爬虫技巧汇总
Sep 28 Python
Python 正则表达式入门(中级篇)
Dec 07 Python
基于python的七种经典排序算法(推荐)
Dec 08 Python
Python json 错误xx is not JSON serializable解决办法
Mar 15 Python
python3实现SMTP发送邮件详细教程
Jun 19 Python
Python实现直方图均衡基本原理解析
Aug 08 Python
django3.02模板中的超链接配置实例代码
Feb 04 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
Jul 13 Python
python中用Scrapy实现定时爬虫的实例讲解
Jan 18 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
phpBB BBcode处理的漏洞
2006/10/09 PHP
WML,Apache,和 PHP 的介绍
2006/10/09 PHP
Laravle eloquent 多对多模型关联实例详解
2017/11/22 PHP
讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
2007/04/12 Javascript
3分钟写出来的Jquery版checkbox全选反选功能
2013/10/23 Javascript
JavaScript中的常见问题解决方法(乱码,IE缓存,代理)
2013/11/28 Javascript
Nodejs的express使用教程
2015/11/23 NodeJs
简洁实用的BootStrap jQuery手风琴插件
2016/08/31 Javascript
微信小程序 扎金花简单实例
2017/02/21 Javascript
javascript 中Cookie读、写与删除操作
2017/03/29 Javascript
微信小程序如何获取用户信息
2018/01/26 Javascript
使用Angular CLI生成路由的方法
2018/03/24 Javascript
vue 插件的方法代码详解
2019/06/06 Javascript
bootstrap-table+treegrid实现树形表格
2019/07/26 Javascript
通过微信公众平台获取公众号文章的方法示例
2019/12/25 Javascript
Openlayers实现地图的基本操作
2020/09/28 Javascript
vue 实现基础组件的自动化全局注册
2020/12/25 Vue.js
原生JavaScript实现轮播图
2021/01/10 Javascript
[48:37]EG vs OG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python实现获取照片拍摄日期并重命名的方法
2017/09/30 Python
python实现逆滤波与维纳滤波示例
2020/02/26 Python
Python如何根据时间序列数据作图
2020/05/12 Python
python中可以声明变量类型吗
2020/06/18 Python
CSS3动画:5种预载动画效果实例
2017/04/05 HTML / CSS
详解如何解决canvas图片getImageData,toDataURL跨域问题
2018/09/17 HTML / CSS
英国儿童图书网站:Scholastic
2017/03/26 全球购物
ALEX AND ANI:手镯,项链,耳环和更多
2017/04/20 全球购物
Bench加拿大官方网站:英国城市服装品牌
2017/11/03 全球购物
仓库保管员岗位职责
2013/12/20 职场文书
董事长助理工作职责范本
2014/07/01 职场文书
世界地球日活动总结
2015/02/09 职场文书
2019年暑期安全广播稿!
2019/07/03 职场文书
《敬重卑微》读后感3篇
2019/11/26 职场文书
Python中requests做接口测试的方法
2021/05/30 Python
Nginx中使用Lua脚本与图片的缩略图处理的实现
2022/03/18 Servers
Java结构型设计模式之组合模式详解
2022/09/23 Java/Android