MSP430F5529LP 开发实战(02)

实验报告已经交上去了,接下来只要等分数就好。下面来看看贪吃蛇的代码实现,并不是很难,就不过多介绍了。

#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;
}

  • 整体组装好的效果

IMG_8667

  • 运行实拍

1.pic_hd


以上就是第一次的单片机开发啦~其他小组有做避障小车的,有做自动感应开关的,总之都很有创意,我自愧弗如。希望以后能向他们看齐。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注