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程序员易犯的错误
Dec 15 Python
Python 含参构造函数实例详解
May 25 Python
python 垃圾收集机制的实例详解
Aug 20 Python
Python基础学习之常见的内建函数整理
Sep 06 Python
Python中GeoJson和bokeh-1的使用讲解
Jan 03 Python
python write无法写入文件的解决方法
Jan 23 Python
详解python读取和输出到txt
Mar 29 Python
Python Flask 搭建微信小程序后台详解
May 06 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
Jul 31 Python
keras:model.compile损失函数的用法
Jul 01 Python
Python WebSocket长连接心跳与短连接的示例
Nov 24 Python
如何利用python生成MD5并去重
Dec 07 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垃圾回收机制简单说明
2010/07/22 PHP
php中有关合并某一字段键值相同的数组合并的改进
2015/03/10 PHP
微信 getAccessToken方法详解及实例
2016/11/23 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
2016/12/05 PHP
PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
2017/05/29 PHP
Laravel框架实现多个视图共享相同数据的方法详解
2019/07/09 PHP
JQUERY 获取IFrame中对象及获取其父窗口中对象示例
2013/08/19 Javascript
文本框回车提交与禁止提交示例
2013/09/27 Javascript
使用forever管理nodejs应用教程
2014/06/03 NodeJs
Javascript代码实现仿实例化类
2015/04/03 Javascript
JavaScript搜索字符串并将搜索结果返回到字符串的方法
2015/04/06 Javascript
ECMAScript6函数剩余参数(Rest Parameters)
2015/06/12 Javascript
jquery左右全屏大尺寸多图滑动效果代码分享
2015/08/28 Javascript
js提交form表单,并传递参数的实现方法
2016/05/25 Javascript
全面了解JS中的匿名函数
2016/06/29 Javascript
javascript简写常用的12个技巧(可以大大减少你的js代码量)
2020/03/28 Javascript
JavaScript函数、闭包、原型、面向对象学习笔记
2018/09/06 Javascript
js实现移动端轮播图
2020/12/21 Javascript
vue draggable resizable 实现可拖拽缩放的组件功能
2019/07/15 Javascript
Vue实现兄弟组件间的联动效果
2020/01/21 Javascript
VsCode里的Vue模板的实现
2020/08/12 Javascript
python中使用OpenCV进行人脸检测的例子
2014/04/18 Python
Python深入学习之特殊方法与多范式
2014/08/31 Python
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
2016/01/20 Python
Python中字典的浅拷贝与深拷贝用法实例分析
2018/01/02 Python
使用Django和Python创建Json response的方法
2018/03/26 Python
对python读取CT医学图像的实例详解
2019/01/24 Python
Python实现求两个数组交集的方法示例
2019/02/23 Python
Python中logging日志库实例详解
2020/02/19 Python
给定一个时间点,希望得到其他时间点
2013/11/07 面试题
历史学专业毕业生求职信
2013/09/27 职场文书
同志主要表现材料
2014/08/21 职场文书
班子群众路线教育实践个人对照检查材料思想汇报
2014/09/30 职场文书
Python实现Telnet自动连接检测密码的示例
2021/04/16 Python
Python Matplotlib库实现画局部图
2021/11/17 Python
英国数字版游戏销量周榜公布 《小缇娜的奇幻之地》登顶
2022/04/03 其他游戏