实验报告已经交上去了,接下来只要等分数就好。下面来看看贪吃蛇的代码实现,并不是很难,就不过多介绍了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
#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; } |
- 整体组装好的效果
- 运行实拍
以上就是第一次的单片机开发啦~其他小组有做避障小车的,有做自动感应开关的,总之都很有创意,我自愧弗如。希望以后能向他们看齐。