lunatic 发表于 2016-2-24 14:34:40

kivy贪吃蛇游戏

本帖最后由 racede 于 2016-2-24 21:31 编辑

简单的贪吃蛇游戏,用kivy写的~
一、主要目的
1)利用kivy显示用户界面,包括游戏窗口,显示得分。2)鼠标控制贪吃蛇的方向。3)贪吃蛇初始长度为4个方块,每个大小为20*20像素,显示蛇的移动。4)在游戏窗口内随机生产食物的位置5)蛇碰到自己或者墙结束游戏8)游戏有3个难度可供选择9)一个食物10分,每吃一个食物速度加快二、模块的设计与实现(1)changelevel模块:通过Spinner选择用户难度,调用get_speed模块(2)get_speed模块:调整游戏速度,通过clock事件改变游戏速度。(3)draw_food模块:删除屏幕上已经绘制的食物,通过random_food模块获取新的食物食物坐标。(4)draw_snake模块:删除屏幕上已经绘制的蛇,并通过snakefunc函数设置蛇的坐标列表。通过列表坐标列表绘制蛇。(5)random_food模块:应用随机数函数生成新的食物坐标,并检测其是否与蛇身相重合(通过for循环结构检索),若重合则重新调用random_food模块。(6)snakefunc模块:通过iseated模块确定是否吃到食物,若吃到则将食物坐标添加到蛇坐标列表的最前端,若没有吃到,则在添加完之后删去蛇坐标列表后的最后一个元素。(7)getscore模块:显示获得分数(8)iseated模块:遍历食物坐标列表,查找是否有坐标与蛇头坐标重合,若存在,则停止遍历,将游戏分数增加10,更改显示分数,并且返回TRUE。(9)isdead模块:如果蛇头坐标出了墙的范围,则判定为TRUE,用for循环检查蛇头坐标是否和蛇坐标列表内某坐标相同,以判断蛇是否咬到自己。若有,则返回TURE,否则返回FALSE。(10)on_touch_down模块:接受touch事件,判断点击位置并改变蛇头运动方向。(11)gameover模块:删除画布中的食物和蛇,在屏幕上显示游戏结束信息。(12)play_again模块:按钮触发事件,点击则重新开始游戏


#coding=utf-8
'''
python 2.7
This program is a snake game
__author__:Lunatic
version:1.0
date:2016.2.24
'''
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.clock import Clock
from kivy.core.window import Window
from random import random,randrange
from kivy.graphics import Color, Rectangle
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button   
from functools import partial
from kivy.graphics.instructions import InstructionGroup
from kivy.uix.spinner import Spinner, SpinnerOption

