贪吃蛇代码(捕捉方向键需要使用wx.EVT_KEY_UP事件)

来源:互联网 发布:鸿雁传书软件下载 编辑:程序博客网 时间:2024/06/04 19:57

今天用wxPython做了个贪吃蛇,当是对wxPythonGDI的巩固。

关于如何在屏幕上绘画,请参见wxPython In Action的第六章1.1在屏幕上绘画

贪吃蛇源码下载不要积分

贪吃蛇源码及py2exe打包结果下载骗一个积分

突然发现一个bug,buffer的实际面积比窗口显示的要大,也就是说,当snakeHead的X是600的时候,snake已经超出右边界了,此时游戏还未失败-  -晚上用sizer修改一下。

资源中的代码与最终代码不同,请参考贪吃蛇全部代码

来画一条蛇吧

贪吃蛇首先得要有一条蛇才行,蛇细细长长的,就是一条线,那么怎么画一条线呢?以下代码就是如何画一条线,这与贪吃蛇无关,仅仅只是先初步了解怎么画。请注意OnPaint中的

[python] view plaincopyprint?
  1. dc = wx.BufferedPaintDC(selfself.buffer)  
可以注释掉试试

[python] view plaincopyprint?
  1. # -*- coding:utf-8 -*-   
  2. ''''' 
  3. Created on 2013-1-16 
  4.  
  5. @author: jincheng 
  6. '''  
  7. import wx  
  8.   
  9. class SnakeWindow(wx.Window):  
  10.     ''''' 
  11.     贪吃蛇 
  12.     '''  
  13.     def __init__(self,parent):  
  14.         wx.Window.__init__(self,parent,-1)  
  15.         self.snakeColor='black'  
  16.         self.SetBackgroundColour('green')  
  17.         self.snakeThickness = 10  
  18.         self.snake = [(100,100),(100,200)]  
  19.         self.pen = wx.Pen(self.snakeColor, self.snakeThickness, wx.SOLID)  
  20.         self.buffer = wx.EmptyBitmap(800,600)  
  21.         dc = wx.BufferedDC(wx.ClientDC(self),self.buffer)  
  22.         dc.SetPen(self.pen)  
  23.         dc.DrawLine(100,200,300,400)  
  24.         self.Bind(wx.EVT_PAINT, self.OnPaint)  
  25.         #self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)  
  26.           
  27.     def OnPaint(self, event):  
  28.         dc = wx.BufferedPaintDC(selfself.buffer)#处理一个paint(描绘)请求  
  29.         print 'onpaint'  
  30.   
  31.     def OnLeftUp(self, event):  
  32.         dc = wx.BufferedDC(wx.ClientDC(self),self.buffer)  
  33.         dc.SetPen(self.pen)  
  34.         pos = event.GetPositionTuple()  
  35.         dc.DrawPoint(*pos)  
  36.         print 'drawpoint'  
  37.       
  38. class SnakeFrame(wx.Frame):  
  39.     def __init__(self,parent):  
  40.         wx.Frame.__init__(self,parent,-1,'title',size=(800,600))          
  41.         self.sketch = SnakeWindow(self)  
  42.    
  43.    
  44. if __name__ == '__main__':  
  45.     app = wx.PySimpleApp()  
  46.     frame = SnakeFrame(None)  
  47.     frame.Show(True)  
  48.     app.MainLoop()             

让蛇动起来

现在我知道了怎么画一条线,但是线不会动啊,不会动的蛇是死蛇而不是贪吃蛇,下面要让蛇动起来。

蛇应该怎么动?鼠标点一下动一下呢还是键盘按一下动一下?方向键不动的时候蛇也应该会动才对,不然的话该叫懒蛇。

这里需要用到wx.Timer,添加一个timer事件。

[html] view plaincopyprint?
  1.         self.runtime = wx.Timer(self)  
  2.         self.runtime.Start(100)#100毫秒动一下  
  3.         self.Bind(wx.EVT_TIMER, self.OnTimer)  
  4.   
  5.     #每一百毫秒做一件事  
  6.     def OnTimer(self,event):  
  7.         self.SnakeMove()  
