2017-9-16 09:31:53 [显示全部楼层]
6704浏览
查看: 6704|回复: 2

[进阶] Arduboy贪吃蛇

[复制链接]
本帖最后由 Rainer 于 2017-9-22 09:02 编辑

从来没写过游戏,刚买了个Arduboy,写个贪吃蛇DEMO
Arduboy贪吃蛇图1


[mw_shl_code=cpp,true]#include "Arduboy2.h"

Arduboy2 arduboy;

#define POINT_SIZE 8
#define SCREEN_WIDTH 16
#define SCREEN_HIGHT 8

int snake[SCREEN_WIDTH][SCREEN_HIGHT];
int head;
int head_x;
int head_y;
int direct;
bool gameover = false;
int food_x;
int food_y;
int food_rand;
int food_i;
int prev;
int flash_x;
int flash_y;
int flash_time;
int prevPoint;
int button;
const unsigned char shit[] PROGMEM  = {
    0x20, 0x58, 0x54, 0x52, 0x45, 0x48, 0x70, 0x40,
};

void setup() {
  arduboy.begin();
  arduboy.clear();
  arduboy.setFrameRate(10);

  initgame();
}

void loop() {

  if (arduboy.pressed(UP_BUTTON)) {
    button = UP_BUTTON;
  } else if (arduboy.pressed(DOWN_BUTTON)) {
    button = DOWN_BUTTON;
  } else if (arduboy.pressed(LEFT_BUTTON)) {
    button = LEFT_BUTTON;
  } else if (arduboy.pressed(RIGHT_BUTTON)) {
    button = RIGHT_BUTTON;
  }

  if (!(arduboy.nextFrame()))
    return;

  arduboy.setCursor(0, 0);

  if (gameover) {

    if (arduboy.pressed(A_BUTTON)) {
      initgame();
    }

    arduboy.setCursor(40, 30);
    arduboy.print("GAME OVER\n");
    arduboy.setCursor(40, 40);
    arduboy.print("Score: ");
    arduboy.print(head - 3);
    arduboy.print("\n");
    arduboy.display();

    return;

  } else {
    arduboy.clear();
  }

  head = 0;
  head_x = 0;
  head_y = 0;
  prevPoint = 0;
  for (int x = 0; x < SCREEN_WIDTH; x++) {
    for (int y = 0; y < SCREEN_HIGHT; y++) {
      if (snake[x][y] > 0) {
        drawPoint(x, y);
        if (prevPoint > 0 && abs(snake[x][y] - prevPoint) == 1 ) {
          drawBody(x, y - 1, x, y);
        }
        if (snake[x][y] > head) {
          head = snake[x][y];
          head_x = x;
          head_y = y;
        }
      }
      prevPoint = snake[x][y];
    }
  }
  prevPoint = 0;
  for (int y = 0; y < SCREEN_HIGHT; y++) {
    for (int x = 0; x < SCREEN_WIDTH; x++) {
      if (snake[x][y] > 0 && prevPoint > 0 && abs(snake[x][y] - prevPoint) == 1 ) {
        drawBody(x - 1, y, x, y);
      }
      prevPoint = snake[x][y];
    }
  }
  drawHead(head_x, head_y);
  drawEye(head_x, head_y);

  if (food_rand == 0) {
    food_rand = random(1, SCREEN_WIDTH * SCREEN_HIGHT - head);
    food_i = 0;
    for (int i = 0; i < SCREEN_WIDTH; i++) {
      for (int j = 0; j < SCREEN_HIGHT; j++) {
        if (snake[j] == 0) {
          if (food_i == food_rand) {
            food_x = i;
            food_y = j;
          }
          food_i++;
        }
      }
    }
  }
  // drawPoint(food_x, food_y);
  arduboy.drawBitmap(food_x * POINT_SIZE, food_y * POINT_SIZE, shit, POINT_SIZE, POINT_SIZE, WHITE);

  if (button == UP_BUTTON && prev != DOWN_BUTTON) {
    forward(UP_BUTTON);
  } else if (button == DOWN_BUTTON && prev != UP_BUTTON) {
    forward(DOWN_BUTTON);
  } else if (button == LEFT_BUTTON && prev != RIGHT_BUTTON) {
    forward(LEFT_BUTTON);
  } else if (button == RIGHT_BUTTON && prev != LEFT_BUTTON) {
    forward(RIGHT_BUTTON);
  } else {
    forward(direct);
  }
  button = 0;

  if (head_x == food_x && head_y == food_y) {
    food_rand = 0;

    flash_x = food_x;
    flash_y = food_y;
    flash_time = 3;

  } else {
    for (int i = 0; i < SCREEN_WIDTH; i++) {
      for (int j = 0; j < SCREEN_HIGHT; j++) {
        if (snake[j] > 0) {
          snake[j]--;
        }
      }
    }
  }

  if (flash_time > 0) {
    arduboy.drawCircle(
    flash_x * POINT_SIZE + POINT_SIZE / 2 - 1,
    flash_y * POINT_SIZE + POINT_SIZE / 2 - 1,
    POINT_SIZE / 2 + 4 - flash_time,
    1);

    flash_time--;
    if (flash_time == 0) {
      flash_x = -1;
      flash_y = -1;
    }
  }

  arduboy.display();
}

