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 之编写简单乘法运算题
Feb 27 Python
Pycharm技巧之代码跳转该如何回退
Jul 16 Python
Python基于list的append和pop方法实现堆栈与队列功能示例
Jul 24 Python
让Python更加充分的使用Sqlite3
Dec 11 Python
答题辅助python代码实现
Jan 16 Python
Python实现快速傅里叶变换的方法(FFT)
Jul 21 Python
使用Python做定时任务及时了解互联网动态
May 15 Python
简单了解python gevent 协程使用及作用
Jul 22 Python
如何基于python操作excel并获取内容
Dec 24 Python
Python中bisect的使用方法
Dec 31 Python
解决Tkinter中button按钮未按却主动执行command函数的问题
May 23 Python
Python selenium的这三种等待方式一定要会!
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
Zend的MVC机制使用分析(一)
2013/05/02 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
PHP中基本HTTP认证技巧分析
2015/03/16 PHP
php 从一个数组中随机的取出若干个不同的数实例
2016/12/31 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
laravel model模型定义实现开启自动管理时间created_at,updated_at
2019/10/17 PHP
js 小贴士一星期合集
2010/04/07 Javascript
Js操作Select大全(取值、设置选中等等)
2013/10/29 Javascript
js中的for如何实现foreach中的遍历
2014/05/31 Javascript
一行命令搞定node.js 版本升级
2014/07/20 Javascript
jquery插件jSignature实现手动签名
2015/05/04 Javascript
基于javascript实现九宫格大转盘效果
2020/05/28 Javascript
详解vue-cli 构建Vue项目遇到的坑
2017/08/30 Javascript
Vue中的v-for循环key属性注意事项小结
2018/08/12 Javascript
解决layer图标icon不加载的问题
2019/09/04 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
[02:05]DOTA2完美大师赛趣味视频之看我表演
2017/11/18 DOTA
Python中使用PIPE操作Linux管道
2015/02/04 Python
python 网络爬虫初级实现代码
2016/02/27 Python
python如何拆分含有多种分隔符的字符串
2018/03/20 Python
python射线法判断检测点是否位于区域外接矩形内
2019/06/28 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
2020/09/23 Python
python中类与对象之间的关系详解
2020/12/16 Python
详解CSS3原生支持div铺满浏览器的方法
2018/08/30 HTML / CSS
团员的自我评价
2013/12/01 职场文书
股东合作协议书范本
2014/04/14 职场文书
合作协议书范本
2014/04/17 职场文书
法制宣传教育方案
2014/05/09 职场文书
保卫钓鱼岛口号
2014/06/20 职场文书
2014幼儿园教师师德师风演讲稿
2014/09/10 职场文书
干部作风整顿个人剖析材料
2014/10/06 职场文书
党的群众路线教育实践活动个人整改落实情况汇报
2014/10/28 职场文书
煤矿安全生产工作总结
2015/08/13 职场文书
2015年新教师个人工作总结
2015/10/14 职场文书
详解JAVA中的OPTIONAL
2021/06/14 Java/Android
Win11怎么把合并的任务栏分开 Win11任务栏合并分开教程
2022/04/06 数码科技