请选择 进入手机版 | 继续访问电脑版

kivy Club

 找回密码
 注册
搜索
热搜: 活动 交友 discuz
查看: 12946|回复: 5

kivy贪吃蛇游戏

[复制链接]

1

主题

4

帖子

48

积分

版主

Rank: 7Rank: 7Rank: 7

积分
48
发表于 2016-2-24 14:34:40 | 显示全部楼层 |阅读模式
本帖最后由 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模块:按钮触发事件,点击则重新开始游戏




  1. #coding=utf-8
  2. '''
  3. python 2.7
  4. This program is a snake game
  5. __author__:Lunatic
  6. version:1.0
  7. date:2016.2.24
  8. '''
  9. from kivy.app import App
  10. from kivy.uix.widget import Widget
  11. from kivy.uix.label import Label
  12. from kivy.clock import Clock
  13. from kivy.core.window import Window
  14. from random import random,randrange
  15. from kivy.graphics import Color, Rectangle
  16. from kivy.uix.boxlayout import BoxLayout
  17. from kivy.uix.button import Button   
  18. from functools import partial
  19. from kivy.graphics.instructions import InstructionGroup
  20. from kivy.uix.spinner import Spinner, SpinnerOption

  21. class Mywidget(Widget):
  22.     SnakeX=[300,280,260,240]
  23.     SnakeY=[300,300,300,300]
  24.     direction=[0,20]
  25.     snake = InstructionGroup()
  26.     food = InstructionGroup()
  27.     foodx=randrange(0,200,20)
  28.     foody=randrange(100,300,20)
  29.     score = 0
  30.     count = 1
  31.     speed = 1
  32.     def __init__(self,**kwargs):
  33.         super(Mywidget,self).__init__(**kwargs)
  34.         self.canvas.clear()
  35.         Clock.schedule_once(self.get_speed)
  36.     def get_speed(self,args):
  37.         Clock.unschedule(self.draw_snake)
  38.         Clock.schedule_interval(self.draw_snake,1./(len(self.SnakeX)+self.speed))
  39.     def play_again(self,args):
  40.         print 'play'
  41.         self.canvas.clear()
  42.         self.SnakeX=[300,280,260,240]
  43.         self.SnakeY=[300,300,300,300]
  44.         self.direction=[0,20]
  45.         self.snake = InstructionGroup()
  46.         self.food = InstructionGroup()
  47.         self.foodx=randrange(0,300,20)
  48.         self.foody=randrange(100,300,20)
  49.         self.count=1   
  50.         self.score=0
  51.         self.getscore()
  52.     def on_touch_down(self, touch):
  53.         if self.direction[0]==0:
  54.             if self.SnakeX[0]-touch.x>0:
  55.                 self.direction=[-20,0]
  56.             else:
  57.                 self.direction=[20,0]
  58.         else:
  59.             if self.SnakeY[0]-touch.y>0:
  60.                 self.direction=[0,-20]
  61.             else:
  62.                 self.direction=[0,20]
  63.     def changelevel(self,instance,value):
  64.         if value == 'level':
  65.             return
  66.         instance.text = value
  67.         if value=='easy':
  68.             self.speed = 5
  69.             self.get_speed(self)
  70.         elif value=='normal':
  71.             self.speed = 30
  72.             self.get_speed(self)
  73.         else:
  74.             self.speed=100
  75.             self.get_speed(self)
  76.             
  77.     def draw_snake(self,args):
  78.         
  79.         if (self.SnakeX[0]+self.direction[0]==self.SnakeX[1] and self.SnakeY[0]+self.direction[1]==self.SnakeY[1]):
  80.             self.direction *= -1
  81.         if  self.isdead()==False:
  82.             self.snakefunc(self)
  83.             self.canvas.remove(self.snake)
  84.             self.snake = InstructionGroup()
  85.             for i in range(len(self.SnakeX)):
  86.                 self.snake.add(Color(1, 0, 0, 1))
  87.                 self.snake.add(Rectangle(pos=(self.SnakeX[i],self.SnakeY[i]), size=(20, 20)))
  88.             
  89.             self.draw_food()   
  90.             self.canvas.add(self.snake)
  91.         else:
  92.             self.gameover()
  93.         def draw_food(self):
  94.         
  95.         self.canvas.remove(self.food)
  96.         self.food = InstructionGroup()
  97.         self.food.add(Color(0, 1, 0, 1))
  98.         self.food.add(Rectangle(pos=(self.foodx,self.foody), size=(20, 20)))   
  99.         self.canvas.add(self.food)
  100.         
  101.     def random_food(self):
  102.         
  103.         self.foodx=randrange(0,self.width,20)
  104.         self.foody=randrange(100,self.height,20)
  105.         for i in range(0,len(self.SnakeX)-1):
  106.             if self.foodx==self.SnakeX[i] and self.foody==self.SnakeY[i]:
  107.                 self.random_food()
  108.     def snakefunc(self,args):
  109.         
  110.         new_X=self.SnakeX[0]+self.direction[0]
  111.         new_Y=self.SnakeY[0]+self.direction[1]
  112.         self.SnakeX.insert(0,new_X)
  113.         self.SnakeY.insert(0,new_Y)
  114.         
  115.         if self.iseated()==True:
  116.             self.random_food()
  117.             self.get_speed(self)
  118.         else:
  119.             
  120.             del self.SnakeX[-1]
  121.             del self.SnakeY[-1]
  122.     def iseated(self):
  123.         if self.foodx==self.SnakeX[0] and self.foody==self.SnakeY[0]:
  124.             self.score+=10
  125.             print self.score
  126.             self.getscore()
  127.             return True

  128.     def isdead(self):
  129.         if self.SnakeX[0]< 0 or self.SnakeX[0]> Window.width or self.SnakeY[0]<self.y or self.SnakeY[0]> Window.height:
  130.             return True
  131.         for i in range(1,len(self.SnakeX)-1):
  132.             if self.SnakeX[i] ==self.SnakeX[0] and self.SnakeY[i]==self.SnakeY[0]:
  133.                 return True
  134.         return  False

  135.     def gameover(self):
  136.         self.canvas.clear()
  137.         with self.canvas:
  138.             Rectangle(source='mali.jpg', pos=self.pos, size=self.size)
  139.   
  140.     def getscore(self):
  141.         
  142.         self.label.text='score  '+str(self.score)
  143. class SnakeApp(App):   
  144.                   
  145.     def build(self):
  146.         
  147.         wid = Mywidget()
  148.         
  149.         btn=Button(text='restart',on_press=partial(wid.play_again))
  150.         speedlevel = Spinner(
  151.             text='level',
  152.             values=('easy', 'normal', 'hard'))
  153.         speedlevel.bind(text=wid.changelevel)
  154.         
  155.         layout = BoxLayout(size_hint=(1, None), height=100)
  156.         label=Label(text='score  0')
  157.         wid.label=label
  158.         layout.add_widget(label)
  159.         layout.add_widget(speedlevel)
  160.         layout.add_widget(btn)
  161.         root = BoxLayout(orientation='vertical')
  162.         root.add_widget(wid)
  163.         root.add_widget(layout)
  164.         
  165.         return root


  166. if __name__=='__main__':
  167.     SnakeApp().run()