class Mywidget(Widget):
    SnakeX=
    SnakeY=
    direction=
    snake = InstructionGroup()
    food = InstructionGroup()
    foodx=randrange(0,200,20)
    foody=randrange(100,300,20)
    score = 0
    count = 1
    speed = 1
    def __init__(self,**kwargs):
      super(Mywidget,self).__init__(**kwargs)
      self.canvas.clear()
      Clock.schedule_once(self.get_speed)
    def get_speed(self,args):
      Clock.unschedule(self.draw_snake)
      Clock.schedule_interval(self.draw_snake,1./(len(self.SnakeX)+self.speed))
    def play_again(self,args):
      print 'play'
      self.canvas.clear()
      self.SnakeX=
      self.SnakeY=
      self.direction=
      self.snake = InstructionGroup()
      self.food = InstructionGroup()
      self.foodx=randrange(0,300,20)
      self.foody=randrange(100,300,20)
      self.count=1   
      self.score=0
      self.getscore()
    def on_touch_down(self, touch):
      if self.direction==0:
            if self.SnakeX-touch.x>0:
                self.direction=[-20,0]
            else:
                self.direction=
      else:
            if self.SnakeY-touch.y>0:
                self.direction=
            else:
                self.direction=
    def changelevel(self,instance,value):
      if value == 'level':
            return
      instance.text = value
      if value=='easy':
            self.speed = 5
            self.get_speed(self)
      elif value=='normal':
            self.speed = 30
            self.get_speed(self)
      else:
            self.speed=100
            self.get_speed(self)
            
    def draw_snake(self,args):
      
      if (self.SnakeX+self.direction==self.SnakeX and self.SnakeY+self.direction==self.SnakeY):
            self.direction *= -1
      ifself.isdead()==False:
            self.snakefunc(self)
            self.canvas.remove(self.snake)
            self.snake = InstructionGroup()
            for i in range(len(self.SnakeX)):
                self.snake.add(Color(1, 0, 0, 1))
                self.snake.add(Rectangle(pos=(self.SnakeX,self.SnakeY), size=(20, 20)))
            
            self.draw_food()   
            self.canvas.add(self.snake)
      else:
            self.gameover()
        def draw_food(self):
      
      self.canvas.remove(self.food)
      self.food = InstructionGroup()
      self.food.add(Color(0, 1, 0, 1))
      self.food.add(Rectangle(pos=(self.foodx,self.foody), size=(20, 20)))   
      self.canvas.add(self.food)
      
    def random_food(self):
      
      self.foodx=randrange(0,self.width,20)
      self.foody=randrange(100,self.height,20)
      for i in range(0,len(self.SnakeX)-1):
            if self.foodx==self.SnakeX and self.foody==self.SnakeY:
                self.random_food()
    def snakefunc(self,args):
      
      new_X=self.SnakeX+self.direction
      new_Y=self.SnakeY+self.direction
      self.SnakeX.insert(0,new_X)
      self.SnakeY.insert(0,new_Y)
      
      if self.iseated()==True:
            self.random_food()
            self.get_speed(self)
      else:
            
            del self.SnakeX[-1]
            del self.SnakeY[-1]
    def iseated(self):
      if self.foodx==self.SnakeX and self.foody==self.SnakeY:
            self.score+=10
            print self.score
            self.getscore()
            return True

    def isdead(self):
      if self.SnakeX< 0 or self.SnakeX> Window.width or self.SnakeY<self.y or self.SnakeY> Window.height:
            return True
      for i in range(1,len(self.SnakeX)-1):
            if self.SnakeX ==self.SnakeX and self.SnakeY==self.SnakeY:
                return True
      returnFalse

    def gameover(self):
      self.canvas.clear()
      with self.canvas:
            Rectangle(source='mali.jpg', pos=self.pos, size=self.size)

    def getscore(self):
      
      self.label.text='score'+str(self.score)
class SnakeApp(App):   
                  
    def build(self):
      
      wid = Mywidget()
      
      btn=Button(text='restart',on_press=partial(wid.play_again))
      speedlevel = Spinner(
            text='level',
            values=('easy', 'normal', 'hard'))
      speedlevel.bind(text=wid.changelevel)
      
      layout = BoxLayout(size_hint=(1, None), height=100)
      label=Label(text='score0')
      wid.label=label
      layout.add_widget(label)
      layout.add_widget(speedlevel)
      layout.add_widget(btn)
      root = BoxLayout(orientation='vertical')
      root.add_widget(wid)
      root.add_widget(layout)
      
      return root


if __name__=='__main__':
    SnakeApp().run()


racede 发表于 2016-2-24 21:33:44

好~                                          

saber 发表于 2016-3-11 09:27:55

顶一个,学习学习

bulabean 发表于 2016-6-30 14:30:59

学习学习:lol

航航爱py__ 发表于 2018-4-6 14:01:44

from kivy.graphics.instructions import InstructionGroup
这句报错:Unresolved import: InstructionGroup
:(:(

lunatic 发表于 2018-4-10 10:22:44

航航爱py__ 发表于 2018-4-6 14:01
from kivy.graphics.instructions import InstructionGroup
这句报错:Unresolved import: InstructionGrou ...

这个好久以前了。。看看官方文档,,是不是这个模块有什么变动或者弃用了
页: [1]
查看完整版本: kivy贪吃蛇游戏