SnakeMove顾名思义是贪吃蛇开始移动了。

此时我们需要考虑两件事:1、蛇往哪个方向移动;2、蛇每次移动多少距离。当然这条蛇只会或垂直方向或水平方向移动

蛇默认是向下移动的,设一个属性self.snakeDire = 317。为什么设317呢?

我们知道,按方向键是可以控制蛇的前进方向的,所以我们要加一个键盘事件。可以打出keycode看看,注意贪吃蛇不能向尾巴方向倒车,不知道两头蛇行不行。

[python] view plaincopyprint?
  1.         self.Bind(wx.EVT_KEY_UP,self.OnKeyUp)  
  2.       
  3.     def OnKeyUp(self,event):  
  4.         code = event.GetKeyCode()  
  5.         if code >= 314 and code <=317 and code != self.snakeDire - 2 and code != self.snakeDire + 2:  
  6.             self.snakeDire = code  
获得了蛇行动的方向,就可以开始Move了

[python] view plaincopyprint?
  1. def SnakeMove(self):  
  2.     length = len(self.snake)  
  3.     self.snake.pop(length-1)#shift  
  4.     space = self.snakeSpace  
  5.     x = 0  
  6.     y = 0  
  7.     if self.snakeDire == 317:  
  8.         y = space  
  9.     elif self.snakeDire == 316:  
  10.         x = space  
  11.     elif self.snakeDire == 315:  
  12.         y = -space  
  13.     elif self.snakeDire == 314:  
  14.         x = -space  
  15.     newhead = (self.snakeHead[0] + x,self.snakeHead[1] + y)  
  16.     self.snake.insert(0,newhead)  
  17.     self.snakeHead = newhead  
  18.     dc = wx.BufferedDC(wx.ClientDC(self),self.buffer)  
  19.     dc.SetPen(self.pen)  
  20.     print self.snake  
  21.     
接着将画蛇的代码整理到一个方法里

[python] view plaincopyprint?
  1. def SnakeInstantiate(self,dc):      
  2.         ''''' 
  3.         画出蛇 
  4.         '''  
  5.         last = self.snake[0]  
  6.         length = len(self.snake)  
  7.         for s in self.snake[1:length]:  
  8.             line = last + s  
  9.             dc.DrawLine(*line)  
  10.             last = s  
  11.       

此阶段全部代码

