贪吃蛇游戏趣味版

我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了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-01 15:30:26

贪吃蛇游戏趣味版的相关文章

Qt版贪吃蛇游戏

Qt版贪吃蛇游戏 转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907 最近在学习Qt,用了一个多月的时间掌握了Qt中最基本的知识,也完成了<Qt版音乐播放器>.<Qt版贪吃蛇游戏>.<Qt版双人俄罗斯方块>以及<Qt版科学计算器>等,之前在VC下写过这些程序,所以在Qt下只是改变了显示等语句,我写过<C++版贪吃蛇游戏>.<VC版贪吃蛇游戏>,当时将与显示等无关的东西封装起来,在Qt下直接用,只

qtday03 简单版的贪吃蛇游戏

//snakegame.h #ifndef SNAKEGAME_H #define SNAKEGAME_H #include<QList> #include<QtWidgets/QLabel> #include<QtWidgets/QDialog> #include<QKeyEvent> #include<QTimer> /*枚举,表示方向*/ enum Direction{D_UP,D_DOWN,D_LEFT,D_RIGHT}; class S

贪吃蛇游戏

学习C语言也差不多学完了想做一个游戏,而贪吃蛇和俄罗斯方块都是非常经典的游戏,在网上也找到了许多相关的参考资料,便动手做了,这个游戏室控制台版的 游戏流程图 函数模块 函数名 函数功能 CursorPosition 光标定位函数 CreateSnake 蛇初始化函数 ShowWall 显示墙体 UpdateSnake 更新界面上的蛇体.分数.等级.食物 CollisionDetection 判断蛇是否咬到自己 RandFood 随机产生食物 Move 控制方向 程序代码 #include <st

Android快乐贪吃蛇游戏实战项目开发教程-01项目概述

一.项目简介贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏.我已经将做好的案例上传到了应用宝,大家可以下载下来把玩一下.为了和其它的贪吃蛇区别开来,我取名叫“快乐贪吃蛇”.应用宝链接:http://sj.qq.com/myapp/detail.htm?apkName=net.chengyujia.happysnake这里上两张截图先睹为快,哈哈.怎么玩大家应该都知道,不过我还是要多提一下.通过屏幕上的方向键控制蛇的前进方向.蛇每吃到一个食物身体会

JS贪吃蛇游戏

<!DOCTYPE html><html> <head>    <meta charset="utf-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <title>JS贪吃蛇游戏</title>    <style>    * {        margin: 0;    

用Java开发贪吃蛇游戏

贪吃蛇游戏的设计步骤: Part 1: 设计游戏图纸 画出900*700的白色窗口 在窗口上添加画布 在画布上添加标题 在画布上添加黑色游戏区 Part 2: 放置静态的蛇:一个头.两个身体 加上开始提示:按空格键开始游戏 让蛇动起来:监听Timer事件,平移数据 实现游戏暂停 实现转向功能 Part 3: 添加食物 吃掉食物 添加死亡条件 实现“重新开始”功能 添加分数和长度 游戏图纸如下: 蛇及游戏框的素材如下:                              Snake主类: 1

【141030】VC++贪吃蛇游戏源码(Win32+API)

不错的贪吃蛇游戏,运用了Win32的API.完整源代码,在VS2005下编译通过.内附有编程要点,很好的学习范例. 游戏源码下载地址:点击下载

结对-开发贪吃蛇游戏-开发环境搭建过程

项目:贪吃蛇游戏开发 环境搭建: Mac下: 1)官网下载jkd1.8版本. 2)下载IDE--eclipse或Myeclipse win下: 1)官网下载JDK,找到符合自己电脑的版本,下载的本地 2)下载IDE--eclipse或Myeclipse 3)配置环境变量: i.计算机->属性->高级系统设置 ii.单击高级系统设置->环境变量在系统变量里面分别设置JAVA_HOME.CLASSPATH和Path iii.在系统变量里找变量名JAVA_HOME,如果没有就点击新建.输入变量

WebGL实现HTML5的3D贪吃蛇游戏

js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型,多次想尝试提交个小游戏但总无法写出让自己满意还能控制在这么小的字节范围. 自己写不出来,站在巨人肩膀总是有机会吧,想起<基于HTML5的电信网管3D机房监控应用>这篇提到的threejs,babylonjs和Hightopo的几种基于WebGL的3D引擎,突然想挑战下自己实现个100行JS的3D小