使用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实现Linux下守护进程的编写方法
Aug 22 Python
Python实现统计英文单词个数及字符串分割代码
May 28 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
Feb 10 Python
Python简单实现查找一个字符串中最长不重复子串的方法
Mar 26 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
May 24 Python
python中多层嵌套列表的拆分方法
Jul 02 Python
TensorFlow实现Logistic回归
Sep 07 Python
python实现画五角星和螺旋线的示例
Jan 20 Python
python3实现高效的端口扫描
Aug 31 Python
Python将二维列表list的数据输出(TXT,Excel)
Apr 23 Python
Python基于BeautifulSoup爬取京东商品信息
Jun 01 Python
python 绘制正态曲线的示例
Sep 24 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实现的仿阿里巴巴实现同类产品翻页
2009/12/11 PHP
php正则表达匹配中文问题分析小结
2012/03/25 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
2016/10/08 PHP
Jquery知识点三 jquery表单对象操作
2011/01/17 Javascript
javascript:FF/Chrome与IE动态加载元素的区别说明
2014/01/26 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
js完美实现@提到好友特效(兼容各大浏览器)
2015/03/16 Javascript
jquery小火箭返回顶部代码分享
2015/08/19 Javascript
基于jQuery通过jQuery.form.js插件实现异步上传
2015/12/13 Javascript
JS实现响应鼠标点击动画渐变弹出层效果代码
2016/03/25 Javascript
jQuery EasyUI 页面加载等待及页面等待层
2017/02/06 Javascript
详解vue.js2.0父组件点击触发子组件方法
2017/05/10 Javascript
jquery ajax异步提交表单数据的方法
2017/10/27 jQuery
nodejs操作mongodb的填删改查模块的制作及引入实例
2018/01/02 NodeJs
完美解决axios在ie下的兼容性问题
2018/03/05 Javascript
JS重学系列之聊聊new操作符
2019/03/04 Javascript
微信小程序的线程架构【推荐】
2019/05/14 Javascript
封装微信小程序http拦截器过程解析
2019/08/13 Javascript
微信公众号生成新浪短网址的实现(快速生成)
2019/08/18 Javascript
JavaScript RegExp 对象用法详解
2019/09/24 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
2020/05/12 Javascript
Python三元运算实现方法
2015/01/12 Python
详解python中字典的循环遍历的两种方式
2017/02/07 Python
Python 爬虫图片简单实现
2017/06/01 Python
python logging重复记录日志问题的解决方法
2018/07/12 Python
详解python中docx库的安装过程
2019/11/08 Python
使用pandas 将DataFrame转化成dict
2019/12/10 Python
python图片指定区域替换img.paste函数的使用
2020/04/09 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
2020/04/10 Python
Python datetime模块使用方法小结
2020/06/18 Python
成品仓管员岗位职责
2013/12/11 职场文书
爱国演讲稿500字
2014/05/04 职场文书
贷款担保书范文
2014/05/13 职场文书
本科应届生求职信
2014/08/05 职场文书
违纪检讨书范文
2015/01/27 职场文书
springboot 多数据源配置不生效遇到的坑及解决
2021/11/17 Java/Android