基于Gamebuino设计的算盘小游戏

    • 2.1硬件搭建

    • 2.2软件设计

    • 材料准备

    • 搭建步骤

    • 2.2.1实现功能

    • 2.2.2功能设计

    • 1.1技术背景

    • 1.2实验意义

    • 目录

    • 一、引言

    • 二、实验内容

    • 三、实验结果和分析

    • 四、试验改进

    • 五、实验总结

目录

一、引言

1.1技术背景

Gamebuino 让玩家可以在一个小巧的设备上玩他们喜欢的像素化游戏,并学习编程来制作自己的游戏。Gamebuino 可以装在口袋里,里面有很多免费的独家游戏,电池可以持续使用一整天。一个可选的micro SD卡可以容纳更多的游戏,玩家可以在几秒钟内切换游戏。你可以在这个平台上DIY自己的项目。

1.2实验意义

通过参考手册、实例游戏代码的分析,到搭建自己的游戏机创新一个小游戏。在实验过程中锻炼了我们的自学能力和学行合一的实验精神。

二、实验内容

2.1硬件搭建

材料准备

  • 单片机:ATmega328P,ArduinoUNO

  • 显示屏:Nokia5110液晶屏,84*48

  • SD卡:2G存储容量一下

  • 按键:7个

  • 面包板:2个,8.5cm*5.5cm

  • 杜邦线若干

  • USBtinyISP下载线一根

  • SD卡模块 CH376S
    只准备了实现最基础功能的元器件,其他元器件可以参见官方说明Hardware.

搭建步骤

  • 将下载好的gamebuino_boot文件复制到C:\arduino\hardware\arduino\avr\bootloaders目录下

  • BootLoader烧写:在正常运行的情况下,通过USB虚拟COM端口对Gamebuino进行编程,选择设备为“Arduino UNO”。但是,如果希望使用外部硬件程序(例如,另一个Arduino)来编写它或上传引导加载程序,那么必须在Arduino包中编辑board .txt文件(C:\arduino\hardware\arduino\boards.txt)在后面加上。

gamebuino.name=Gamebuino gamebuino.upload.protocol=arduino gamebuino.upload.maximum_size=30592gamebuino.upload.speed=115200gamebuino.bootloader.low_fuses=0xffgamebuino.bootloader.high_fuses=0xdagamebuino.bootloader.extended_fuses=0x05gamebuino.bootloader.path=gamebuino_boot gamebuino.bootloader.file=gamebuino_boot.hex gamebuino.bootloader.unlock_bits=0x3Fgamebuino.bootloader.lock_bits=0x0Fgamebuino.build.mcu=atmega328p gamebuino.build.f_cpu=16000000Lgamebuino.build.core=arduino gamebuino.build.variant=standard

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • USBTinyISP插口插入板子上ICSP

  • 打开ardunio IDE ,工具->开发板->GameBuino,工具->编译器->USBtinyISP,烧入引导程序

    当时不知道为什么报错,但是最后还是运行成功了,至今不明白什么意思。

  • 按照官方原理图慢慢连线

  • 最后把官网下载的小游戏导入SD卡,硬件部分就算成功了

2.2软件设计

2.2.1实现功能

尽管你掌握了算盘的原理打算盘就会是一件很简单的事,但是现在很多人都不会打算盘。这个小游戏实现的功能即玩家输入数字,可以自动在屏幕上模拟出该数字在算盘上应该如何表示。

2.2.2功能设计

  • (1)整体屏幕
    左边部分是算盘界面,用drawmap()函数实现,右边部分是ResetDisplay()函数实现的数字显示界面。

  • (2)drawmap()函数由gb.display.drawFastVLine和gb.display.drawFastHLine画出的框架和drawmap()函数画出的算珠组成。前两个函数都是库中自带的画直线功能在此不再赘述。因为屏幕大小原因,所以算盘只设置了个十百千万五位数。算盘是一个43*43的正方形,由5条垂直直线和一条水平分割线组成(刨除了周围的四边),垂直线的x坐标起始为5步长为10这样一个设置,每一个算珠的大小是5*4,上下两个相邻算珠的y坐标差值是6(因为一列总共6颗珠子再加上2个空位即有8位,48/8=6)。所以可以算出珠子的(x,y)坐标表达式。

