使用Python写一个贪吃蛇游戏实例代码


Posted in Python onAugust 21, 2017

我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了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解析中国天气网的天气数据
Mar 21 Python
Python转换HTML到Text纯文本的方法
Jan 15 Python
Python设计足球联赛赛程表程序的思路与简单实现示例
Jun 28 Python
解决Shell执行python文件,传参空格引起的问题
Oct 30 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
Dec 10 Python
Python实现针对json中某个关键字段进行排序操作示例
Dec 25 Python
python找出因数与质因数的方法
Jul 25 Python
python之PyQt按钮右键菜单功能的实现代码
Aug 17 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
Feb 07 Python
python实现快递价格查询系统
Mar 03 Python
如何通过命令行进入python
Jul 06 Python
详解python中的异常和文件读写
Jan 03 Python
virtualenv实现多个版本Python共存
Aug 21 #Python
基于Python对象引用、可变性和垃圾回收详解
Aug 21 #Python
python 垃圾收集机制的实例详解
Aug 20 #Python
python 实现tar文件压缩解压的实例详解
Aug 20 #Python
详解Python 序列化Serialize 和 反序列化Deserialize
Aug 20 #Python
Python中input与raw_input 之间的比较
Aug 20 #Python
Python 基础教程之str和repr的详解
Aug 20 #Python
You might like
用PHP实现的随机广告显示代码
2007/06/14 PHP
关于php mvc开发模式的感想
2011/06/28 PHP
10个实用的PHP代码片段
2011/09/02 PHP
php计算给定时间之前的函数用法实例
2015/04/03 PHP
PHP比较运算符的详细介绍
2015/09/29 PHP
thinkPHP5.0框架模块设计详解
2017/03/18 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
2017/03/23 PHP
jquery命令汇总,方便使用jquery的朋友
2012/06/26 Javascript
Javascript原型链和原型的一个误区
2014/10/22 Javascript
Jquery树插件zTree用法入门教程
2015/02/17 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
AngularJS自定义控件实例详解
2016/12/13 Javascript
javascript解析ajax返回的xml和json格式数据实例详解
2017/01/05 Javascript
利用vueJs实现图片轮播实例代码
2017/06/03 Javascript
JS+HTML5实现图片在线预览功能
2017/07/22 Javascript
简单谈谈JS中的正则表达式
2017/09/11 Javascript
基于Vue过渡状态实例讲解
2017/09/14 Javascript
使用Angular CLI生成 Angular 5项目教程详解
2018/03/18 Javascript
解决vue打包css文件中背景图片的路径问题
2018/09/03 Javascript
详解python并发获取snmp信息及性能测试
2017/03/27 Python
Python中列表list以及list与数组array的相互转换实现方法
2017/09/22 Python
Python设计模式之工厂模式简单示例
2018/01/09 Python
Python实现邮件的批量发送的示例代码
2018/01/23 Python
使用Python从零开始撸一个区块链
2018/03/14 Python
python 把文件中的每一行以数组的元素放入数组中的方法
2018/04/29 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
2019/07/19 Python
Python Socket TCP双端聊天功能实现过程详解
2020/06/15 Python
期中考试后的反思
2014/02/08 职场文书
优秀的导游求职信范文
2014/04/06 职场文书
创业培训计划书
2014/05/03 职场文书
入党积极分子批评与自我批评思想汇报
2014/09/14 职场文书
物业项目经理岗位职责
2015/04/01 职场文书
python装饰器代码解析
2022/03/23 Python
Java Spring Boot 正确读取配置文件中的属性的值
2022/04/20 Java/Android
解决spring.thymeleaf.cache=false不起作用的问题
2022/06/10 Java/Android