python语言实现贪吃蛇游戏


Posted in Python onNovember 13, 2020

本文实例为大家分享了python实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下

新手自学python(简易贪吃蛇代码)
环境python3.7

刚刚大学毕业进入工作岗位,发现同事基本都会写py脚本,于是自学了一下,并写了一个简单的贪吃蛇代码,我觉得写的还是比较容易看懂,适合新手接触python。

# -*- coding: utf-8 -*-
import tkinter as tk 
# 使用Tkinter前需要先导入
import tkinter.messagebox
import pickle
import random
import time

# 第1步,实例化object,建立窗口window
window = tk.Tk() 
# 第2步,给窗口的可视化起名字
window.title('Greedy snake')
# 第3步,设定窗口的大小(长 * 宽)
# window.geometry('1004x504') # 这里的乘是小x

# 第5步,创建一个主frame,长在主window窗口上
frame = tk.Frame(window, bg = 'blue', bd = 2, relief = tk.FLAT)
frame.pack(side = 'left')
#当前框架被选中,意思是键盘触发,只对这个框架有效
frame.focus_set()
Labellist = [] #存放所有方块的label
Blocklist = [] #存放背景方块的值 1:被占用 0:空闲
Snakelist = [] #存放snake的坐标
height = 15
width = 20
#snack前进方向
left = 0
right = 1
up = 2
down =3
pause = 0
start = 1
class App(tk.Frame): 
 def __init__(self,master):  
  self.window = master  
  tk.Frame.__init__(self)  
  master.bind('<Up>',self.Up)  
  master.bind('<Left>',self.Left)  
  master.bind('<Right>',self.Right)  
  master.bind('<Down>',self.Down)  
  master.bind('<p>',self.Pause)  
  master.bind('<s>',self.Start)  
  master.bind('<r>',self.Restart)  
  self.Init_snake() #初始化界面方法
  self.time = 1000  
  self.Onetime()     
 def Up(self, event):  
  if self.Istart:   
   self.direction = up 
 def Down(self, event):  
  if self.Istart:   
   self.direction = down 
 def Left(self, event):  
  if self.Istart:   
   self.direction = left 
 def Right(self, event):  
  if self.Istart:   
   self.direction = right
 def Init_snake(self):  
  del Labellist[:]  
  del Blocklist[:]  
  del Snakelist[:]    
  #初始化背景方块  
  LabelRowList = []  
  BlockRowlist = []  
  c = r = 0  
  for k in range(width*height):   
   LN=tk.Label(frame,text = ' ', bg = 'black', fg = 'white', relief = tk.FLAT, bd = 4)   
   LN.grid(row=r,column=c,sticky=tk.N+tk.E+tk.S+tk.W)   
   LabelRowList.append(LN)   
   BlockRowlist.append(0)   
   c=c+1 
   if c>=20:
    r=r+1
    c=0    
    Labellist.append(LabelRowList)    
    Blocklist.append(BlockRowlist)    
    LabelRowList = []    
    BlockRowlist = []  
  #初始化snake  
  self.Istart = 0  
  self.direction = left
  self.direction_last = left
  self.overflag = 0 
  #snake head的初始位置  
  self.x = 7  
  self.y = 8  
  #snake tail的初始位置  
  self.x_tail = 7  
  self.y_tail = 10  
  Snakelist.append((7,8))  
  Snakelist.append((7,9))  
  Snakelist.append((7,10))  
  self.snakelen = len(Snakelist)


  Blocklist[self.x][self.y] = 1  
  Blocklist[self.x][self.y+1] = 1  
  Blocklist[self.x][self.y+2] = 1  
  Labellist[self.x][self.y].config(bg = 'green', relief = tk.RAISED)  
  Labellist[self.x][self.y+1].config(bg = 'white', relief = tk.RAISED)  
  Labellist[self.x][self.y+2].config(bg = 'white', relief = tk.RAISED)  
  #初始化food  
  self.food_x = random.randint(0,14)  
  self.food_y = random.randint(0,19)  
  while Blocklist[self.food_x][self.food_y] == 1:   
   self.food_x = random.randint(0,14)   
   self.food_y = random.randint(0,19)     
  Blocklist[self.food_x][self.food_y] = 1  
  Labellist[self.food_x][self.food_y].config(bg = 'red', relief = tk.RIDGE)
 def Pause(self, event):  
  self.Istart = pause 
 def Start(self, event):  
  self.Istart = start 
 def Restart(self, event):  
  self.Init_snake()
 def Onetime(self): #每1000ms做一次界面刷新  
  if self.Istart and self.overflag == 0: 
   if (self.direction_last == down and self.direction == up )or(self.direction_last == up and self.direction == down )or(self.direction_last ==left and self.direction == right )or(self.direction_last ==right and self.direction == left ):
    self.direction = self.direction_last
   self.direction_last = self.direction 
   x0 = self.x   
   y0 = self.y   
   if self.direction == left:    
    if x0 == self.food_x and y0-1 == self.food_y:          
     Labellist[x0][y0-1].config(bg = 'green', relief = tk.RAISED)     
     Labellist[x0][y0].config(bg = 'white', relief = tk.RAISED)
     self.food_x = random.randint(0,14)     
     self.food_y = random.randint(0,19)     
     while Blocklist[self.food_x][self.food_y] == 1:      
      self.food_x = random.randint(0,14)      
      self.food_y = random.randint(0,19)     
     Blocklist[self.food_x][self.food_y] = 1     
     Labellist[self.food_x][self.food_y].config(bg = 'red', relief = tk.RIDGE)
     self.snakelen += 1     
     Snakelist.insert(0,(x0,y0-1))      
     self.x = x0     
     self.y = y0 - 1    
    elif (x0>=0 and x0<height and y0-1>=0 and y0-1<width and Blocklist[x0][y0-1] == 0) or (self.x_tail == x0 and self.y_tail == y0 - 1):               
     Blocklist[self.x_tail][self.y_tail] = 0     
     Labellist[self.x_tail][self.y_tail].config(bg = 'black', relief = tk.FLAT)     
     Blocklist[x0][y0-1] = 1     
     Labellist[x0][y0-1].config(bg = 'green', relief = tk.RAISED)     
     Labellist[x0][y0].config(bg = 'white', relief = tk.RAISED)           
     del Snakelist[self.snakelen - 1]     
     Snakelist.insert(0,(x0,y0-1))      
     self.x = x0     
     self.y = y0 - 1     
     self.x_tail = Snakelist[self.snakelen - 1][0]     
     self.y_tail = Snakelist[self.snakelen - 1][1]    
    else:     
     tk.messagebox.showinfo(title = 'snake', message = 'game over!!!')     
     self.overflag = 1     
   elif self.direction == up:    
    if x0-1 == self.food_x and y0 == self.food_y:           
     Labellist[x0-1][y0].config(bg = 'green', relief = tk.RAISED)     
     Labellist[x0][y0].config(bg = 'white', relief = tk.RAISED)
     self.food_x = random.randint(0,14)     
     self.food_y = random.randint(0,19)     
     while Blocklist[self.food_x][self.food_y] == 1:      
      self.food_x = random.randint(0,14)      
      self.food_y = random.randint(0,19)     
     Blocklist[self.food_x][self.food_y] = 1     
     Labellist[self.food_x][self.food_y].config(bg = 'red', relief = tk.RIDGE) 
     self.snakelen += 1     
     Snakelist.insert(0,(x0-1,y0))      
     self.x = x0 - 1     
     self.y = y0 
    elif (x0-1 >=0 and x0-1<height and y0>=0 and y0<width and Blocklist[x0-1][y0] == 0) or (self.x_tail == x0-1 and self.y_tail == y0):          
     Blocklist[self.x_tail][self.y_tail] = 0     
     Labellist[self.x_tail][self.y_tail].config(bg = 'black', relief = tk.FLAT)     
     Blocklist[x0-1][y0] = 1     
     Labellist[x0-1][y0].config(bg = 'green', relief = tk.RAISED)     
     Labellist[x0][y0].config(bg = 'white', relief = tk.RAISED)
     del Snakelist[self.snakelen - 1]     
     Snakelist.insert(0,(x0 - 1,y0))      
     self.x = x0 - 1     
     self.y = y0     
     self.x_tail = Snakelist[self.snakelen - 1][0]     
     self.y_tail = Snakelist[self.snakelen - 1][1]    
    else:     
     tk.messagebox.showinfo(title = 'snake', message = 'game over!!!')     
     self.overflag = 1   
   elif self.direction == down:    
    if x0+1 == self.food_x and y0 == self.food_y:          
     Labellist[x0+1][y0].config(bg = 'green', relief = tk.RAISED)     
     Labellist[x0][y0].config(bg = 'white', relief = tk.RAISED)
     self.food_x = random.randint(0,14)     
     self.food_y = random.randint(0,19)     
     while Blocklist[self.food_x][self.food_y] == 1:      
      self.food_x = random.randint(0,14)      
      self.food_y = random.randint(0,19)     
     Blocklist[self.food_x][self.food_y] = 1     
     Labellist[self.food_x][self.food_y].config(bg = 'red', relief = tk.RIDGE) 
     self.snakelen += 1     
     Snakelist.insert(0,(x0+1,y0))      
     self.x = x0 + 1     
     self.y = y0 
    elif (x0+1 >=0 and x0+1 <height and y0>=0 and y0<width and Blocklist[x0+1][y0] == 0) or (self.x_tail == x0+1 and self.y_tail == y0):               
     Blocklist[self.x_tail][self.y_tail] = 0     
     Labellist[self.x_tail][self.y_tail].config(bg = 'black', relief = tk.FLAT)     
     Blocklist[x0+1][y0] = 1     
     Labellist[x0+1][y0].config(bg = 'green', relief = tk.RAISED)     
     Labellist[x0][y0].config(bg = 'white', relief = tk.RAISED) 
     del Snakelist[self.snakelen - 1]     
     Snakelist.insert(0,(x0 + 1,y0))      
     self.x = x0 + 1     
     self.y = y0     
     self.x_tail = Snakelist[self.snakelen - 1][0]     
     self.y_tail = Snakelist[self.snakelen - 1][1]    
    else:     
     tk.messagebox.showinfo(title = 'snake', message = 'game over!!!')     
     self.overflag = 1   
   elif self.direction == right:    
    if x0 == self.food_x and y0+1 == self.food_y:          
     Labellist[x0][y0+1].config(bg = 'green', relief = tk.RAISED)     
     Labellist[x0][y0].config(bg = 'white', relief = tk.RAISED)
     self.food_x = random.randint(0,14)     
     self.food_y = random.randint(0,19)     
     while Blocklist[self.food_x][self.food_y] == 1:      
      self.food_x = random.randint(0,14)      
      self.food_y = random.randint(0,19)     
     Blocklist[self.food_x][self.food_y] = 1     
     Labellist[self.food_x][self.food_y].config(bg = 'red', relief = tk.RIDGE) 
     self.snakelen += 1     
     Snakelist.insert(0,(x0,y0 + 1))      
     self.x = x0     
     self.y = y0 + 1 
    elif (x0>=0 and x0<height and y0+1>=0 and y0+1<width and Blocklist[x0][y0+1] == 0) or (self.x_tail == x0 and self.y_tail == y0+1):              
     Blocklist[self.x_tail][self.y_tail] = 0     
     Labellist[self.x_tail][self.y_tail].config(bg = 'black', relief = tk.FLAT)     
     Blocklist[x0][y0+1] = 1     
     Labellist[x0][y0+1].config(bg = 'green', relief = tk.RAISED)     
     Labellist[x0][y0].config(bg = 'white', relief = tk.RAISED) 
     del Snakelist[self.snakelen - 1]     
     Snakelist.insert(0,(x0,y0 + 1))      
     self.x = x0     
     self.y = y0 + 1     
     self.x_tail = Snakelist[self.snakelen - 1][0]     
     self.y_tail = Snakelist[self.snakelen - 1][1]    
    else:     
     tk.messagebox.showinfo(title = 'snake', message = 'game over!!!')     
     self.overflag = 1  
  self.after(self.time,self.Onetime)
def Start_Stop(): 
 app.Istart = 1 - app.Istart 
def Restart(): 
 app.Restart(0) 
#主菜单
mainmenu = tk.Menu(window)
window['menu'] = mainmenu
#二级菜单:game
gamemenu=tk.Menu(mainmenu)
mainmenu.add_cascade(label='游戏',menu=gamemenu)
gamemenu.add_command(label = '开始/暂停',command=Start_Stop)
gamemenu.add_command(label = '重置',command=Restart)
gamemenu.add_command(label = '退出',command=window.quit)
app = App(window)  
window.mainloop()

更多有趣的经典小游戏实现专题,分享给大家:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 文件操作api(文件操作函数)
Aug 28 Python
Python设计模式之抽象工厂模式原理与用法详解
Jan 15 Python
Python生成MD5值的两种方法实例分析
Apr 26 Python
python3对接mysql数据库实例详解
Apr 30 Python
基于Python打造账号共享浏览器功能
May 30 Python
利用python在大量数据文件下删除某一行的例子
Aug 21 Python
python中从for循环延申到推导式的具体使用
Nov 29 Python
简单了解Python读取大文件代码实例
Dec 18 Python
tensorflow多维张量计算实例
Feb 11 Python
python使用yaml 管理selenium元素的示例
Dec 01 Python
Python实现DBSCAN聚类算法并样例测试
Jun 22 Python
Python开发简易五子棋小游戏
May 02 Python
Python使用struct处理二进制(pack和unpack用法)
Nov 12 #Python
python切割图片的示例
Nov 12 #Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
Nov 12 #Python
Django执行源生mysql语句实现过程解析
Nov 12 #Python
Django Model层F,Q对象和聚合函数原理解析
Nov 12 #Python
在Python中字典按值排序的实现方法
Nov 12 #Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
Nov 12 #Python
You might like
用户的详细注册和判断
2006/10/09 PHP
PHP Squid中可缓存的动态网页设计
2008/09/17 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
2016/06/13 PHP
PHP简单判断手机设备的方法
2016/08/23 PHP
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
2016/09/11 PHP
详解php语言最牛掰的Laravel框架
2017/11/20 PHP
JS简单实现登陆验证附效果图
2013/11/19 Javascript
ie浏览器使用js导出网页到excel并打印
2014/03/11 Javascript
JS实现颜色梯度与渐变效果完整实例
2016/12/30 Javascript
Javascript中prototype与__proto__的关系详解
2018/03/11 Javascript
vue项目中使用tinymce编辑器的步骤详解
2018/09/11 Javascript
用npm-run实现自动化任务的方法示例
2019/01/14 Javascript
Vue中的验证登录状态的实现方法
2019/03/09 Javascript
layui使用表格渲染获取行数据的例子
2019/09/13 Javascript
Python实现二叉树结构与进行二叉树遍历的方法详解
2016/05/24 Python
对python中return和print的一些理解
2017/08/18 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
2018/08/10 Python
Python绘制正余弦函数图像的方法
2018/08/28 Python
深入了解Django中间件及其方法
2019/07/26 Python
Django认证系统实现的web页面实现代码
2019/08/12 Python
基于Python检测动态物体颜色过程解析
2019/12/04 Python
numpy.ndarray 实现对特定行或列取值
2019/12/05 Python
Python搭建HTTP服务过程图解
2019/12/14 Python
Pandas实现一列数据分隔为两列
2020/05/18 Python
Python中关于logging模块的学习笔记
2020/06/03 Python
Python 图片处理库exifread详解
2021/02/25 Python
使用javascript和HTML5 Canvas画的四渐变色播放按钮效果
2014/04/10 HTML / CSS
HTML5实现文件断点续传的方法
2017/01/04 HTML / CSS
法国时尚童装网站:Melijoe
2016/08/10 全球购物
DHC中国官方购物网站:日本通信销售No.1化妆品
2016/08/20 全球购物
C#如何判断当前用户是否输入某个域
2015/12/07 面试题
物流管理专业大学生自荐信
2013/10/04 职场文书
企业趣味活动方案
2014/08/21 职场文书
公司证明怎么写
2014/09/22 职场文书
护理专业自荐信范文
2015/03/06 职场文书
离婚案件上诉状
2015/05/23 职场文书