实验报告已经交上去了,接下来只要等分数就好。下面来看看贪吃蛇的代码实现,并不是很难,就不过多介绍了。
#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; }
- 整体组装好的效果
- 运行实拍
以上就是第一次的单片机开发啦~其他小组有做避障小车的,有做自动感应开关的,总之都很有创意,我自愧弗如。希望以后能向他们看齐。