[python] view plaincopyprint?
  1. # -*- coding:utf-8 -*-   
  2. ''''' 
  3. Created on 2013-1-16 
  4.  
  5. @author: jincheng 
  6. '''  
  7. import wx  
  8.   
  9. class SnakeWindow(wx.Window):  
  10.     ''''' 
  11.     贪吃蛇 
  12.     '''  
  13.     def __init__(self,parent):  
  14.         wx.Window.__init__(self,parent,-1)  
  15.         self.snakeColor='black'  
  16.         self.SetBackgroundColour('green')  
  17.         self.snakeThickness = 10  
  18.         self.snake = [(100,100),(100,200),(100,300)]  
  19.         self.snakeHead = (100,300)  
  20.         self.snakeSpace = 10  
  21.         self.pen = wx.Pen("red"10, wx.SOLID)   
  22.         self.winsize = self.GetClientSize()  
  23.         self.buffer = wx.EmptyBitmap(800,600)  
  24.           
  25.         self.snakeDire = 317#蛇头向下  
  26.                   
  27.         self.runtime = wx.Timer(self)  
  28.         self.runtime.Start(100)#100毫秒动一下  
  29.   
  30.         self.Bind(wx.EVT_PAINT, self.OnPaint)  
  31.         self.Bind(wx.EVT_KEY_UP,self.OnKeyUp)  
  32.         self.Bind(wx.EVT_TIMER, self.OnTimer)  
  33.         #self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)  
  34.       
  35.     def SnakeMove(self):  
  36.         length = len(self.snake)  
  37.         self.snake.pop(length-1)#shift  
  38.         space = self.snakeSpace  
  39.         x = 0  
  40.         y = 0  
  41.         if self.snakeDire == 317:  
  42.             y = space  
  43.         elif self.snakeDire == 316:  
  44.             x = space  
  45.         elif self.snakeDire == 315:  
  46.             y = -space  
  47.         elif self.snakeDire == 314:  
  48.             x = -space  
  49.         newhead = (self.snakeHead[0] + x,self.snakeHead[1] + y)  
  50.         self.snake.insert(0,newhead)  
  51.         self.snakeHead = newhead  
  52.         dc = wx.BufferedDC(wx.ClientDC(self),self.buffer)  
  53.         dc.SetPen(self.pen)  
  54.         #dc.Clear()   
  55.         print self.snake  
  56.         self.SnakeInstantiate(dc)  
  57.   
  58.           
  59.     def SnakeInstantiate(self,dc):      
  60.         ''''' 
  61.         画出蛇 
  62.         '''  
  63.         last = self.snake[0]  
  64.         length = len(self.snake)  
  65.         for s in self.snake[1:length]:  
  66.             line = last + s  
  67.             dc.DrawLine(*line)  
  68.             last = s  
  69.       
  70.     def OnTimer(self,event):  
  71.         self.SnakeMove()  
  72.               
  73.     def OnKeyUp(self,event):  
  74.         code = event.GetKeyCode()  
  75.         if code >= 314 and code <=317 and code != self.snakeDire - 2 and code != self.snakeDire + 2:  
  76.             self.snakeDire = code  
  77.               
  78.           
  79.     def OnPaint(self, event):  
  80.         dc = wx.BufferedPaintDC(selfself.buffer)#13 处理一个paint(描绘)请求  
  81.         print 'onpaint'  
  82.   
  83.     def OnLeftUp(self, event):  
  84.         dc = wx.BufferedDC(wx.ClientDC(self),self.buffer)  
  85.         dc.SetPen(self.pen)  
  86.         pos = event.GetPositionTuple()  
  87.         dc.DrawPoint(*pos)  
  88.         print 'drawpoint'  
  89.       
  90. class SnakeFrame(wx.Frame):  
  91.     def __init__(self,parent):  
  92.         wx.Frame.__init__(self,parent,-1,'title',size=(800,600))          
  93.         self.sketch = SnakeWindow(self)  
  94.    
  95.    
  96. if __name__ == '__main__':  
  97.     app = wx.PySimpleApp()  
  98.     frame = SnakeFrame(None)  
  99.     frame.Show(True)  
  100.     app.MainLoop()             

运行一下试试?

为什么蛇明明什么都没吃,却越来越长?打印结果也依然娇小啊

请注意,在画新的图案前,一定要clear一下旧的图案 ,凡游过,不留下痕迹。放开dc.Clear()那行代码!!!

食物在哪里

光有蛇没有食物是玩不了贪吃蛇的,食物怎么画?1、食物得出现在某个坐标上(x,y);2、食物得有一定的体积a*b,哪怕是1*1。

我们可以认为食物是一个(x,y,x+a,y+b)的线段,当然,也可以认为是一个长a宽b左上角坐标是(x,y)的矩形。在这里,我使用dc.DrawRectangle

[python] view plaincopyprint?
  1.         self.foodLoc = ()  
  2.         self.foodWidth = 5  
  3.         #生产食物   
  4.         self.FoodManufacture()  
  5.   
  6.     def FoodManufacture(self):  
  7.         x = random.randint(0,800)  
  8.         y = random.randint(0,600)  
  9.         self.foodLoc = (x,y)  
  10.       
  11.     def foodInstantiate(self,dc):   
  12.         ''''' 
  13.         画出食物 
  14.         '''  
  15.         food = self.foodLoc + (self.foodWidth,self.foodWidth)  
  16.         dc.DrawRectangle(*food)  

