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函数形参用法实例分析
Aug 04 Python
python使用matplotlib绘制折线图教程
Feb 08 Python
Python 通配符删除文件的实例
Apr 24 Python
对numpy.append()里的axis的用法详解
Jun 28 Python
pyqt5的QComboBox 使用模板的具体方法
Sep 06 Python
python存储16bit和32bit图像的实例
Dec 05 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
Aug 19 Python
pygame实现贪吃蛇游戏(下)
Oct 29 Python
Pytorch之view及view_as使用详解
Dec 31 Python
python集合删除多种方法详解
Feb 10 Python
pycharm设置python文件模板信息过程图解
Mar 10 Python
Python Django / Flask如何使用Elasticsearch
Apr 19 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 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
2012/06/07 PHP
phpexcel导入excel数据使用方法实例
2013/12/24 PHP
PHP互换两个变量值的方法(不用第三变量)
2016/11/14 PHP
Laravel 实现数据软删除功能
2019/08/21 PHP
Javascript的严格模式strict mode详细介绍
2014/06/06 Javascript
jQuery获取标签文本内容和html内容的方法
2015/03/27 Javascript
DEDECMS如何为文章添加HOT NEW标志图片
2015/08/14 Javascript
Window.Open打开窗体和if嵌套代码
2016/04/15 Javascript
JS+Canvas绘制时钟效果
2020/08/20 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
2016/07/11 Javascript
js实现简单的计算器功能
2017/01/16 Javascript
angularjs下拉框空白的解决办法
2017/06/20 Javascript
SelectPage v2.4 发布新增纯下拉列表和关闭分页功能
2017/09/07 Javascript
详解关于react-redux中的connect用法介绍及原理解析
2017/09/11 Javascript
解决vue attr取不到属性值的问题
2018/09/18 Javascript
Vue.js样式动态绑定实现小结
2019/01/24 Javascript
jQuery 选择器用法基础入门示例
2020/01/04 jQuery
vue实现动态给id赋值,点击事件获取当前点击的元素的id操作
2020/11/09 Javascript
利用python获取某年中每个月的第一天和最后一天
2016/12/15 Python
Python应用库大全总结
2018/05/30 Python
Python爬虫的两套解析方法和四种爬虫实现过程
2018/07/20 Python
在Pycharm中使用GitHub的方法步骤
2019/06/13 Python
使用python获取(宜宾市地震信息)地震信息
2019/06/20 Python
对PyQt5中的菜单栏和工具栏实例详解
2019/06/20 Python
python scipy卷积运算的实现方法
2019/09/16 Python
python中栈的原理及实现方法示例
2019/11/27 Python
基于python plotly交互式图表大全
2019/12/07 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
2020/02/18 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
2020/03/20 Python
python怎么提高计算速度
2020/06/11 Python
房地产开发计划书
2014/01/10 职场文书
搞笑获奖感言
2014/01/30 职场文书
绿色出行口号
2014/06/18 职场文书
公安机关查摆剖析材料
2014/10/10 职场文书
2019通用版导游词范本!
2019/08/07 职场文书
Spring Boot 的创建和运行示例代码详解
2022/07/23 Java/Android