使用Python写一个贪吃蛇

参考代码http://blog.csdn.net/leepwang/article/details/7640880

我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了SnakeGame的类中,而不是在Snake类中。

特殊食物:

1.绿色:普通,吃了增加体型

2.红色:吃了减少体型

3.金色:吃了回到最初体型

4.变色食物:吃了会根据食物颜色改变蛇的颜色

#coding=UTF-8from Tkinter import *from random import randintimport tkMessageBox

class Grid(object):    def __init__(self, master=None,height=16, width=24, offset=10, grid_width=50, bg="#808080"):        self.height = height        self.width = width        self.offset = offset        self.grid_width = grid_width        self.bg = bg        self.canvas = Canvas(master, width=self.width*self.grid_width+2*self.offset, height=self.height*self.grid_width+                                                                                            2*self.offset, bg=self.bg)        self.canvas.pack(side=RIGHT, fill=Y)

def draw(self, pos, color, ):        x = pos[0] * self.grid_width + self.offset        y = pos[1] * self.grid_width + self.offset        #outline属性要与网格的背景色(self.bg)相同,要不然会很丑        self.canvas.create_rectangle(x, y, x + self.grid_width, y + self.grid_width, fill=color, outline=self.bg)

class Food(object):    def __init__(self, grid, color = "#23D978"):        self.grid = grid        self.color = color        self.set_pos()        self.type = 1

def set_pos(self):        x = randint(0, self.grid.width - 1)        y = randint(0, self.grid.height - 1)        self.pos = (x, y)

def display(self):        self.grid.draw(self.pos, self.color)

class Snake(object):    def __init__(self, grid, color = "#000000"):        self.grid = grid        self.color = color        self.body = [(8, 11), (8, 12), (8, 13)]        self.direction = "Up"        for i in self.body:            self.grid.draw(i, self.color)

#这个方法用于游戏重新开始时初始化贪吃蛇的位置    def initial(self):        while not len(self.body) == 0:            pop = self.body.pop()            self.grid.draw(pop, self.grid.bg)        self.body = [(8, 11), (8, 12), (8, 13)]        self.direction = "Up"        self.color = "#000000"        for i in self.body:            self.grid.draw(i, self.color)

#蛇像一个指定点移动    def move(self, new):        self.body.insert(0, new)        pop = self.body.pop()        self.grid.draw(pop, self.grid.bg)        self.grid.draw(new, self.color)

#蛇像一个指定点移动,并增加长度    def add(self ,new):        self.body.insert(0, new)        self.grid.draw(new, self.color)

#蛇吃到了特殊食物1,剪短自身的长度    def cut_down(self,new):        self.body.insert(0, new)        self.grid.draw(new, self.color)        for i in range(0,3):            pop = self.body.pop()            self.grid.draw(pop, self.grid.bg)

#蛇吃到了特殊食物2,回到最初长度    def init(self, new):        self.body.insert(0, new)        self.grid.draw(new, self.color)        while len(self.body) > 3:            pop = self.body.pop()            self.grid.draw(pop, self.grid.bg)

#蛇吃到了特殊食物3,改变了自身的颜色,纯属好玩    def change(self, new, color):        self.color = color        self.body.insert(0, new)        for item in self.body:            self.grid.draw(item, self.color)

class SnakeGame(Frame):    def __init__(self, master):        Frame.__init__(self, master)        self.grid = Grid(master)        self.snake = Snake(self.grid)        self.food = Food(self.grid)        self.gameover = False        self.score = 0        self.status = [‘run‘, ‘stop‘]        self.speed = 300        self.grid.canvas.bind_all("<KeyRelease>", self.key_release)        self.display_food()        #用于设置变色食物        self.color_c = ("#FFB6C1","#6A5ACD","#0000FF","#F0FFF0","#FFFFE0","#F0F8FF","#EE82EE","#000000","#5FA8D9","#32CD32")        self.i = 0        #界面左侧显示分数        self.m = StringVar()        self.ft1 = (‘Fixdsys‘, 40, "bold")        self.m1 = Message(master, textvariable=self.m, aspect=5000, font=self.ft1, bg="#696969")        self.m1.pack(side=LEFT, fill=Y)        self.m.set("Score:"+str(self.score))