此阶段全部代码

[python] view plaincopyprint?
  1. # -*- coding:utf-8 -*-   
  2. ''''' 
  3. Created on 2013-1-16 
  4.  
  5. @author: jincheng 
  6. '''  
  7. import wx  
  8. import random  
  9.   
  10. class SnakeWindow(wx.Window):  
  11.     ''''' 
  12.     贪吃蛇 
  13.     '''  
  14.     def __init__(self,parent):  
  15.         wx.Window.__init__(self,parent,-1)  
  16.         self.snakeColor='black'  
  17.         self.SetBackgroundColour('green')  
  18.         self.snakeThickness = 10  
  19.         self.snake = [(100,100),(100,200),(100,300)]  
  20.         self.snakeHead = (100,300)  
  21.         self.snakeSpace = 10  
  22.           
  23.         self.foodLoc = ()  
  24.         self.foodWidth = 5  
  25.           
  26.         self.FoodManufacture()  
  27.           
  28.         self.pen = wx.Pen("red"10, wx.SOLID)   
  29.         self.winsize = self.GetClientSize()  
  30.         self.buffer = wx.EmptyBitmap(800,600)  
  31.         self.snakeDire = 317#蛇头向下  
  32.         #self.foodInstantiate()   
  33.         self.runtime = wx.Timer(self)  
  34.         self.runtime.Start(100)#100毫秒动一下  
  35.   
  36.         self.Bind(wx.EVT_PAINT, self.OnPaint)  
  37.         self.Bind(wx.EVT_KEY_UP,self.OnKeyUp)  
  38.         self.Bind(wx.EVT_TIMER, self.OnTimer)  
  39.         #self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)  
  40.       
  41.     def FoodManufacture(self):  
  42.         x = random.randint(0,800)  
  43.         y = random.randint(0,600)  
  44.         self.foodLoc = (x,y)  
  45.       
  46.     def foodInstantiate(self,dc):   
  47.         food = self.foodLoc + (self.foodWidth,self.foodWidth)  
  48.         dc.DrawRectangle(*food)  
  49.           
  50.       
  51.     def SnakeMove(self):  
  52.         length = len(self.snake)  
  53.         self.snake.pop(length-1)#shift  
  54.         space = self.snakeSpace  
  55.         x = 0  
  56.         y = 0  
  57.         if self.snakeDire == 317:  
  58.             y = space  
  59.         elif self.snakeDire == 316:  
  60.             x = space  
  61.         elif self.snakeDire == 315:  
  62.             y = -space  
  63.         elif self.snakeDire == 314:  
  64.             x = -space  
  65.         newhead = (self.snakeHead[0] + x,self.snakeHead[1] + y)  
  66.         self.snake.insert(0,newhead)  
  67.         self.snakeHead = newhead  
  68.         dc = wx.BufferedDC(wx.ClientDC(self),self.buffer)  
  69.         dc.SetPen(self.pen)  
  70.         dc.Clear()  
  71.         print self.snake  
  72.         self.SnakeInstantiate(dc)  
  73.           
  74.     def SnakeInstantiate(self,dc):      
  75.         ''''' 
  76.         画出蛇与食物 
  77.         '''  
  78.         self.foodInstantiate(dc)  
  79.         last = self.snake[0]  
  80.         length = len(self.snake)  
  81.         for s in self.snake[1:length]:  
  82.             line = last + s  
  83.             dc.DrawLine(*line)  
  84.             last = s  
  85.       
  86.     def OnTimer(self,event):  
  87.         self.SnakeMove()  
  88.               
  89.     def OnKeyUp(self,event):  
  90.         code = event.GetKeyCode()  
  91.         if code >= 314 and code <=317 and code != self.snakeDire - 2 and code != self.snakeDire + 2:  
  92.             self.snakeDire = code  
  93.               
  94.           
  95.     def OnPaint(self, event):  
  96.         dc = wx.BufferedPaintDC(selfself.buffer)#13 处理一个paint(描绘)请求  
  97.         print 'onpaint'  
  98.   
  99.     def OnLeftUp(self, event):  
  100.         dc = wx.BufferedDC(wx.ClientDC(self),self.buffer)  
  101.         dc.SetPen(self.pen)  
  102.         pos = event.GetPositionTuple()  
  103.         pos = pos + (10,10)  
  104.         dc.Clear()  
  105.         dc.DrawRectangle(*pos)  
  106.         print 'drawpoint'  
  107.       
  108. class SnakeFrame(wx.Frame):  
  109.     def __init__(self,parent):  
  110.         wx.Frame.__init__(self,parent,-1,'title',size=(800,600))          
  111.         self.sketch = SnakeWindow(self)  
  112.    
  113.    
  114. if __name__ == '__main__':  
  115.     app = wx.PySimpleApp()  
  116.     frame = SnakeFrame(None)  
  117.     frame.Show(True)  
  118.     app.MainLoop()             


