基于micro python的复古游戏贪吃蛇改写与移植
本项目基于ZP2040开发板引脚及相关特性,通过修改相关参数与引脚,对控制方法进行相应修改与优化,将适用于其他开发板的贪吃蛇游戏移植到ZP2040上并成功运行。
标签
树莓派
嵌入式系统
2022寒假在家练
ax57
更新2022-03-14
中央民族大学
989

软硬件介绍:

  • 开发板:树莓派pico ZP2040开发板。该开发板是由树莓派基金会推出的双核ARMCortex M0+微控制器,有133MHz的时钟速率以及264kb的SRAM,支持C/C++、micropython的编程
  • 软件工具:Thonny。该软件是一款面向初学者的Python IDE,界面简洁易上手

流程图

Fk4hJrONjwGc2yNFnU1U7lCsEhGf

已实现功能:

  • 贪吃蛇初始位置及食物位置的随机生成
  • 贪吃蛇与自身及边框的碰撞检测
  • 使用ZP2040摇杆和案件控制贪吃蛇行动轨迹
  • 难度分级及分数结算

 

本项目基于ZP2040开发板引脚及相关特性,通过修改相关参数与引脚,对控制方法进行相应修改与优化,将适用于其他开发板的贪吃蛇游戏移植到ZP2040上并成功运行。

实物展示图

Fsh45vvn2UI-jf36UrYClQW5J3c3FqX1eBFzylEDMircVv30AAosbBX_

 

相关说明:

  • 贪吃蛇初始位置及食物位置的随机生成
    def food(snake=[-1,-1]):
        global x1,y1
        x1=random.randrange(0,230)
        y1=random.randrange(0,180)
        x1=x1-x1%10#取十的倍数,保证蛇头和食物能完全重合
        y1=y1-y1%10
        while(x1 in snake and y1 in snake):#与蛇身列表比较,重复则重新生成
            x1=random.randrange(0,230)
            y1=random.randrange(0,180)
            x1=x1-x1%10#取十的倍数,保证蛇头和食物能完全重合
            y1=y1-y1%10        
        display.fill_rect(x1,y1,10,10,st7789.RED)#显示以x,y坐标为起点的10*10正方形
        
    def intsnake():
        x2=random.randrange(0,230)
        y2=random.randrange(0,180)
        x2=x2-x2%10#取十的倍数,保证蛇头和食物能完全重合
        y2=y2-y2%10
        snake=[x2,y2]#初始蛇身列表
        display.fill_rect(x2,y2,10,10,st7789.WHITE)
        return snake#返回蛇身列表供其他模块调用​
  • 贪吃蛇与自身及边框的碰撞检测
    def chuli(snake):
        global x,y,x1,y1,goal,speedv,lv,crush
        a=b=crush=0
        length=len(snake)
        newsnake=addlong(x,y,snake)#将沿规定方向移动的蛇头坐标加入蛇身列表
        while a<length:#判断是否发生碰撞
            if snake[a]==x and snake[a+1]==y:
                crush=1
                break
            a+=2       
        if crush==1 or x>240 or x<0 or y>180 or y<0:#游戏结束画面
            display.fill(st7789.BLACK)
            display.text(font2, "Game Over!", 40, 80,st7789.RED)
            display.text(font2, "Final score:", 10, 110,st7789.BLUE)
            display.text(font2, str(goal), 200, 110,st7789.YELLOW)
            display.text(font1, "Press the run key to restart!", 10, 160)
            Timer.deinit()
            sys.exit()
        if x==x1 and y==y1:#判断是否吃到食物
            goal+=1
            print(goal)
            newsnake=addlong(x1,y1,newsnake)#食物坐标添入蛇身列表
            displays(newsnake)#在屏幕上显示整个蛇身
            food(newsnake)#生成新食物
        display.fill_rect(newsnake[-2],newsnake[-1],10,10,st7789.BLACK)#绘制蛇移动后的样子
        del newsnake[-1]
        del newsnake[-1]
        displays(newsnake)
        time.sleep(speedv)
        display.hline(0,190,240,st7789.RED)#绘制得分栏
        display.text(font2, "score:", 0, 200)
        display.text(font2, str(goal), 95, 200,st7789.YELLOW)
        display.text(font2, "level:", 125, 200)
        display.text(font2, str(lv), 215, 200,st7789.YELLOW)
        return newsnake​
  • 使用ZP2040摇杆和案件控制贪吃蛇行动轨迹。
  • 操作方法:B键(下)、A键(上)、拨动左边摇杆控制左右时需同时按下B键
    xAxis = ADC(Pin(28))
    yAxis = ADC(Pin(29))​
    while True:
        l2=dir(l1)
        l1=l2
        xValue = xAxis.read_u16()
        yValue = yAxis.read_u16()
        print(str(xValue) +", " + str(yValue))
        utime.sleep(0.01)
        if yValue<=10000:
            flag=2
        elif yValue>=40000:
            flag=1​
  • 难度分级及分数结算
    if goal<5:   #判断速度和难度等级
            speedv=0.5
            lv=1
        elif goal<10:
            speedv=0.4
            lv=2
        elif goal<15:
            speedv=0.3
            lv=3
        elif goal<20:
            speedv=0.2
            lv=4
        else:
            speedv=0.1
            lv=5​

遇到问题及解决

  • 代码中引脚的匹配与修正-阅读代码并查阅原理图
  • 无法通过摇杆控制贪吃蛇行动-原代码为通过摇杆电平转折控制贪吃蛇左右,修改为通过识别摇杆电平大小控制贪吃蛇左右

 

附件下载
greedysnake.py
操作方法:B键(下)、A键(上)、拨动左边摇杆控制左右时需同时按下B键
st7789.py
joystick.py
团队介绍
2018级电子信息工程专业
团队成员
ax57
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号