使用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基于回溯法子集树模板解决野人与传教士问题示例
Sep 11 Python
Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】
Sep 04 Python
Python3 SSH远程连接服务器的方法示例
Dec 29 Python
python自定义线程池控制线程数量的示例
Feb 22 Python
django2笔记之路由path语法的实现
Jul 17 Python
Python解析命令行读取参数之argparse模块
Jul 26 Python
python实现的生成word文档功能示例
Aug 23 Python
Python(PyS60)实现简单语音整点报时
Nov 18 Python
python二分法查找算法实现方法【递归与非递归】
Dec 06 Python
基于TensorBoard中graph模块图结构分析
Feb 15 Python
python切割图片的示例
Nov 12 Python
python实现图片转字符画的完整代码
Feb 21 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分页详细讲解(有实例)
2013/10/30 PHP
详解php魔术方法(Magic methods)的使用方法
2016/02/14 PHP
smarty循环嵌套用法示例分析
2016/07/19 PHP
thinkphp jquery实现图片上传和预览效果
2020/07/22 PHP
实例讲解php将字符串输出到HTML
2019/01/27 PHP
PHP大文件分块上传功能实例详解
2019/07/22 PHP
PHP常量及变量区别原理详解
2020/08/14 PHP
非常好的js代码
2006/06/27 Javascript
jQuery图片前后对比插件beforeAfter用法示例【附demo源码下载】
2016/09/20 Javascript
nodejs实现邮件发送服务实例分享
2017/03/29 NodeJs
Bootstrap弹出框(Popover)被挤压的问题小结
2017/07/11 Javascript
vue与bootstrap实现时间选择器的示例代码
2017/08/26 Javascript
微信小程序倒计时功能实现代码
2017/11/09 Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
2017/12/01 Javascript
JS基于for语句编写的九九乘法表示例
2018/01/04 Javascript
Angular动画实现的2种方式以及添加购物车动画实例代码
2018/08/09 Javascript
angularjs下ng-repeat点击元素改变样式的实现方法
2018/09/12 Javascript
微信小程序用户拒绝授权的处理方法详解
2019/09/20 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
基于elementUI竖向表格、和并列的案例
2020/10/26 Javascript
微信小程序实现弹幕墙(祝福墙)
2020/11/18 Javascript
在GitHub Pages上使用Pelican搭建博客的教程
2015/04/25 Python
Python 实现简单的shell sed替换功能(实例讲解)
2017/09/29 Python
pandas.cut具体使用总结
2019/06/24 Python
window环境pip切换国内源(pip安装异常缓慢的问题)
2019/12/31 Python
关于Python字符编码与二进制不得不说的一些事
2020/10/04 Python
简单html5代码获取地理位置
2014/03/31 HTML / CSS
美国专营婴幼儿用品的购物网站:buybuy BABY
2017/01/01 全球购物
给排水工程师岗位职责
2013/11/21 职场文书
渡河少年教学反思
2014/02/12 职场文书
钢铁是怎样炼成的读书笔记
2015/06/29 职场文书
医院感染管理制度
2015/08/05 职场文书
2019求职信大礼包
2019/05/15 职场文书
如何利用STAR法则制作留学文书?
2019/08/26 职场文书
MySQL中rank() over、dense_rank() over、row_number() over用法介绍
2022/03/23 MySQL
使用vue判断当前环境是安卓还是IOS
2022/04/12 Vue.js