2021暑假一起练-用树莓派pico设计一款游戏
用树莓派pico设计一款游戏,移植一款经典的游戏,通过LCD屏显示,通过按键和旋转编码器控制
标签
树莓派
嵌入式系统
PICO
安先生
更新2021-09-13
1315

本期主角介绍

树莓派基金会与2020年底推出双核Arm Cortex M0+的微控制器RP2040,并基于这款控制器同期推出了核心模块命名为PICO(参见电子森林里对该模块的介绍 - 树莓派PICO - 支持MicroPython的双核嵌入式系统模块)。
  • PICO模块拥有264KB的SRAM(RP2040片内自带)和2MB的Flash(模块上外扩),存储空间比较大,适合于MicroPython编程学习
  • GPIO方面的优势,能够灵活配置,支持实时性比较强的应用
  • 内部ADC支持两路模拟信号的输入,采样率为500Kbps,并可以提供外部参考电压
  • 23数字GPIO + 3个模拟/数字复用的输入管脚,这3个管脚可以做为ADC的输入
  • 通过USB供电和程序配置

 

任务

  1. 设计或移植一款经典的游戏,通过LCD屏显示,通过按键和旋转编码器控制
  2. 在游戏中要通过蜂鸣器播放背景音乐
 

功能介绍

本期我们实现的是贪吃蛇游戏。 这是非常经典的游戏。
主要规则,贪吃蛇吃到食物后会变长,碰到边缘或者自己 就游戏结束。
  • 环境搭建
micropython的环境 pico 已经内建好。
下载Thonny 作为IDE 编写代码。
  • 组件支持
显示支持 - ST7789 LCD驱动支持 这里直接用现存的驱动支持
字库支持  - 文字显示支持 这里直接增加相关的字库文件
音乐支持 -  这里用了一个第三方的music实现
有一个在线的版本 可以直接试听相关的音乐  并可以下载相关的音乐文件
  • 功能开发
在组件支持完成的基础上,我们开始我们的开发。
1,snake与食物的绘制
如下接口, 传入坐标,长宽信息  颜色就可以绘制。
screen.fill_rect(x[0],x[1],width,height,color)
2,按键与方向判断
首先我们有两个按键,对应游戏需要向左,向右两种方向。或者顺时针 逆时针也可以这样理解。
 
代码实现如下:
def move(self,key):
        assert type(key)==keys
        if key.num==7 and key.value()==0:     
            if (self.direction+1)<len(self.directions):
                self.direction += 1
            else:
                self.direction = 0
            return False
    
        elif key.num==8 and key.value()==0:     
            if (self.direction-1)>=0:
                self.direction -= 1
            else:
                self.direction=len(self.directions)-1
            return False
        
        return True
    
    
 
3,吃到食物的判断
吃到食物,是基于坐标与食物的坐标重合即为吃到。
同时需要把自身的长度增加固定的长度。
相关代码
    def check(self,food):
        direct=self.directions[self.direction]
        if direct=='up':
            if (self.bodies[0][0],self.bodies[0][1]-10)==food.foodposition:
                self.bodies.insert(0,(self.bodies[0][0],self.bodies[0][1]-10))
                food.born(self.bodies)
                return False
            else:
                self.bodies.insert(0,(self.bodies[0][0],self.bodies[0][1]-10))
                return self.bodies.pop(-1)
        elif direct=='right':
            if (self.bodies[0][0]+10,self.bodies[0][1])==food.foodposition:
                self.bodies.insert(0,(self.bodies[0][0]+10,self.bodies[0][1]))
                food.born(self.bodies)
                return False
            else:
                self.bodies.insert(0,(self.bodies[0][0]+10,self.bodies[0][1]))        
                return self.bodies.pop(-1)
        elif direct=='down':
            if (self.bodies[0][0],self.bodies[0][1]+10)==food.foodposition:
                self.bodies.insert(0,(self.bodies[0][0],self.bodies[0][1]+10))
                food.born(self.bodies)
                return False
            else:
                self.bodies.insert(0,(self.bodies[0][0],self.bodies[0][1]+10))
                return self.bodies.pop(-1)
        elif direct=='left':
            if (self.bodies[0][0]-10,self.bodies[0][1])==food.foodposition:
                self.bodies.insert(0,(self.bodies[0][0]-10,self.bodies[0][1]))
                food.born(self.bodies)
                return False
            else:
                self.bodies.insert(0,(self.bodies[0][0]-10,self.bodies[0][1]))
                return self.bodies.pop(-1)
4, 碰撞的判断
当自身碰到边缘 或者 自己的时候  即为失败。
相关代码
    def is_dead(self,boundary_w,boundary_h):
        if self.bodies[0][0]<0 or self.bodies[0][1]<0 or self.bodies[0][0]>=boundary_w or self.bodies[0][1]>=boundary_h:
            return True
        bodycopy=self.bodies[1::]
        if self.bodies[0] in bodycopy:
            return True
        return False​
功能实例:
FirCyqYrqf9vilKmmE8h-15lqja7
 
 
  • Fi9c7an_4NnCpcy4PCoCGeRprbLz
  • FnWdL_SL4QKbrbg5LI1Vx7iEvOOm
 

心得体会

这次难度还不小, 项目的可玩性很强。期待下一次更好玩
 
附件下载
demo.zip
python源码
团队介绍
安迪,一线嵌入式攻城狮,喜欢捣腾开发板,钻研技术。
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号