void Drawbead(){           //画算珠
  //ResetDisplay();
  for(int x=0;x<40;x++){if(gameState.boardabacus[x]==1){        //值有效时才画珠gb.display.drawBitmap(((x)%5)*10+3,ceil((x+1)/5.0)*6-5,zhuzi);    //(x,y,图形)  }
   }}1234567812345678
  • (3)ResetDisplay()函数参见上一篇Gamebuino小游戏2048代码loop部分分析博客。

  • (4)对用户输入的数字进行接收和拆解。Gamebuino中有gb.keyboard()函数可以让用户输入数字,但是它返回的值是一个char类型的数组。用atoi函数将输入数据转换成一个int型的变量,再写一个 split()函数将整形变量按个十百千万位拆分入数组。这里要补充说明一下,之前建立了一个gamestate的结构体有三个比较重要的元素。

extern const int SIZE=40;typedef struct Gamestate{ int boardabacus[SIZE]; //储存算盘上40个位置的状态,值为1表示这里有算珠,0则表示空 char text[4]; //gb.keyboard()后得到的char数组 int split[5]; //拆分成个十百千万存入该数组}GameState;

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • (5)对数据进行更新和新排布,输入的新数值要先转换为 boardabacus[]数组数值的更新,再重新drawmap()实现画面更新。数据的更新用到了 arrange()和below()两个函数,分别对算盘分割线上下进行排序。

void arrange(){                  //重新排序算盘矩阵
  for(int i=0;i<5;i++){if(gameState.split[i]>=5){      //分别读取个十百千万位数字与5比大小  gameState.boardabacus[14-i]=1;    //算盘的第三行对应列的珠子值为1  gameState.boardabacus[9-i]=0;     //算盘的第二行对应列的珠子值为0  below(gameState.split[i],i);      //算盘分割线下的珠子的排序}else{  below(gameState.split[i],i);}
  }}void below(int x,int line){             //下部分算盘的排序,x是该位数数值,line是第几列
  int cup;
  int k=1;
  cup=x%5;           //计算分割线下方有几颗珠子需要移动
  for(int j=0;j<cup;j++){k=19+j*5;      //跳转到对应行gameState.boardabacus[k-line]=1;    //上面一行对应列值为1gameState.boardabacus[k+5-line]=0;   //原来所在的那一行的对应列值为0
  }}1234567891011121314151617181920212212345678910111213141516171819202122

三、实验结果和分析

在官方的学习网站里找到一个网页版的模拟器,在里面运行.hex和在实物上运行效果一致。

四、试验改进

作为一款小游戏它实在没有可玩性,汇报完后根据老师的指导建议决定加上延时效果,这样显示就是每拨动一颗算珠一个效果,演示性更强。(后续改动再更新)

五、实验总结

这次实验从硬件开始,去慢慢了解每个模块的驱动和各个功能,再到将它们组合到一起并录入游戏进行测试。从分析2048小游戏的代码,到逐行构建自己的小游戏都是一个摸石头过河的状态,期间历尽无数失败,细化问题到每一个点再去检测错误,都是对自我能力的新考验和锻炼。也培养了自己动手的热情,结合理论的实操能力的提升。

(0)

相关推荐

  • 如何训练AI玩飞机大战游戏

    虽然没有谷歌强大的集群和DeepMind变态的算法的团队,但基于深度强化学习(Deep Q Network DQN )的自制小游戏AI效果同样很赞.先上效果图: 下面分四个部分,具体给大家介绍. /1 ...

  • Phyphox Ble库的经验点滴

    Phyphox Ble库的经验点滴 Phyphox是自动支持蓝牙BLE传输协议的,直接使用BLE 5.0可以给Phyphox传输数据.但是当Phyphox Ble的Arduino库发布以来,直接使用有 ...

  • HX711称重/拉压力传感器实验

    HX711是很便宜的一种称重传感器,主要负责转换从电阻应变桥过来的信号转换,24位ADC.但是资深工程师们说这个东西温度性能太差了,一旦温度环境差了一些,它就测不准了,而且还可能没有规律.官方文档说温 ...

  • 基于 Blazor 开发五子棋⚫⚪小游戏

    今天是农历五月初五,端午节.在此,祝大家端午安康! 端午节是中华民族古老的传统节日之一.端午也称端五,端阳.此外,端午节还有许多别称,如:午日节.重五节.五月节.浴兰节.女儿节.天中节.地腊.诗人节. ...

  • 鹅厂这小游戏设计好棒!诶,上线后咋不一样了?

    就是是把综艺节目里那些猜歌答题的小游戏搬到QQ里玩. 文章里的设计方案成功了吸引了我,于是我去 QQ 里找到了这个功能,打开试一试. 结果-- 感觉前后对比还挺大的,不知道是不是只有我这么感觉,发出来 ...

  • 图形化编程实例分享,小游戏设计,小熊踢球

    ​一:英文内容解读. 游戏名称:小熊踢球 游戏人物:小熊  球 故事情节设计: 一天,小美和他的妈妈去参加活动,于是给了小美一个气球,可是小美没拿住不小心放飞了,气球就越飞越高,直到飞到太空,也是小熊 ...

  • 荒野日记:优秀的剧情设计或许是未来小游戏的发展方向 | 游戏干线

    导 从小游戏日益精品化的发展路线看来,优秀的剧情设计是未来小游戏发展的重要方向. 6月27日,微信第七批创意小游戏名单公布,一款名为<荒野日记>的生存类小游戏获得了首位推荐.在这款游戏的测 ...

  • 【原创资讯】基于增材制造技术的AM纳米卫星油箱设计将改变太空游戏规则

    英国谢菲尔德大学高级制造研究中心(AMRC)的金属增材制造工程师设计和开发了一种用于小型卫星的轻型燃料箱,这是英国航天局资助的一项先驱计划的一部分. 预计今年英国部署的小型卫星的年数量将达到约400枚 ...

  • 基于Android的国学知识竞猜游戏设计与实现 参考论文

    摘要:本系统是一个基于Android的国学知识学习竞猜游戏.笔者本着可以让用户用游戏的方式学习国学知识的理念,将计算机科学技术与传统国学知识相结合,分析了该系统的总体设计.数据库设计.详细设计的思路, ...

  • 推荐比较嗨互动性强的24个团建暖场小游戏

    一场拓展团建活动,教练都需要进行一个团队破冰,所谓破冰就是让学员快速进入拓展团建活动当中,在破冰的环节,教练常用的方法就是通过游戏的体验让团队快速融入到活动当中,好的游戏能得到团队的认可,经过长时间的 ...

  • OPPO可折叠手机要推出了,不过不是卷帘屏设计,有点小失落

    折叠屏又有新玩家入局了,不过这次是完全商用,据悉OPPO的折叠屏手机可能是在6月份推出,继三星和华为之后,今年小米也入局了,接着OPPO要来了,不过OPPO这次推出的折叠屏手机有点令人意外,为何是翻盖 ...

  • 感动 | 5分钟可以做什么?浏览几条手机新闻,看一本杂志或玩一个小游戏......

    多等5分钟 (做人与处世201921期) 这个故事像一个美好的童话,发生在湖南怀化,故事的主人公就是公交车司机杨骐铭. 每天晚上22点10分,杨骐铭驾驶15路公交车准时驶离三中站台,这趟车是15路车经 ...