吃到食物

吃到食物很好理解,蛇的头snakeHead碰到食物的位置foodLoc,就算吃到了,蛇也长大一节,随后重新投放食物

此阶段全部代码

[python] view plaincopyprint?
  1. # -*- coding:utf-8 -*-   
  2. ''''' 
  3. Created on 2013-1-16 
  4.  
  5. @author: jincheng 
  6. '''  
  7. import wx  
  8. import random  
  9.   
  10. class SnakeWindow(wx.Window):  
  11.     ''''' 
  12.     贪吃蛇 
  13.     '''  
  14.     def __init__(self,parent):  
  15.         wx.Window.__init__(self,parent,-1)  
  16.         self.snakeColor='black'  
  17.         self.SetBackgroundColour('green')  
  18.         self.snakeThickness = 10  
  19.         self.snake = [(100,100),(100,200),(100,300)]  
  20.         self.snakeHead = (100,300)  
  21.         self.snakeSpace = 10  
  22.           
  23.         self.foodLoc = ()  
  24.         self.foodWidth = 1  
  25.           
  26.         self.FoodManufacture()  
  27.           
  28.         self.pen = wx.Pen(self.snakeColor, self.snakeThickness, wx.SOLID)   
  29.         self.winsize = self.GetClientSize()  
  30.         self.buffer = wx.EmptyBitmap(800,600)  
  31.         self.snakeDire = 317#蛇头向下  
  32.         #self.foodInstantiate()   
  33.         self.runtime = wx.Timer(self)  
  34.         self.runtime.Start(100)#100毫秒动一下  
  35.   
  36.         self.Bind(wx.EVT_PAINT, self.OnPaint)  
  37.         self.Bind(wx.EVT_KEY_UP,self.OnKeyUp)  
  38.         self.Bind(wx.EVT_TIMER, self.OnTimer)  
  39.         #self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)  
  40.       
  41.     def FoodManufacture(self):  
  42.         x = random.randint(0,80)  
  43.         y = random.randint(0,60)  
  44.         self.foodLoc = (x*10,y*10)  
  45.       
  46.     def foodInstantiate(self,dc):   
  47.         food = self.foodLoc + (self.foodWidth,self.foodWidth)  
  48.         dc.DrawRectangle(*food)  
  49.           
  50.       
  51.     def SnakeMove(self):  
  52.         length = len(self.snake)  
  53.         self.snake.pop(length-1)#shift  
  54.         space = self.snakeSpace  
  55.         x = 0  
  56.         y = 0  
  57.         if self.snakeDire == 317:  
  58.             y = space  
  59.         elif self.snakeDire == 316:  
  60.             x = space  
  61.         elif self.snakeDire == 315:  
  62.             y = -space  
  63.         elif self.snakeDire == 314:  
  64.             x = -space  
  65.         newhead = (self.snakeHead[0] + x,self.snakeHead[1] + y)  
  66.         self.snake.insert(0,newhead)  
  67.         self.snakeHead = newhead  
  68.         dc = wx.BufferedDC(wx.ClientDC(self),self.buffer)  
  69.         dc.SetPen(self.pen)  
  70.         dc.Clear()  
  71.         self.SnakeInstantiate(dc)  
  72.           
  73.     def SnakeInstantiate(self,dc):      
  74.         ''''' 
  75.         画出蛇与食物 
  76.         '''  
  77.         self.foodInstantiate(dc)  
  78.         last = self.snake[0]  
  79.         length = len(self.snake)  
  80.         for s in self.snake[1:length]:  
  81.             line = last + s  
  82.             dc.DrawLine(*line)  
  83.             last = s  
  84.           
  85.         if self.Eat():  
  86.             pass  
  87.           
  88.     def Eat(self):  
  89.         print self.snakeHead,self.foodLoc  
  90.         if self.snakeHead == self.foodLoc:  
  91.             self.snake.insert(0self.foodLoc)  
  92.             self.FoodManufacture()  
  93.             #print self.snake   
  94.             return True  
  95.         else :  
  96.             return False  
  97.       
  98.     def OnTimer(self,event):  
  99.         self.SnakeMove()  
  100.               
  101.     def OnKeyUp(self,event):  
  102.         code = event.GetKeyCode()  
  103.         if code >= 314 and code <=317 and code != self.snakeDire - 2 and code != self.snakeDire + 2:  
  104.             self.snakeDire = code  
  105.         #self.SnakeMove()       
  106.           
  107.     def OnPaint(self, event):  
  108.         dc = wx.BufferedPaintDC(selfself.buffer)#13 处理一个paint(描绘)请求  
  109.         print 'onpaint'  
  110.   
  111.     def OnLeftUp(self, event):  
  112.         dc = wx.BufferedDC(wx.ClientDC(self),self.buffer)  
  113.         dc.SetPen(self.pen)  
  114.         pos = event.GetPositionTuple()  
  115.         pos = pos + (10,10)  
  116.         dc.Clear()  
  117.         dc.DrawRectangle(*pos)  
  118.         print 'drawpoint'  
  119.       
  120. class SnakeFrame(wx.Frame):  
  121.     def __init__(self,parent):  
  122.         wx.Frame.__init__(self,parent,-1,'title',size=(800,600))          
  123.         self.sketch = SnakeWindow(self)  
  124.    
  125.    
  126. if __name__ == '__main__':  
  127.     app = wx.PySimpleApp()  
  128.     frame = SnakeFrame(None)  
  129.     frame.Show(True)  
  130.     app.MainLoop()             