#这个方法用于游戏重新开始时初始化游戏    def initial(self):        self.gameover = False        self.score = 0        self.m.set("Score:"+str(self.score))        self.snake.initial()

#type1:普通食物  type2:减少2  type3:大乐透,回到最初状态  type4:吃了会变色    def display_food(self):        self.food.color = "#23D978"        self.food.type = 1        if randint(0, 40) == 5:            self.food.color = "#FFD700"            self.food.type = 3            while (self.food.pos in self.snake.body):                self.food.set_pos()            self.food.display()        elif randint(0, 4) == 2:            self.food.color = "#EE82EE"            self.food.type = 4            while (self.food.pos in self.snake.body):                self.food.set_pos()            self.food.display()        elif len(self.snake.body) > 10 and randint(0, 16) == 5:            self.food.color = "#BC8F8F"            self.food.type = 2            while (self.food.pos in self.snake.body):                self.food.set_pos()            self.food.display()        else:            while (self.food.pos in self.snake.body):                self.food.set_pos()            self.food.display()

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.direction = key            self.move()        elif key == ‘p‘:            self.status.reverse()

def run(self):        #首先判断游戏是否暂停        if not self.status[0] == ‘stop‘:            #判断游戏是否结束            if self.gameover == True:                message = tkMessageBox.showinfo("Game Over", "your score: %d" % self.score)                if message == ‘ok‘:                    self.initial()            if self.food.type == 4:                color = self.color_c[self.i]                self.i = (self.i+1)%10                self.food.color = color                self.food.display()                self.move(color)            else:                self.move()        self.after(self.speed, self.run)

def move(self, color="#EE82EE"):        # 计算蛇下一次移动的点        head = self.snake.body[0]        if self.snake.direction == ‘Up‘:            if head[1] - 1 < 0:                new = (head[0], 16)            else:                new = (head[0], head[1] - 1)        elif self.snake.direction == ‘Down‘:            new = (head[0], (head[1] + 1) % 16)        elif self.snake.direction == ‘Left‘:            if head[0] - 1 < 0:                new = (24, head[1])            else:                new = (head[0] - 1, head[1])        else:            new = ((head[0] + 1) % 24, head[1])            #撞到自己,设置游戏结束的标志位,等待下一循环        if new in self.snake.body:            self.gameover=True        #吃到食物        elif new == self.food.pos:            if self.food.type == 1:                self.snake.add(new)            elif self.food.type == 2:                self.snake.cut_down(new)            elif self.food.type == 4:                self.snake.change(new, color)            else:                self.snake.init(new)            self.display_food()            self.score = self.score+1            self.m.set("Score:" + str(self.score))        #什么都没撞到,继续前进        else:            self.snake.move(new)

if __name__ == ‘__main__‘:    root = Tk()    snakegame = SnakeGame(root)    snakegame.run()    snakegame.mainloop()
时间: 2024-10-11 05:43:00

使用Python写一个贪吃蛇的相关文章

如何用Python写一个贪吃蛇AI

前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了. 问题的关键在于,图片中的贪吃蛇真的很贪吃XD,它把矩形中出现的食物吃了个遍, 然后华丽丽地把整个矩形填满,真心是看得赏心悦目.作为一个CSer, 第一个想到的是,这东西是写程序实现的(因为,一般人干不出这事. 果断是要让程序来干的)第二个想到的是,写程序该如何实现,该用什么算法? 既然开始想了,就开始做.因为Talk is cheap,要sho

用Python写一个贪吃蛇

