极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: zzz

【Z也来玩点阵】Arduino I2C 8*8点阵玩贪吃蛇游戏~附程序讲解~

[复制链接]
发表于 2015-6-29 13:22:48 | 显示全部楼层
大神代码我用过发现几个细节的问题
1.蛇身不能变长,以及变长后身体会碰撞(已解决)
2.食物是随机产生的,有一定几率会产生在蛇的身体上有没有办法改进(这是我在让蛇身体变长后发现的一个问题)
回复 支持 反对

使用道具 举报

发表于 2015-6-29 13:25:38 | 显示全部楼层
代码变化不大,代码如下
#include <Wire.h> //I2C链接库
#include "Adafruit_LEDBackpack.h" //点阵驱动库
#include "Adafruit_GFX.h" //Arduino图形库
Adafruit_BicolorMatrix matrix = Adafruit_BicolorMatrix(); //设置I2C点阵型号
static uint8_t __attribute__ ((progmem)) y[]={
B00000000,B01000010,B00100100,B00011000,B00011000,B00011000,B00011000,B00000000}; //小Y的logo代码,其实就是一个一个点的量灭组成的,可以自己写~
int speedS=8; //贪吃蛇的初始速度
int socre=0; //游戏起始得分
int FX,FY; //事物的坐标
int SX,SY; //蛇头的坐标
int KEY,K; //串口取得按键码和比对后的按键码,这里后面有说明
char s[128]; //蛇身体坐标集合,一共3个点,6个元素

void setup()
{
  Serial.begin(9600);
  RANDOM(); //获取一个随机食物坐标
  s[1]=2;
  s[2]=2;
  s[3]=1;
  s[4]=2;
  s[5]=0;
  s[6]=2; //初始化蛇的身体坐标
  KEY=6; //初始化按键码,实际上就是行进方向,用4568来代替4个正交方向
  matrix.begin(0x70); //设定IIC屏幕地址
  matrix.clear();  //屏幕清屏
  matrix.writeDisplay();  //屏幕显示
  matrix.setRotation(3);  //设置屏幕显示方向
  matrix.clear();
  Logo(); //绘制开机Logo,哈哈其实就是小y的logo,视频里看不清,自己玩下就懂了~
  matrix.writeDisplay();
  delay(1000);
  matrix.setTextWrap(false);  //设置字体平滑模式
  matrix.setTextSize(1); //设置字体大小
  matrix.setTextColor(2); //设定LED颜色,这里说明下,除了双色点阵,其他都用2表示点亮LED,0表示熄灭~
  for (int8_t x=7; x>=-59; x--) {
    matrix.clear();
    matrix.setCursor(x,0);
    matrix.print("READY!!! GO");
    matrix.writeDisplay();
    delay(70);
  }
  //循环绘制文字,获得滚动效果
  matrix.clear();
  for(int i=1;i<=6;i+=2)
  {
    matrix.drawPixel(s[i], s[i+1], 2);
  }
  matrix.writeDisplay();
  delay(400);
}
//循环绘制蛇的身体,实际上就是3个点咯~

void RANDOM()
{
  FX=random(0, 7);
  FY=random(0, 7);
}
//随机食物获取函数

