贪食蛇不是fps,没有那么高的效率,不可能更新窗口里面的全部内容,这样就需要一个算法来处理这个问题,
算法:假设小蛇由一个蛇头,n个蛇身组成,整个蛇的前进由蛇头控制,方向由用户控制。
每次刷新时,从蛇尾开始遍历,把(n-1)方块的位置赋给n方块,直到n为1,最后将蛇头的位置赋给0方块。
显示时不需更新窗口中每一个图片,如果蛇总共(n+1)个方块,则只需更新(n+2)个方块,(n+1)个蛇方块当然更新,还有一个就是这一次蛇腾出来的空间(即上一次蛇尾的位置)用土地本来的图片替换,这样整个蛇就会跟着蛇头跑不会留下痕迹。
实现了一个基本功能版,靠(wasd)控制方向,里面会随机出现蛋糕,吃掉蛋糕会得分,并且增长蛇身,碰到边界游戏结束
不到200行就搞定了,需要图片在附件
#-*- coding:utf-8 -*-
'''
Created on 2011-3-23
经典游戏 --贪食蛇
@author: 123
'''
import wx
import random,time
#蛇身方块
class westiceSnakeBody():
def __init__(self):
randnum=int(random.random()*4)
imagename='snakeskin'+str(randnum)+'.jpg'
img1=wx.Image(imagename,wx.BITMAP_TYPE_ANY)
self.img1=img1.Scale(30,30)#2 缩小图像
self.x=-1
self.y=-1
#蛇体
class westiceSnake():
def __init__(self):
self.bodys=[]
self.headx=int(random.random()*(10))+5
self.heady=int(random.random()*(10))+5
self.direct=int(random.random()*4)
self.img1=wx.Image('snakehead.jpg',wx.BITMAP_TYPE_ANY)
self.headimg90=self.img1.Rotate90(True)
self.headimg180=self.headimg90.Rotate90(True)
self.headimg_90=self.img1.Rotate90(False)
self.headimg1=self.img1
self.prev_snakex=self.headx
self.prev_snakey=self.heady
def update(self):#更新
#保存小蛇前一时刻最后一个位置
if len(self.bodys)!=0:
self.prev_snakex=self.bodys[len(self.bodys)-1].x
self.prev_snakey=self.bodys[len(self.bodys)-1].y
else:
self.prev_snakex=self.headx
self.prev_snakey=self.heady
if len(self.bodys)!=0:
for index in range(len(self.bodys)-1,0,-1):
self.bodys[index].x=self.bodys[index-1].x
self.bodys[index].y=self.bodys[index-1].y
self.bodys[0].x=self.headx
self.bodys[0].y=self.heady
#移动小蛇
if self.direct==0:
self.headx+=1#向右
if self.direct==1:
self.heady+=1#向下
if self.direct==2:
self.headx-=1#向左
if self.direct==3:
self.heady-=1#向上
#旋转一下蛇头
self.headimg1=self.img1
if self.direct==0:
self.headimg1=self.headimg90
if self.direct==1:
self.headimg1=self.headimg180
if self.direct==2:
self.headimg1=self.headimg_90
self.headimg1=self.headimg1.Scale(30,30)
#游戏主窗口
class MyFrame(wx.Frame):
gridwidth=20
gridheight=20
landsqurelist=[]
first=True
def __init__(self):
wx.Frame.__init__(self,None,-1,"My Frame",size=(800,700))
self.panel=wx.Panel(self,-1)
self.score=0
self.scoretxt=wx.StaticText(self.panel,-1,'得分:'+str(self.score),pos=(630,300))
self.gamestatustxt=wx.StaticText(self.panel,-1,'游戏状态:正在运行',pos=(630,350))
fgs=wx.FlexGridSizer(cols=self.gridwidth,hgap=0,vgap=0)
self.panel.Bind(wx.EVT_KEY_DOWN,self.OnKeyDown)
self.panel.SetFocus()
for col in range(self.gridwidth):
random.seed(time.time())
for row in range(self.gridheight):
#加载草地
randnum=int(random.random()*4)
#随即加蛋糕
if random.random()<0.02:
randnum=-1
imagename='land'+str(randnum)+'.jpg'
img1=wx.Image(imagename,wx.BITMAP_TYPE_ANY)
img1=img1.Scale(30,30)#2 缩小图像
sb1=wx.StaticBitmap(self.panel,-1,wx.BitmapFromImage(img1))
sb1.randnum=randnum #存入图片名
fgs.Add(sb1)
self.landsqurelist.append(sb1)
self.panel.SetSizerAndFit(fgs)
#生成蛇,初始化位置,
self.westicesnake=westiceSnake()
#设定一个时钟
self.timer1=wx.Timer(self)
self.Bind(wx.EVT_TIMER,self.frameUpdate,self.timer1)
self.timer1.Start(500) #可在此设置速度
#键盘绑定
def OnKeyDown(self,event):
if ord('A')==event.GetKeyCode()and self.westicesnake.direct!=0:
#向左
self.westicesnake.direct=2
if ord('D')==event.GetKeyCode()and self.westicesnake.direct!=2:
#向右
self.westicesnake.direct=0
if ord('S')==event.GetKeyCode()and self.westicesnake.direct!=3:
#向下
self.westicesnake.direct=1
if ord('W')==event.GetKeyCode()and self.westicesnake.direct!=1:
#向上
self.westicesnake.direct=3
#帧更新
def frameUpdate(self,event):
#游戏算法实现处
if self.westicesnake.headx>=0and self.westicesnake.headx<self.gridwidth\
and self.westicesnake.heady>=0and self.westicesnake.heady<self.gridheight:
tempindex=self.getIndex(self.westicesnake.headx,self.westicesnake.heady)
#显示蛇头
self.landsqurelist[tempindex].SetBitmap(wx.BitmapFromImage(self.westicesnake.headimg1))
#显示小蛇身体
for body in self.westicesnake.bodys:
tempindex=self.getIndex(body.x,body.y)
self.landsqurelist[tempindex].SetBitmap(wx.BitmapFromImage(body.img1))
#显示上一次腾出的位置
if not self.first:
tempindex=self.getIndex(self.westicesnake.prev_snakex,self.westicesnake.prev_snakey)
tempimagenum=self.landsqurelist[tempindex].randnum
tempimagename='land'+str(tempimagenum)+'.jpg'
img1=wx.Image(tempimagename,wx.BITMAP_TYPE_ANY)
img1=img1.Scale(30,30)
self.landsqurelist[tempindex].SetBitmap(wx.BitmapFromImage(img1))
else:
self.first=False
#遇到蛋糕吃下,长蛇身,将蛋糕换成land
if self.landsqurelist[tempindex].randnum==(-1):
print '吃蛋糕'
self.score+=1
self.scoretxt.SetLabel('得分:'+str(self.score))
self.landsqurelist[tempindex].randnum=int(random.random()*4)
#加入一个body,设置好坐标,应该是加在上次腾出的地方
snakebody=westiceSnakeBody()
snakebody.x=self.westicesnake.prev_snakex
snakebody.y=self.westicesnake.prev_snakey
self.westicesnake.bodys.append(snakebody)
#在land中随机产生蛋糕
tempindex=int(random.random()*self.gridwidth*self.gridheight)
if self.landsqurelist[tempindex].randnum==-1:
randnum=int(random.random()*4)
imagename='land'+str(randnum)+'.jpg'
self.landsqurelist[tempindex].randnum=randnum
else:
imagename='land-1.jpg'
self.landsqurelist[tempindex].randnum=-1
img1=wx.Image(imagename,wx.BITMAP_TYPE_ANY)
img1=img1.Scale(30,30)
self.landsqurelist[tempindex].SetBitmap(wx.BitmapFromImage(img1))
else:
self.gamestatustxt.SetLabel('游戏状态:GameOver!')
#移动小蛇
self.westicesnake.update()
#得到图片的x,y坐标
def getX_Y(self,imageindex):
x=imageindex%self.gridwidth
y=imageindex/self.gridwidth
return [x,y]
def getIndex(self,x,y):
return y*self.gridwidth+x
#代码入口
if __name__=='__main__':
app=wx.PySimpleApp()
frame=MyFrame()
frame.Show(True)
app.MainLoop()
分享到:
相关推荐
【标题】"wxpython连连看"是一个练习项目,旨在帮助开发者熟悉并掌握使用Python的wxPython库进行图形用户界面(GUI)开发。wxPython是一个流行的跨平台GUI工具包,它为Python提供了对wxWidgets库的封装,使得开发者...
wxPython贪吃蛇源码,实现了最基本的蛇、食物、蛇吃食物、失败判断
2. **面向对象编程(OOP)**:贪吃蛇游戏通常会采用面向对象的设计方式,将蛇、食物、边界等元素作为类来实现,每个类包含其特有的属性(如位置、长度等)和方法(如移动、吃食物等)。 3. **wxPython库**:...
**wxPython 4.0.7.post2:Python GUI编程的利器** `wxPython` 是一个流行的Python绑定库,它提供了跨平台的图形用户界面(GUI)工具包,基于C++实现的`wxWidgets`库。`wxWidgets`库自身支持多种操作系统,包括...
Python WxPython开源扫雷游戏PyMine为开源扫雷游戏PyMine 使用Python语言和WxPython UI框架。本例移植自开源例程JMine 请在程序所在目录使用python PyMine.py启动例程需要先安装Python 3.11和wxPython 4.2Python ...
通过查看和运行这些例子,开发者可以了解如何在实际项目中运用wxPython的各种组件和功能。这个版本可能包含了大量的演示程序,涵盖了从基础控件到复杂布局设计的各种示例。 **学习wxPython** 1. **基础控件**:...
几本很不错的关于python gui的wxPython的书,包括“wxPython in Action(中文版)” 活学活用wxPython “《wxPython in Action》Noel Rappin, Robin Dunn著 2006年版”
【wxPython中文文档详解】 wxPython是一款用于创建GUI(图形用户界面)的Python库,它提供了丰富的组件和功能,使得开发者能够用Python语言构建出美观且功能强大的桌面应用程序。wxPython是基于流行的wxWidgets库,...
通过《活学活用wxPython》,读者不仅可以学习到wxPython的基础知识,还能接触到实际项目开发中的常见问题和解决方案。书中丰富的示例代码和清晰的图解有助于加深理解,使读者能够在实践中快速上手,灵活运用wxPython...
这个压缩包文件"wxPython-demo-4.0.6_wxpython官方demo_wxPython-demo_wxpython_DEMO_w"包含了wxPython的官方演示程序,是学习和探索wxPython功能的理想资源。 【wxPython Demo】是wxPython库附带的一系列示例和...
在Python的GUI编程中,WxPython库是一个广泛使用的工具,它提供了丰富的控件和功能,使得开发者能够方便地创建出美观且功能完备的图形用户界面。无边框界面是一种特殊的界面设计,它去掉了窗口的常规边框,通常用于...
2. **框架(Frames)**:框架是wxPython应用中的顶级窗口,可以包含其他控件和布局管理器。 3. **面板(Panels)**:面板是放置在框架内的容器,用于组织和排列控件。 4. **布局管理器(Layout Managers)**:布局...
2. `wxPython.wx`包含了所有与GUI相关的类和函数。 3. 定义了一个名为_window的类,继承自wxFrame,这是wxPython中的一个基本窗口类。 4. `__init__`方法是初始化函数,创建了一个窗口实例,设置了窗口的大小、样式...
【标题】"wxPython-demo-4.0.0b2.tar.gz"是一个包含"wxPython"演示项目的压缩文件,版本为4.0.0b2。"wxPython demo"是这个压缩包的主要内容,它是基于Python的一个GUI工具包——wxPython的示例代码集合。 【描述】...
这些库的集成打包对于基于Python 2.4和wxPython的项目非常有用,它们提供了构建、运行和扩展应用程序所需的必要组件。不过,值得注意的是,由于这些软件包都是较老的版本,可能无法与现代的Python代码或库兼容,因此...
2. **基础知识**:讲解`wxPython`的基本概念,如窗口、框架、面板、事件处理和布局管理器。 3. **控件与组件**:详述各种控件的使用,如按钮、文本框、复选框、单选按钮、列表框、滑块等,以及如何在界面中添加它们...
### wxPython实战知识点详解 #### 一、wxPython入门概览 **1.1 开始wxPython** - **wxPython简介:** wxPython是一个用于Python的GUI开发工具包,它基于wxWidgets C++库,提供了丰富的组件来创建跨平台的应用程序...
[2]from wxPython.wx import * [3]class _window(wxFrame): [4] def __init__(self, parent, id, title): [5] wxFrame.__init__(self, parent, -1, title, size=(200, 100), style=wxDEFAULT_FRAME_STYLE | wxNO_...
2. **wxPython2.9-win32-docs-demos-2.9.4.0.exe** - 这是一个包含wxPython 2.9的Windows 32位版本的文档和演示程序的安装包,可能包括API参考、示例代码和教程。 3. **wxPython in Action.pdf** - 这可能是另一本...