最近在学Python,想做点什么来练练手,命令行的贪吃蛇一般是C的练手项目,但是一时之间找不到别的,就先做个贪吃蛇来练练简单的语法. 由于Python监听键盘很麻烦,没有C语言的kbhit(),所以这条贪吃蛇不会自己动,运行效果如下: 要求:用#表示边框,用*表示食物,o表示蛇的身体,O表示蛇头,使用wsad来移动 Python版本:3.6.1 系统环境:Win10 类: board:棋盘,也就是游戏区域 snake:贪吃蛇,通过记录身体每个点来记录蛇的状态 game:游戏类 本来还想要个foo

我也来写一个贪吃蛇

最近工作量好大,好忙,趁周末练练手,花了近3小时写了一个贪吃蛇. 实现贪吃蛇的功能很简单. 我就分享一下我实现贪吃蛇看起来在界面上移动并且吃食物长大的原理. 我建了一个数组list_arr[]来保存贪吃蛇所在的每个格子的id,并建了2个全局变量x和y,监听贪吃蛇头的位置,当然x和y也是贪吃蛇的起始位置. 那么贪吃蛇移动实际上就是每次从list_arr[]里取出第一个元素(list_arr.shift()方法),取出的第一个元素也可以认为是贪吃蛇的尾巴,然后把这个元素(也就是格子的id)代表的格子

JavaScript与html5写的贪吃蛇完整代码

JavaScript与html5写的贪吃蛇完整代码 查看运行效果可访问http://www.codesocang.com/texiao/youxitexiao/2014/0402/7045.html# <!doctype html><html lang="en"><head><meta charset="utf-8"><title>js网页版的贪吃蛇游戏</title><style typ

用Python写一个ftp下载脚本

用Python写一个ftp下载脚本 ----基于Red Hat Enterprise Linux Server release 6.4 (Santiago):python 2.6.6 Ps:少侠我接触Python半个月以来接到的第一个需求,虽然如此简单的一个脚本,少侠我磕磕绊绊却用了将近一天半的时间才写出来,但还是很开心,毕竟也粗来了,废话不多说,切入正题.因为一开始没有用过ftplib模块,所以各种谷歌度娘一堆资料杂乱不堪,话不清,理不乱的,本文实现的功能简单,下面介绍一下,以免误导读者. 需

老男孩教育每日一题-2017-04-17:使用Shell或Python写一个脚本,CPU使用率超过80%或硬盘超过85%邮件报警

老男孩教育每日一题-2017-04-17: 使用Shell或Python写一个脚本,CPU使用率超过80%或硬盘超过85%邮件报警. 今天是老男孩教育每日一题陪伴大家的第29天.

python写一个脚本解析文件

Python写一个脚本解析文件 ----基于Red Hat Enterprise Linux Server release 6.4 (Santiago):python 2.6.6 需求: 1.去掉空行 2.去掉空行后输出到一个新文件 附加需求(排版):1.'-'缩进n个字符 '-'缩进2n个字符 以此类推 2.'-'开头的所有句子输出在一行 '-'开头的句子输出在一行 以此类推 --------------------------------------------分隔线------------

【视频】半小时内编写一个贪吃蛇游戏

贪吃蛇编写提纲 致谢: 感谢 Ronnie Mooney ,我是在学习了他的视频后完成这个视频的,你可以在 [C#] Creating a Snake Game - Less than an Hour 找到他的视频(需翻墙,请自备梯子). 编写 Input 静态类 初始化静态变量 private static readonly Hashtable _keys = new Hashtable() 编写方法 public static void ChangeState(Keys key, bool

python写一个通讯录V2.0

python写一个通讯录step by step V2.0 引用知识 list + dict用于临时存储用户数据信息 cPickle用于格式化文件存取 依旧使用file来进行文件的存储 解决问题 1.操刀开始去做 原始代码 实现功能(可做模板) 1.判断输入内容是否在给出的menu目录内,在的话,返回对应结果,不在就报错 2.调用os模块的exit功能 3.字典配合循环加上函数实现switch的功能 #!/usr/bin/env python #coding:utf8 #Author:zhuim