实验报告已经交上去了,接下来只要等分数就好。下面来看看贪吃蛇的代码实现,并不是很难,就不过多介绍了。
#include <msp430.h>
#include "led_matrix.h"
#include "button.h"
#include <stdlib.h>
#include <time.h>
#define uchar unsigned char
typedef struct node {
uchar x, y;
} NODE;
NODE food, que[130]; //记录食物和蛇的坐标
uchar len; //队列长度
uchar dir; //行进方向,0,1,2,3分别代表上左下右
uchar map[16]; //记录地图
uchar flag; //记录是否挂了
/*将坐标存入队列中的第n项*/
void putque(uchar num, uchar x, uchar y) {
que[num].x = x;
que[num].y = y;
}
/*检测食物是否和蛇重合*/
uchar checkCovered() {
int i;
for (i = 0; i < len; i++) {
if (food.x == que[i].x && food.y == que[i].y)
return 1;
}
return 0;
}
/*显示地图至点阵*/
void showMap() {
int i;
for (i = 0; i < 16; i++)
map[i] = 0;
for (i = 0; i < len; i++) {
map[que[i].x] |= (1 << (7 - que[i].y));
}//将需要点亮的位置设为1
map[food.x] |= (1 << (7 - food.y));
for (i = 0; i < 8; i++) {
//一次写入两行,即两个模块的第 i 行
WRITE_2D(i + 1, map[i], i + 1, map[i + 8]);
}
}
/*放置食物*/
void setFood() {
do {
food.x = rand() % 16;
food.y = rand() % 8;
} while (checkCovered() == 1);
//随机生成食物坐标,并检测是否和蛇重合
}
/*蛇走动*/
void snakeGo() {
int i;
for (i = len; i > 0; i--)
que[i] = que[i - 1];
int x = que[1].x, y = que[1].y;
switch (dir) {
case 0:
x -= 1;
break;
case 1:
y -= 1;
break;
case 2:
x += 1;
break;
case 3:
y += 1;
break;
default:
break;
}
if (x < 0 || x > 15 || y < 0 || y > 7) {
//如果蛇越界
flag = 1;
return;
} else {
que[0].x = x;
que[0].y = y;
}
for (i = 1; i < len; i++) {
if (que[0].x == que[i].x && que[0].y == que[i].y) {
//如果撞到自己
flag = 1;
return;
}
}
}
/*按钮侦听*/
void btListener() {
if (_BTIN & _UP && (dir != 2)) {
dir = 0;
return;
}
if (_BTIN & _LEFT && (dir != 3)) {
dir = 1;
return;
}
if (_BTIN & _DOWN && (dir != 0)) {
dir = 2;
return;
}
if (_BTIN & _RIGHT && (dir != 1)) {
dir = 3;
return;
}
}
void main(void) {
WDTCTL = WDTPW + WDTHOLD;
init_MAX7219(); //初始化7219
buttonInit(); //初始化键盘
_EINT();
srand(time(NULL));
gamestart:
len = 2;
dir = 0;
flag = 0;
putque(0, 8, 4);
putque(1, 9, 4);
setFood();
showMap();
int i;
while (flag == 0) {
for (i = 0; i < 20000; i++)
btListener();
showMap();
/*蛇走动*/
if (food.x == que[0].x && food.y == que[0].y) {
/*吃到了食物*/
len++;
snakeGo();
setFood();
//showMap();
} else {
/*没吃到食物*/
snakeGo();
}
showMap();
}
//游戏结束,5秒后重新开始
_delay_cycles(5000000);
goto gamestart;
}
- 整体组装好的效果
- 运行实拍
以上就是第一次的单片机开发啦~其他小组有做避障小车的,有做自动感应开关的,总之都很有创意,我自愧弗如。希望以后能向他们看齐。


发表回复