Arduino制作万智牌生命计数器

接触过一段时间的万智牌,不过水平一般,牌技也一般。关于万智牌的介绍和规则,请参考 这里。万智牌一般是两人对战,每人起始有20点生命,谁的生命先降到0就算输。
手机上的APP旅法师营地中带的工具中有生命计数器,界面如下:
Arduino制作万智牌生命计数器 - gc_2299 - gc_2299的博客
  由于我的材料有限,所以准备做一个每次控制生命加一、减一功能的缩减版的万智牌生命计数器。所需的材料如下:
Arduino UNO 1个
面包板 1个
TM1637四位数码管 1个
按键开关 4个
红色LED灯 4个
电阻 4个
所有材料的实物图如下:
Arduino制作万智牌生命计数器 - gc_2299 - gc_2299的博客
  这些元器件的作用如下:
Arduino UNO:控制程序的总体运行
面包板:连接所有电路
TM1637四位数码管:显示对战双方的当前生命值
(按键+电阻+led)1:参与者1的生命值+1
(按键+电阻+led)2:参与者1的生命值-1
(按键+电阻+led)3:参与者2的生命值+1
(按键+电阻+led)4:参与者2的生命值-1
最好的方法是采用中断,loop函数中只显示当前的生命值,每个按钮对应一个中断,通过中断控制生命值的变化。但Uno上只有两个中断引脚。所以退而求其次,在loop中循环检测四个按钮的电平高低来控制生命值的变化。为了避免按下一次按钮导致生命值变化太快,在loop函数的最后加了一个延迟,通过测试,发现延迟300毫秒左右比较合适,按钮按下去不需要停顿,生命值仅变化一次。
实际的代码如下:

#include "TM1637.h"

int actor1Plus1=8;
int actor1Minus1=9;
int actor2Minus1=10;
int actor2Plus1=11;

#define ON 1
#define OFF 0

int actor1Life=20;
int actor2Life=20;
int8_t LifeDisp[] = {0x00,0x00,0x00,0x00};

#define CLK 2//pins definitions for TM1637 and can be changed to other ports
#define DIO 3
TM1637 tm1637(CLK,DIO);

void setup()
{
pinMode(actor1Plus1,INPUT);
pinMode(actor1Minus1,INPUT);
pinMode(actor2Minus1,INPUT);
pinMode(actor2Plus1,INPUT);
digitalWrite(actor1Plus1,LOW);
digitalWrite(actor1Minus1,LOW);
digitalWrite(actor2Minus1,LOW);
digitalWrite(actor2Plus1,LOW);

tm1637.set();
tm1637.init();
tm1637.point(ON);
}
void loop()
{
if(digitalRead(actor1Plus1)==HIGH)
{
actor1Life++;
}
if(digitalRead(actor1Minus1)==HIGH)
{
actor1Life--;
}
if(digitalRead(actor2Minus1)==HIGH)
{
actor2Life--;
}
if(digitalRead(actor2Plus1)==HIGH)
{
actor2Life++;
}

ShowActorLife();

delay(300);
}
void ShowActorLife()
{
LifeDisp[0] = actor1Life / 10;
LifeDisp[1] = actor1Life % 10;
LifeDisp[2] = actor2Life / 10;
LifeDisp[3] = actor2Life % 10;
tm1637.display(LifeDisp);
}


实物连线图如下:
Arduino制作万智牌生命计数器 - gc_2299 - gc_2299的博客
 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值