小华盛顿 发表于 2017-7-24 11:29:51

尝试用MAX7219点阵模块做了个小游戏

本帖最后由 小华盛顿 于 2017-7-24 11:54 编辑

本着人人为我,我为人人的态度,在极客工坊学了很多东西,第一次出来发帖也算支持下极客工坊吧,希望能帮助到和我一样的菜鸟:P
材料清单:Arduino uno一块
                MAX7219点阵模块一个
                普通按钮2个
                1K电阻2个
                杜邦线若干
好了,我先上一个视频吧
http://v.youku.com/v_show/id_XMjkxNTQ5MTgyMA==.html?spm=a2h3j.8428770.3416059.1

代码如下
#include <Sprite.h>
#include <Matrix.h>
#include <MsTimer2.h>

Matrix myGame = Matrix(8,9,10,1);//
int x = 3;//球拍在x方向的位置
int y = 0;//球拍在y方向的位置
int x1;//球出现的x方向位置
int y1 = 0;//球出现的y方向位置


Sprite qiupai = Sprite(
         2,2,
         B11,
         B11
);//球拍的图案
Sprite quxiao = Sprite(
         7,8,
         B0000000,
         B0000000,
         B0000000,
         B0000000,
         B0000000,
         B0000000,
         B0000000,
         B0000000

);//取消所有图案
Sprite quxiaoqiupai = Sprite(
         7,1,
         B0000000

);//取消球拍图案
Sprite qiu = Sprite(
         1,1,
         B1
);//球的图案

Sprite XX = Sprite(
      7,6,
         B0000000,
         B0100010,
         B0010100,
         B0001000,
         B0010100,
         B0100010
);//失败后的图案



void setup()
{
myGame.clear();//清楚,重启
myGame.setBrightness(4);//设置显示亮度
myGame.write(3,7,qiupai);//初始化显示球拍
randomSeed(analogRead(0));//随机初始化球的位置
x1 = random(1,7);//设置随机范围
pinMode(2,OUTPUT);//定义2号引脚为输出模式
pinMode(3,OUTPUT);//定义3号引脚为输出模式
MsTimer2::set(10,flash);//设置定时器中断,中断函数为flash
MsTimer2::start();//启动定时器中断
}

void loop()
{
   myGame.write(x1,y1,qiu);//显示球
   delay(100);//球降落的速度延时100ms
   y1 ++;//球的y轴不断增加,表示球一步步降落
   if(y1 == 8)//如果球降到最底部
   {
      if((x1 == x)||(x1 == x + 1))//此时,如果球的位置与球拍的位置是重合的,表示接球成功
      {
      randomSeed(analogRead(0));//系统重新随机安排另一个球
      x1 = random(1,7);//设置随机范围
      y1 = 0;//球首先出现在最高点
      }
      else//否没有接到球
      {
      for(int i = 0;i < 6;i ++)//闪烁显示X,代表刚刚任务失败
      {
          myGame.write(1,0,XX);//显示X
          delay(500);
          myGame.write(1,0,quxiao);//隐藏
          delay(500);
      }
      randomSeed(analogRead(0));//过了6秒后,系统游戏重新开始,球随机回到起点
      x1 = random(1,7);
      y1 = 0;
      }
   }
   myGame.write(1,0,quxiao);//关闭显示,消除重影
}

void flash() //中断处理函数,主要处理,按键随时按下时,球拍能及时响应
{                        
if(digitalRead(3) == HIGH)//如果右边被按下,球拍往右走
{
    delay(200);//
    x ++;//横坐标,自加1
    if(x == 6)//如果加到最右边时
    {
      x = 5;//限定最右达到第5格
    }
    while(digitalRead(3) == HIGH)//等待按键松开
    {
      
    }
}
if(digitalRead(2) == HIGH)//如果左边被按下,球拍往左边走
{
    delay(200);
    x --;//横坐标,自减1
    if(x == 0)//如果减到最左边时
    {
      x = 1;//限定最左边能做能到达第一格
    }
    while(digitalRead(2) == HIGH)//等待按键松开
    {
      
    }
}
myGame.write(x,7,qiupai);//显示球拍
delay(100);
myGame.write(1,7,quxiaoqiupai);//消除重影
delay(100);
}




当然这个作品还有很多需要完善的地方,还请各位大神多多指教下。谢谢
页: [1]
查看完整版本: 尝试用MAX7219点阵模块做了个小游戏