void drawPoint(int x, int y) {

  //  for (int i = 0; i < POINT_SIZE / 2; i++) {
  //    arduboy.drawRect(x * POINT_SIZE + i, y * POINT_SIZE + i, POINT_SIZE - i * 2, POINT_SIZE - i * 2, 1);
  //  }

  arduboy.fillCircle(
    x * POINT_SIZE + POINT_SIZE / 2 - 1,
    y * POINT_SIZE + POINT_SIZE / 2 - 1,
    POINT_SIZE / 2 - 1,
    WHITE);
}

void drawHead(int x, int y) {
  arduboy.fillCircle(
    x * POINT_SIZE + POINT_SIZE / 2 - 1,
    y * POINT_SIZE + POINT_SIZE / 2 - 1,
    POINT_SIZE / 2,
    WHITE);
}

void drawBody(int x0, int y0, int x1, int y1) {
  int body_x;
  int body_y;
  if (x0 < x1) {
    body_x = x0 * POINT_SIZE + POINT_SIZE / 2 - 1;
  } else {
    body_x = x0 * POINT_SIZE;
  }
  if (y0 < y1) {
    body_y = y0 * POINT_SIZE + POINT_SIZE / 2 - 1;
  } else {
    body_y = y0 * POINT_SIZE;
  }
  arduboy.fillRect(body_x, body_y, POINT_SIZE - 1, POINT_SIZE - 1, WHITE);
}

void forward(int d) {
  if (d == UP_BUTTON) {
    head_y--;
  } else if (d == DOWN_BUTTON) {
    head_y++;
  } else if (d == LEFT_BUTTON) {
    head_x--;
  } else if (d == RIGHT_BUTTON) {
    head_x++;
  }

  if (head_x >= SCREEN_WIDTH
      || head_x < 0
      || head_y >= SCREEN_HIGHT
      || head_y < 0
      || snake[head_x][head_y] > 0
     ) {
    gameover = true;
  } else {
    snake[head_x][head_y] = ++head;
    direct = prev = d;
  }
}

void drawEye(int x, int y) {
  // arduboy.drawCircle(
  // flash_x * POINT_SIZE + POINT_SIZE / 2 - 1,
  // flash_y * POINT_SIZE + POINT_SIZE / 2 - 1,
  // POINT_SIZE / 2 + 4 - flash_time,
  // 1);
  if (direct == UP_BUTTON || direct == DOWN_BUTTON) {
    arduboy.fillCircle(
      x * POINT_SIZE + POINT_SIZE / 2 - 1 - 2,
      y * POINT_SIZE + POINT_SIZE / 2 - 1,
      1,
      BLACK);
    arduboy.fillCircle(
      x * POINT_SIZE + POINT_SIZE / 2 - 1 + 2,
      y * POINT_SIZE + POINT_SIZE / 2 - 1,
      1,
      BLACK);
  } else {
    arduboy.fillCircle(
      x * POINT_SIZE + POINT_SIZE / 2 - 1,
      y * POINT_SIZE + POINT_SIZE / 2 - 1 - 2,
      1,
      BLACK);
    arduboy.fillCircle(
      x * POINT_SIZE + POINT_SIZE / 2 - 1,
      y * POINT_SIZE + POINT_SIZE / 2 - 1 + 2,
      1,
      BLACK);
  }
}

void initgame() {

  for (int i = 0; i < SCREEN_WIDTH; i++) {
    for (int j = 0; j < SCREEN_HIGHT; j++) {
      snake[j] = 0;
    }
  }

  snake[0][3] = 1;
  snake[1][3] = 2;
  snake[2][3] = 3;

  direct = RIGHT_BUTTON;
  gameover = false;
  food_rand = 0;
  flash_x = -1;
  flash_y = -1;
  flash_time = 0;
  button = 0;
}

[/mw_shl_code]



1973742214  高级技师

发表于 2017-9-16 11:58:31

.........有具体一点的吗
回复

使用道具 举报

luna  初级技神

发表于 2017-9-18 10:24:14

最后效果啥样啊?
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
关于楼主

楼主的其它帖子

上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail