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中zip()函数用法实例教程
Jul 31 Python
Python的Django框架使用入门指引
Apr 15 Python
Python中super()函数简介及用法分享
Jul 11 Python
python 中的列表生成式、生成器表达式、模块导入
Jun 19 Python
python 在某.py文件中调用其他.py内的函数的方法
Jun 25 Python
python实现函数极小值
Jul 10 Python
python代码实现逻辑回归logistic原理
Aug 07 Python
Python流程控制 while循环实现解析
Sep 02 Python
详解基于python-django框架的支付宝支付案例
Sep 23 Python
Python 实现一行输入多个数字(用空格隔开)
Apr 29 Python
解决运行出现'dict' object has no attribute 'has_key'问题
Jul 15 Python
Python必须了解的35个关键词
Jul 16 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
php中计算时间差的几种方法
2009/12/31 PHP
php数组转换js数组操作及json_encode的用法详解
2013/10/26 PHP
jquery.Ajax()方法调用Asp.Net后台的方法解析
2014/02/13 Javascript
js判断横竖屏及禁止浏览器滑动条示例
2014/04/29 Javascript
jQuery .tmpl() 用法示例介绍
2014/08/21 Javascript
jQuery实现的背景动态变化导航菜单效果
2015/08/24 Javascript
基于jQuery实现带动画效果超炫酷的弹出对话框(附源码下载)
2016/02/22 Javascript
深入理解angularjs过滤器
2016/05/25 Javascript
jQuery中的一些常见方法小结(推荐)
2016/06/13 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
vue2.5.2使用http请求获取静态json数据的实例代码
2018/02/27 Javascript
ES6之模版字符串的具体使用
2018/05/17 Javascript
如何使node也支持从url加载一个module详解
2018/06/05 Javascript
详解小程序云开发数据库
2019/05/20 Javascript
JS/jQuery实现超简单的Table表格添加,删除行功能示例
2019/07/31 jQuery
Electron 调用命令行(cmd)
2019/09/23 Javascript
[00:12]DAC2018 天才少年转战三号位,他的SOLO是否仍如昔日般强大?
2018/04/06 DOTA
python使用xmlrpclib模块实现对百度google的ping功能
2015/06/02 Python
详解Python3中yield生成器的用法
2015/08/20 Python
Python操作csv文件实例详解
2017/07/31 Python
python实现比较类的两个instance(对象)是否相等的方法分析
2019/06/26 Python
centos7之Python3.74安装教程
2019/08/15 Python
python 动态调用函数实例解析
2019/10/21 Python
Django 自动生成api接口文档教程
2019/11/19 Python
python模拟哔哩哔哩滑块登入验证的实现
2020/04/24 Python
Python+unittest+DDT实现数据驱动测试
2020/11/30 Python
新奇的小玩意:IWOOT
2016/07/21 全球购物
班会关于环保演讲稿
2013/12/29 职场文书
环保专业大学生职业规划设计
2014/01/10 职场文书
大二学习计划书范文
2014/04/27 职场文书
小学生勤俭节约演讲稿
2014/08/28 职场文书
2015年医务人员医德医风自我评价
2015/03/03 职场文书
端午节寄语2015
2015/03/23 职场文书
社区党员干部承诺书
2015/05/04 职场文书
2017春节晚会开幕词
2016/03/03 职场文书
elasticSearch-api的具体操作步骤讲解
2021/06/28 Java/Android