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

特殊食物:
1.绿色:普通,吃了增加体型
2.红色:吃了减少体型
3.金色:吃了回到最初体型
4.变色食物:吃了会根据食物颜色改变蛇的颜色
#coding=UTF-8
from Tkinter import *
from random import randint
import 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()
总结
以上所述是小编给大家介绍的使用Python写一个贪吃蛇游戏实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# python
# 贪吃蛇游戏
# Python写的贪吃蛇游戏例子
# Python贪吃蛇游戏编写代码
# python实现贪吃蛇小游戏
# python贪吃蛇游戏代码
# python实现贪吃蛇游戏
# python实现贪吃蛇游戏源码
# python实现简单贪吃蛇游戏
# python实现简单贪吃蛇小游戏
# python实现一个简单的贪吃蛇游戏附代码
# Python版贪吃蛇保姆级教程(附完整代码有详细注释)
# 吃了
# 最初
# 贪吃蛇
# 撞到
# 小编
# 自己的
# 类中
# 是在
# 我在
# 在此
# 不可以
# 而不
# 下一
# 给大家
# 三种
# 吃到
# 所述
# 给我留言
# 什么都没
# 感谢大家
相关文章:
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
建站之星伪静态规则如何正确配置?
招贴海报怎么做,什么是海报招贴?
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
C#怎么使用委托和事件 C# delegate与event编程方法
如何零基础开发自助建站系统?完整教程解析
Android滚轮选择时间控件使用详解
微课制作网站有哪些,微课网怎么进?
头像制作网站在线制作软件,dw网页背景图像怎么设置?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
建站主机空间推荐 高性价比配置与快速部署方案解析
番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?
制作门户网站的参考文献在哪,小说网站怎么建立?
建站主机助手选型指南:2025年热门推荐与高效部署技巧
宝塔新建站点为何无法访问?如何排查?
建站之星安全性能如何?防护体系能否抵御黑客入侵?
如何用PHP快速搭建CMS系统?
如何快速上传自定义模板至建站之星?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
公司门户网站制作流程,华为官网怎么做?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
利用JavaScript实现拖拽改变元素大小
Python如何创建带属性的XML节点
家具网站制作软件,家具厂怎么跑业务?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
如何快速启动建站代理加盟业务?
内网网站制作软件,内网的网站如何发布到外网?
网站制作需要会哪些技术,建立一个网站要花费多少?
建站之星2.7模板快速切换与批量管理功能操作指南
如何在IIS中新建站点并配置端口与IP地址?
建站之星微信建站一键生成小程序+多端营销系统
Swift中switch语句区间和元组模式匹配
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
贸易公司网站制作流程,出口贸易网站设计怎么做?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
建站主机无法访问?如何排查域名与服务器问题
建站之星安装路径如何正确选择及配置?
制作旅游网站html,怎样注册旅游网站?
建站之星体验版:智能建站系统+响应式设计,多端适配快速建站
保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
建站之星后台管理系统如何操作?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
网站制作公司排行榜,抖音怎样做个人官方网站
黑客如何利用漏洞与弱口令入侵网站服务器?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
建站org新手必看:2024最新搭建流程与模板选择技巧
*请认真填写需求信息,我们会在24小时内与您取得联系。