`
westice
  • 浏览: 116090 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

wxpython贪食蛇(练手项目2)

阅读更多

      贪食蛇不是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()



 
分享到:
评论

相关推荐

    练手项目1(wxpython连连看)

    【标题】"wxpython连连看"是一个练习项目,旨在帮助开发者熟悉并掌握使用Python的wxPython库进行图形用户界面(GUI)开发。wxPython是一个流行的跨平台GUI工具包,它为Python提供了对wxWidgets库的封装,使得开发者...

    wxPython贪吃蛇

    wxPython贪吃蛇源码,实现了最基本的蛇、食物、蛇吃食物、失败判断

    wxPython贪吃蛇源码与打包程序

    2. **面向对象编程(OOP)**:贪吃蛇游戏通常会采用面向对象的设计方式,将蛇、食物、边界等元素作为类来实现,每个类包含其特有的属性(如位置、长度等)和方法(如移动、吃食物等)。 3. **wxPython库**:...

    wxPython-4.0.7.post2.tar.gz

    **wxPython 4.0.7.post2:Python GUI编程的利器** `wxPython` 是一个流行的Python绑定库,它提供了跨平台的图形用户界面(GUI)工具包,基于C++实现的`wxWidgets`库。`wxWidgets`库自身支持多种操作系统,包括...

    Python 的WxPython库开源扫雷游戏

    Python WxPython开源扫雷游戏PyMine为开源扫雷游戏PyMine 使用Python语言和WxPython UI框架。本例移植自开源例程JMine 请在程序所在目录使用python PyMine.py启动例程需要先安装Python 3.11和wxPython 4.2Python ...

    wxPython-demo-4.0.3.tar:wxPython官方demo

    通过查看和运行这些例子,开发者可以了解如何在实际项目中运用wxPython的各种组件和功能。这个版本可能包含了大量的演示程序,涵盖了从基础控件到复杂布局设计的各种示例。 **学习wxPython** 1. **基础控件**:...

    wxPython几本好书

    几本很不错的关于python gui的wxPython的书,包括“wxPython in Action(中文版)” 活学活用wxPython “《wxPython in Action》Noel Rappin, Robin Dunn著 2006年版”

    wxpython中文文档(极好查询学习)

    【wxPython中文文档详解】 wxPython是一款用于创建GUI(图形用户界面)的Python库,它提供了丰富的组件和功能,使得开发者能够用Python语言构建出美观且功能强大的桌面应用程序。wxPython是基于流行的wxWidgets库,...

    wxPython in Action 活学活用wxPython

    通过《活学活用wxPython》,读者不仅可以学习到wxPython的基础知识,还能接触到实际项目开发中的常见问题和解决方案。书中丰富的示例代码和清晰的图解有助于加深理解,使读者能够在实践中快速上手,灵活运用wxPython...

    wxPython-demo-4.0.6_wxpython官方demo_wxPython-demo_wxpython_DEMO_w

    这个压缩包文件"wxPython-demo-4.0.6_wxpython官方demo_wxPython-demo_wxpython_DEMO_w"包含了wxPython的官方演示程序,是学习和探索wxPython功能的理想资源。 【wxPython Demo】是wxPython库附带的一系列示例和...

    WxPython实现无边框界面

    在Python的GUI编程中,WxPython库是一个广泛使用的工具,它提供了丰富的控件和功能,使得开发者能够方便地创建出美观且功能完备的图形用户界面。无边框界面是一种特殊的界面设计,它去掉了窗口的常规边框,通常用于...

    wxPython官方文档

    2. **框架(Frames)**:框架是wxPython应用中的顶级窗口,可以包含其他控件和布局管理器。 3. **面板(Panels)**:面板是放置在框架内的容器,用于组织和排列控件。 4. **布局管理器(Layout Managers)**:布局...

    wxPython-入门教程.pdf

    2. `wxPython.wx`包含了所有与GUI相关的类和函数。 3. 定义了一个名为_window的类,继承自wxFrame,这是wxPython中的一个基本窗口类。 4. `__init__`方法是初始化函数,创建了一个窗口实例,设置了窗口的大小、样式...

    wxPython-demo-4.0.0b2.tar.gz_wxPython demo_wxpython_wxpython de

    【标题】"wxPython-demo-4.0.0b2.tar.gz"是一个包含"wxPython"演示项目的压缩文件,版本为4.0.0b2。"wxPython demo"是这个压缩包的主要内容,它是基于Python的一个GUI工具包——wxPython的示例代码集合。 【描述】...

    python2.4 and wxPython

    这些库的集成打包对于基于Python 2.4和wxPython的项目非常有用,它们提供了构建、运行和扩展应用程序所需的必要组件。不过,值得注意的是,由于这些软件包都是较老的版本,可能无法与现代的Python代码或库兼容,因此...

    wxPython教程及实例

    2. **基础知识**:讲解`wxPython`的基本概念,如窗口、框架、面板、事件处理和布局管理器。 3. **控件与组件**:详述各种控件的使用,如按钮、文本框、复选框、单选按钮、列表框、滑块等,以及如何在界面中添加它们...

    wxpython实战

    ### wxPython实战知识点详解 #### 一、wxPython入门概览 **1.1 开始wxPython** - **wxPython简介:** wxPython是一个用于Python的GUI开发工具包,它基于wxWidgets C++库,提供了丰富的组件来创建跨平台的应用程序...

    wxpython中文教程wxpython中文教程

    [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_...

    wxpython3.9_py2.7

    2. **wxPython2.9-win32-docs-demos-2.9.4.0.exe** - 这是一个包含wxPython 2.9的Windows 32位版本的文档和演示程序的安装包,可能包括API参考、示例代码和教程。 3. **wxPython in Action.pdf** - 这可能是另一本...

Global site tag (gtag.js) - Google Analytics