void Delay(int timeF)
{
  for(int t=1;t<=timeF;t++)
  {
    int k=1;
    matrix.drawPixel(FX, FY, 2);
    matrix.writeDisplay();
    delay(50);
    matrix.drawPixel(FX, FY, 0);
    matrix.writeDisplay();
    delay(50);
    k=k+1;
    if(k>10)
    {
    RANDOM(); //获取一个随机食物坐标
    }   
  }
}
//重点说一下,这个是演示函数,实际上通过不断闪现食物来完成延迟,这样既可以做到精确延时,也可以让食物不断闪动,来让大家不断的看到~
void Logo()
{
  for (int x=1;x<=3;x++)
  {
    matrix.drawPixel(x, x, 2);
    matrix.drawPixel(7-x, x, 2);
    matrix.writeDisplay();
    delay(100);
  }
  for (int x=4;x<=6;x++)
  {
    matrix.drawPixel(3, x, 2);
    matrix.drawPixel(4, x, 2);
    matrix.writeDisplay();
    delay(100);
  }
   delay(200);
  for (int x=1;x<=45;x++)
  {
    matrix.clear();
    matrix.writeDisplay();
    delay(x);
    matrix.drawBitmap(0,0,y,8,8,2);
    matrix.writeDisplay();
    delay(x);
  }
}
//Y Logo绘制函数,看不懂可以跳过~~~不过还是蛮简单的,仔细看下就明白了~
void gameover()
{
  for (int8_t x=7; x>=-125; x--)
  {
    matrix.clear();
    matrix.setCursor(x,0);
    matrix.print("GAME OVER YOUR SOCRE:");
    matrix.writeDisplay();
    delay(70);
  }
  //GameOver函数,显示游戏结束和得分
  for (int8_t x=7; x>=-39; x--)
  {
    matrix.clear();
    matrix.setCursor(x,0);
    matrix.print(socre);
    matrix.writeDisplay();
    delay(70);
  }
  s[1]=0;
  s[2]=2;
  s[3]=1;
  s[4]=2;
  s[5]=2;
  s[6]=2;
  //重置蛇的坐标
}
void loop()
{
  if (Serial.available())
  {
    K=Serial.read()-48;//获得串口发送的按键信息
    if (K==8&&KEY!=5 )
    {
      KEY=K;
    }
    if (K==5&&KEY!=8 )
    {
      KEY=K;
    }
    if (K==4&&KEY!=6 )
    {
      KEY=K;
    }
    if (K==6&&KEY!=4 )
    {
      KEY=K;
    }
  }
  //重点,这里是在比对是否方向和目前蛇的行进方向相反,相反就放弃按键
  while(Serial.read()>=0); //清空串口缓冲区
  matrix.clear();
  if(KEY==8)
  {
    for(int i=6+2*socre;i>3;i=i-2)
    {
    s[i]=s[i-2];
    s[i-1]=s[i-3];
    }
    s[2]=s[2]-1;
  }
  if(KEY==5)
  {
    for(int i=6+2*socre;i>3;i=i-2)
    {
    s[i]=s[i-2];
    s[i-1]=s[i-3];
    }
    s[2]=s[2]+1;
  }
  if(KEY==4)
  {
    for(int i=6+2*socre;i>3;i=i-2)
    {
    s[i]=s[i-2];
    s[i-1]=s[i-3];
    }
    s[1]=s[1]-1;
  }
  if(KEY==6)
  {
    for(int i=6+2*socre;i>3;i=i-2)
    {
    s[i]=s[i-2];
    s[i-1]=s[i-3];
    }
    s[1]=s[1]+1;
  }
  //根据按键来移动蛇的身体
  for(int i=1;i<=6+2*socre;i+=2)
  {
    matrix.drawPixel(s[i], s[i+1], 2);
  }
  matrix.writeDisplay();
  Delay(speedS);
  SX=s[1];
  SY=s[2];
  //获取蛇头的坐标
  if(SY<0 or SY>7 or SX<0 or SX>7)
  {
    gameover();
  }
  for(int i=3;i<=2*socre+6;i=i+2)
  {
    if( SX==s[i] and SY==s[i+1])
    gameover();
  }
  //判断是否超出边框,超出就跳转到GameOver
  if(SY==FY&&SX==FX)
  {
    socre=socre+1;
    int sp=socre;
    RANDOM();
    speedS=speedS-int(sp/3);
  }
  //判断是否吃到了食物~吃到了就会加分和重新随机生成食物~
  
  //根据得分加快蛇的速度
}
回复 支持 反对

使用道具 举报

发表于 2015-6-29 18:38:11 | 显示全部楼层
不错,之前我也搞了一个
http://geek-workshop.com/thread-8741-1-1.html
回复 支持 反对

使用道具 举报

发表于 2015-7-31 16:14:58 | 显示全部楼层
牛X
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-2 10:29 , Processed in 0.041770 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表