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

作者:Suisnail 时间:2023-07-05 18:25:02 

我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了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写一个贪吃蛇游戏实例代码,希望对大家有所帮助

来源:http://www.cnblogs.com/Suisnail/p/7402446.html

标签:python,贪吃蛇
0
投稿

猜你喜欢

  • JavaScript动态调整图片尺寸

    2009-11-23 12:20:00
  • Python CSV模块使用实例

    2022-02-04 18:56:36
  • PDO::setAttribute讲解

    2023-06-05 18:04:23
  • 解决pyCharm中 module 调用失败的问题

    2022-11-27 23:21:19
  • HTML5 Canvas 起步(2) - 路径

    2009-05-12 12:06:00
  • Python实现构建一个仪表板的示例代码

    2023-10-03 11:53:27
  • 一个PHP的QRcode类与大家分享

    2023-06-24 05:39:33
  • php 404错误页面实现代码

    2023-11-15 07:58:31
  • Python使用for生成列表实现过程解析

    2021-11-28 08:15:30
  • javascript基于prototype实现类似OOP继承的方法

    2024-05-02 16:29:15
  • 用python写一个定时提醒程序的实现代码

    2021-04-12 12:25:45
  • bpython 功能强大的Python shell

    2022-05-08 22:12:06
  • Python中支持向量机SVM的使用方法详解

    2021-02-08 00:41:01
  • Python3网络爬虫中的requests高级用法详解

    2023-02-05 16:54:52
  • 使用python的chardet库获得文件编码并修改编码

    2022-02-23 18:22:35
  • async/await与promise(nodejs中的异步操作问题)

    2024-04-22 22:43:39
  • js数组去重的11种方法

    2024-04-17 10:30:54
  • 详解vue-router 2.0 常用基础知识点之router.push()

    2024-04-09 10:49:35
  • JavaScript实现计算圆周率到小数点后100位的方法示例

    2024-02-27 02:38:58
  • flask应用部署到服务器的方法

    2023-11-25 16:59:38
  • asp之家 网络编程 m.aspxhome.com