复制代码



回复

使用道具 举报

1

主题

3

帖子

50

积分

超级版主

Rank: 8Rank: 8

积分
50
发表于 2016-2-24 21:33:44 | 显示全部楼层
好~                                          

3

主题

6

帖子

79

积分

超级版主

Rank: 8Rank: 8

积分
79
发表于 2016-3-11 09:27:55 | 显示全部楼层
顶一个,学习学习
回复 支持 反对

使用道具 举报

0

主题

3

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2016-6-30 14:30:59 | 显示全部楼层
学习学习
回复

使用道具 举报

0

主题

2

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2018-4-6 14:01:44 | 显示全部楼层
from kivy.graphics.instructions import InstructionGroup
这句报错:Unresolved import: InstructionGroup
回复 支持 反对

使用道具 举报

1

主题

4

帖子

48

积分

版主

Rank: 7Rank: 7Rank: 7

积分
48
 楼主| 发表于 2018-4-10 10:22:44 | 显示全部楼层
航航爱py__ 发表于 2018-4-6 14:01
from kivy.graphics.instructions import InstructionGroup
这句报错:Unresolved import: InstructionGrou ...

这个好久以前了。。看看官方文档,,是不是这个模块有什么变动或者弃用了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|kivy.Club

GMT+8, 2024-12-6 16:21 , Processed in 0.028885 second(s), 25 queries .

Powered by Discuz! X3.4

Design By S!|ƽ̶

快速回复 返回顶部 返回列表