到此贪吃蛇的基本功能就实现了,还剩下判断游戏失败。

恭喜,GAME OVER

怎么判断游戏失败:1、蛇头超出窗口;2、蛇咬到自己(snakeHead in snake)

[python] view plaincopyprint?
  1. def GameOver(self,newhead):  
  2.     if newhead in self.snake:  
  3.         self.runtime.Stop()  
  4.         print 'autotomy'  
  5.         return True  
  6.     elif self.snakeHead[0] < 0 or self.snakeHead[0] > 800 or self.snakeHead[1] <1 or self.snakeHead[1] >600:  
  7.         self.runtime.Stop()  
  8.         print 'out'  
  9.         return True  
  10.     else :  
  11.         return False  

贪吃蛇全部代码

最新代码,已修正边界坐标  2013.1.18

[python] view plaincopyprint?
  1. # -*- coding:utf-8 -*-   
  2. ''''' 
  3. Created on 2013-1-16 
  4.  
  5. @author: jincheng 
  6. '''  
  7. import wx  
  8. import random  
  9.   
  10. class SnakeWindow(wx.Window):  
  11.     ''''' 
  12.     贪吃蛇 
  13.     '''  
  14.     def __init__(self,parent,size,offset):  
  15.         wx.Window.__init__(self,parent,-1,size=size)  
  16.         print self.GetBorder(wx.BOTTOM)  
  17.         self.area = (size[0]-offset,size[1]-offset)  
  18.         self.snakeColor='black'  
  19.         self.SetBackgroundColour('green')  
  20.         self.snakeThickness = 10  
  21.         self.snake = [(100,100),(100,110),(100,120)]  
  22.         self.snakeHead = (100,120)  
  23.         self.snakeSpace = 10  
  24.         self.snakeDebris = []  
  25.           
  26.         self.foodLoc = ()  
  27.         self.foodWidth = 1  
  28.           
  29.         self.FoodManufacture()  
  30.           
  31.         self.pen = wx.Pen(self.snakeColor, self.snakeThickness, wx.SOLID)   
  32.         self.winsize = self.GetClientSize()  
  33.         self.buffer = wx.EmptyBitmap(*self.area)  
  34.         self.snakeDire = 317#蛇头向下  
  35.         #self.foodInstantiate()  
  36.         self.runtime = wx.Timer(self)  
  37.         self.runtime.Start(100)#100毫秒动一下  
  38.   
  39.         self.Bind(wx.EVT_PAINT, self.OnPaint)  
  40.         self.Bind(wx.EVT_KEY_UP,self.OnKeyUp)  
  41.         self.Bind(wx.EVT_TIMER, self.OnTimer)  
  42.         #self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)  
  43.       
  44.     def __RandPoint(self):  
  45.         x = random.randint(1,self.area[0]/10)*10  
  46.         y = random.randint(1,self.area[1]/10)*10  
  47.         return (x,y)  
  48.       
  49.     def FoodManufacture(self):  
  50.         self.foodLoc = self.__RandPoint()  
  51.       
  52.     def foodInstantiate(self,dc):   
  53.         food = self.foodLoc + (self.foodWidth,self.foodWidth)  
  54.         dc.DrawRectangle(*food)  
  55.       
  56.     def __Fission(self):     
  57.         ''''' 
  58.         抛洒尸骸 
  59.         '''  
  60.         point = self.__RandPoint()  
  61.         if point in self.snakeDebris or point == self.foodLoc:  
  62.             self.__Fission()  
  63.         else:  
  64.             return point  
  65.           
  66.     def SnakeFission(self):  
  67.         ''''' 
  68.         蛇断尾 
  69.         '''  
  70.         length = len(self.snake)/2  
  71.         while length > 0:  
  72.             index = len(self.snake) - 1  
  73.             self.snake.pop(index)#删除末位  
  74.             point = self.__Fission()  
  75.             self.snakeDebris.append(point)  
  76.             length -= 1  
  77.               
  78.     def SnakeFissionInstantiate(self,dc):  
  79.         for debris in self.snakeDebris:  
  80.             d = debris +  (self.foodWidth,self.foodWidth)  
  81.             dc.DrawRectangle(*d)  
  82.                   
  83.     def SnakeMove(self):  
  84.         length = len(self.snake)  
  85.         self.snake.pop(length-1)#shift  
  86.         space = self.snakeSpace  
  87.         x = 0  
  88.         y = 0  
  89.         if self.snakeDire == 317:  
  90.             y = space  
  91.         elif self.snakeDire == 316:  
  92.             x = space  
  93.         elif self.snakeDire == 315:  
  94.             y = -space  
  95.         elif self.snakeDire == 314:  
  96.             x = -space  
  97.         newhead = (self.snakeHead[0] + x,self.snakeHead[1] + y)  
  98.         self.GameOver(newhead)  
  99.               
  100.         self.snake.insert(0,newhead)  
  101.         self.snakeHead = newhead  
  102.         dc = wx.BufferedDC(wx.ClientDC(self),self.buffer)  
  103.         dc.SetPen(self.pen)  
  104.         dc.Clear()  
  105.         self.SnakeInstantiate(dc)  
  106.           
  107.     def SnakeInstantiate(self,dc):      
  108.         ''''' 
  109.         画出蛇与食物 
  110.         '''  
  111.         self.foodInstantiate(dc)  
  112.         last = self.snake[0]  
  113.         length = len(self.snake)  
  114.         for s in self.snake[1:length]:  
  115.             line = last + s  
  116.             dc.DrawLine(*line)  
  117.             last = s  
  118.           
  119.         if self.Eat():  
  120.             if len(self.snake) > 5:  
  121.                 self.SnakeFission()  
  122.         pen = wx.Pen('red',self.snakeThickness,wx.SOLID)  
  123.         dc.SetPen(pen)  
  124.         self.SnakeFissionInstantiate(dc)  
  125.           
  126.     def Eat(self):  
  127.         if self.snakeHead == self.foodLoc:  
  128.             self.snake.insert(0self.foodLoc)  
  129.             self.FoodManufacture()  
  130.             return True  
  131.         else :  
  132.             return False  
  133.       
  134.     def GameOver(self,newhead):  
  135.         print newhead  
  136.         if newhead in self.snake or newhead in self.snakeDebris:  
  137.             self.runtime.Stop()  
  138.             print 'autotomy'  
  139.             return True  
  140.         elif newhead[0] < 0 or newhead[0] > self.area[0or newhead[1] < 0 or newhead[1] > self.area[1]:  
  141.             self.runtime.Stop()  
  142.             print 'out'  
  143.             return True  
  144.         else :  
  145.             return False  
  146.       
  147.     def OnTimer(self,event):  
  148.         self.SnakeMove()  
  149.               
  150.     def OnKeyUp(self,event):  
  151.         code = event.GetKeyCode()  
  152.         if code >= 314 and code <=317 and code != self.snakeDire - 2 and code != self.snakeDire + 2:  
  153.             self.snakeDire = code  
  154.         #self.SnakeMove()       
  155.           
  156.     def OnPaint(self, event):  
  157.         dc = wx.BufferedPaintDC(selfself.buffer)#13 处理一个paint(描绘)请求  
  158.   
  159.     def OnLeftUp(self, event):  
  160.         dc = wx.BufferedDC(wx.ClientDC(self),self.buffer)  
  161.         dc.SetPen(self.pen)  
  162.         pos = event.GetPositionTuple()  
  163.         pos = pos + (10,10)  
  164.         dc.Clear()  
  165.         dc.DrawRectangle(*pos)  
  166.         print 'drawpoint'  
  167.       
  168. class SnakeFrame(wx.Frame):  
  169.     def __init__(self,parent):  
  170.         wx.Frame.__init__(self,parent,-1,'title',size=(800,600))   
  171.           
  172.         size = self.__AreaSize(self.GetClientSize())  
  173.           
  174.         panel = wx.Panel(self)  
  175.         panel.SetBackgroundColour('#4f5049')  
  176.           
  177.         border = 10  
  178.           
  179.         self.sketch = SnakeWindow(panel,size,2*border)  
  180.       
  181.         box = wx.BoxSizer(wx.VERTICAL)  
  182.           
  183.         box.Add(self.sketch,1,wx.ALIGN_TOP|wx.ALL,border)  
  184.         panel.SetSizer(box)  
  185.   
  186.     def __AreaSize(self,size):  
  187.         width = self.__AreaMath(size[0])  
  188.         height = self.__AreaMath(size[1])  
  189.         return (width,height)  
  190.       
  191.     def __AreaMath(self,intparam):  
  192.         if intparam%10 < 5:  
  193.             return intparam/10 * 10  
  194.         else:  
  195.             return (intparam/10 + 1)*10  
  196.    
  197. if __name__ == '__main__':  
  198.     app = wx.PySimpleApp()  
  199.     frame = SnakeFrame(None)  
  200.     frame.Show(True)  
  201.     app.MainLoop()             
  202.             
0 0
原创粉丝点击