查看: 295|回复: 1

[未解决] arduino贪吃蛇代码问题

[复制链接]

该用户从未签到

发表于 2019-12-9 12:23 | 显示全部楼层 |阅读模式
请教大神们 最近从一本书上看到一个贪吃蛇程序 然后材料买回以后  ,代码编程总出现问题 请教很多人以后发现
竟然没有loop函数 新手小白不懂怎么调用相关函数,请教大神改下代码
下面附上材料以及接线图


#include <Wire.h>                                            // I2C链接库
#include "Adafruit_LEDBackpack.h"                          // 点阵驱动库
#include "Adafruit_GFX.h"                               // Arduino图形库
Adafruit_BicolorMatrix matrix = Adafruit_BicolorMatrix();
// 设置I2C点阵型号
static const uint8_t __attribute__ ((progmem)) X [] = { B01000010, B01000010, B00100100, B00011000, B00011000, B00100100, B01000010, B01000010 };   
// 字母 X 的logo代码,其实就是一个一个点的量灭组成的
int FX, FY;                                                    // 食物的坐标
int SX, SY;
int speedS = 8;                                      // 贪吃蛇的初始速度
int socre;                                                   // 游戏得分
int xValue;                                              // JoyStick-X
int yValue;                                                // JoyStick-Y
int zPin = 4;                                               // JoyStick-Z
int Enabled;
int K;
int s[7];
int KEY;// 蛇头的坐标
void setup() {
  pinMode(zPin, INPUT);
{
  
  RANDOM();                        // 获取一个随机食物坐标
  K = 0;    // 初始化按键码,实际上就是行进方向 方向初始化为0  
s[1] = 2;   
  s[2] = 2;                         // y3
  s[3] = 1;                         // x2
  s[4] = 2;                         // y2
  s[5] = 0;                         // x1
  s[6] = 2;                         // y1 初始化蛇的身体坐标      
  socre = 0;                        // 游戏起始得分
  matrix.begin(0x70);               // 设定IIC屏幕地址
  matrix.clear();                   // 屏幕清屏
  matrix.writeDisplay();            // 屏幕显示
  matrix.setRotation(1);            
// 设置屏幕显示方向  0向左显示 1向上显示 2向右显示 3向下显示 默认值为0 若输入错误值4 显示方向保持默认0
  matrix.clear();
  Logo();                           // 绘制开机Logo
  matrix.writeDisplay();
  delay(1000);
  matrix.setTextWrap(false);               // 设置字体平滑模式
  matrix.setTextSize(1);                   // 设置字号
  matrix.setTextColor(LED_GREEN);          // 设定LED颜色,0表示熄灭
  for (int8_t x = 7; x >= -70; x--) {
    matrix.clear();
    matrix.setCursor(x, 1);  
    matrix.print( "READY!!! G0 " );
    matrix.writeDisplay();
    delay(70);
  }                  // 循环绘制文字,获得滚动效果
  
  matrix.clear();
  for(int i = 1; i <= 6; i += 2)                     
// 从蛇头开始绘制三个点 s[1], s[3], s[5]为x坐标 s[2], s[4], s[6]为y坐标 蛇身排序: {s[5],s[6]}  {s[3],s[4]}  {s[1],s[2]} (右侧为蛇头)
  {
matrix.drawPixel(s[i], s[i + 1], LED_RED);     
  }
  matrix.writeDisplay();
  delay(400);
}
}
// 循环绘制蛇的身体,实际上就是3个点
void RANDOM() {
  FX = random(0, 7);
  FY = random(0, 7);
  for(int i = 1; i <= 6 + 2 * socre; i+= 2)     // 防止食物出现在蛇身上
  {
    if( FX == s[i] and FY == s[i + 1])
      RANDOM();                              
  }
}// 随机食物获取函数
void Logo() {
  matrix.drawPixel(6, 0, LED_YELLOW);          // X 右边笔画的动画
  matrix.writeDisplay();
  delay(35);
  for ( int x = 1; x <= 6; x++) {               
    matrix.drawPixel(7-x, x, LED_YELLOW);
    matrix.writeDisplay();
    delay(35);
    }
  matrix.drawPixel(1, 7, LED_YELLOW);
  matrix.writeDisplay();
  delay(35);
  matrix.drawPixel(1, 0, LED_YELLOW);          // X 左边笔画的动画
  matrix.writeDisplay();
  delay(35);
  for ( int x = 1; x <= 6; x++) {              
    matrix.drawPixel(x, x, LED_YELLOW);
    matrix.writeDisplay();
    delay(35);
    }
  matrix.drawPixel(6, 7, LED_YELLOW);
  matrix.writeDisplay();
  delay(35);
  for (int x = 1; x <= 45; x++) {                       // logo闪烁
    matrix.clear();
    matrix.writeDisplay();
    delay(x);
    matrix.drawBitmap(0, 0, X, 8, 8, LED_YELLOW);      
    matrix.writeDisplay();
    delay(x);
    }
}
void myDelay( int Time) {
// 在蛇移动的延时期间,食物的闪烁和摇杆方向的读取
  for(int t = 1; t <= Time; t++)
  {
    matrix.drawPixel(FX, FY, LED_GREEN);
    matrix.writeDisplay();
    delay(50);
    matrix.drawPixel(FX, FY, 0);
    matrix.writeDisplay();
    delay(50);
    joyStick();                           // 读取摇杆方向        
  }
}
void Endelay( unsigned long duration) {            
// 字幕滚动的延时期间 判断中央键是否被按下 按下则重置游戏

  unsigned long Start = millis();
  while(millis() - Start <= duration) {
    if(digitalRead(zPin) == LOW) {
      delay(20);
      if(digitalRead(zPin) == LOW) {
        Enabled = 1;
        }
      }
    }
}         // 重启游戏专用延时函数  
void joyStick() {
  xValue = analogRead(A3);
//JoyStick-X 最左值为0 最右值为1023 中间值为515
  yValue = analogRead(A1);  
// JoyStick-Y   最下值为0 最上值为1023 中间值为510
  if(xValue == 0 && KEY != 6 && K != 0)
{//首次操作摇杆前 不能向左移动蛇
    K = 4;
    }
  if(xValue == 1023 && KEY != 4) {
    K = 6;}
  if(yValue == 1023 && KEY != 5) {
    K = 8;
    }
  if(yValue == 0 && KEY != 8) {
    K = 5;
    }
  if(digitalRead(zPin) == LOW)                  
// 当按下中央键后 速度变为 2  松开后 速度恢复到当前值
    speedS = 2;
  else  
    speedS = 8 - socre / 5;
}
// 这里是在比对按键方向是否和目前蛇的行进方向相反,如果相反就放弃按键  
void gameover() {//一旦执行到Gameover 程序停止 需要按下中央键后以重启游戏
   Enabled = 0;
  while(Enabled == 0) {
    for (int8_t x = 7; x >= -125 && Enabled == 0; x--) {
      matrix.clear();
      matrix.setCursor(x, 1);
      matrix.print( "GAME OVER YOUR SOCRE:" );
      matrix.writeDisplay();
      Endelay(70);
      }
    for (int8_t x = 7; x >= -39 && Enabled == 0; x--) {
      matrix.clear();
      matrix.setCursor(x, 1);
      matrix.print(socre);
      matrix.writeDisplay();
      Endelay(70);
      }
    }// GameOver函数,显示游戏结束和得分
    for(int i = 0; i < 129; i++) {
      s[i] = 0;
      }
    K = 0;                  // 重置摇杆方向
    s[1] = 2;
    s[2] = 2;
    s[3] = 1;
    s[4] = 2;
    s[5] = 0;
    s[6] = 2;               // 重置蛇的坐标
    socre = 0;              // 重置游戏得分
}

2.JPG
2 (2).JPG
1.JPG
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

[限时福利]5分钟带你快速了解新一代开发板:M5STACK
[限时福利]5分钟带你快速
一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
天猫精灵接入语音提示找不到该设备?
天猫精灵接入语音提示找不
今天又刷了一遍代码,天猫精灵提示 没有找到你要操作的设备! 怎么回事啊??? 折腾
引入库的问题,不知道怎么叙述 看图吧
引入库的问题,不知道怎么
最左边的是主文件 也就是启动的文件 后边三个是引入的 在后边这个文件再引入库就报错
blinker电源插座
blinker电源插座
这台blinker电源插座有blinker控制和手动控制两种工作方式. 1.blinker控制:滑条用于设
blinker灯、环境传感器套件意见收集
blinker灯、环境传感器套
计划春节后推出blinker氛围灯和环境检测套件。 本帖收集相关建议,如若采纳,发红包(
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表