Inspired by Mr. Jeff G.'s Mini Project LCD Maze, I hacked my version for FRDM-KL25Z. This one utilizes the MMA8451Q on the FRDM and my vt100 lib. By editing "maze.h" you can create your own maze.

Dependencies:   MMA8451Q mbed vt100

Another sample project to show how to use my vt100 lib along with MMA8451Q lib.

You can tailor the maze by editing "maze.h."

先にパブリッシュした vt100 ライブラリと、FRDM-KL25Zに搭載された加速度センサを使用した簡単な迷路プログラムです。

“maze.h” を編集することで独自の迷路を作成していただけます。

/media/uploads/Rhyme/maze_start.jpg

After download and reset, the point "@" is located at the start point. Goal is the green "G."

ダウンロードしてリセットすると、画面のスタート位置に“@”が置かれます。 ゴールは緑色の“G”です。

/media/uploads/Rhyme/maze_walking.jpg

Move the FRDM-KL25Z board to let the "@" go.

FRDM-KL25Z を動かして、“@”を移動させます。

/media/uploads/Rhyme/maze_goal.jpg

When "@" arrives at the goal with the "goal" banner, game ends.

“@”がゴールにたどり着くと“goal”というバナーが出てゲーム終了です。

main.cpp

Committer:
Rhyme
Date:
2014-12-07
Revision:
0:f2f2c76b9816
Child:
1:6fab471dffd5

File content as of revision 0:f2f2c76b9816:

#include "mbed.h"
#include "MMA8451Q.h"
#include "vt100.h"
#include "maze.h"

#define DIR_STAY  0
#define DIR_UP    1
#define DIR_DOWN  2
#define DIR_RIGHT 3 
#define DIR_LEFT  4



#define MMA8451_I2C_ADDRESS (0x1D<<1)

typedef struct _pos {
    int x ;
    int y ;
} pos_type ;

MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS) ;
vt100 tty ;

void drawTextMaze(pos_type *current, pos_type *goal) 
{
    int x, y ;
    char c ;
    
    tty.setBG(7) ; // set background to white
    tty.setFG(0) ; // set foreground to black
    tty.cls() ;
    
    for (y = 0 ; y < MAZE_H ; y++ ) {
        for (x = 0 ; x < MAZE_W ; x++ ) {
            switch(maze[y][x]) {
            case 0:  
                c = ' ' ; 
                break ; // path
            case 1:  
                c = ' ' ; 
                tty.setBG(0) ; // set background to black
                tty.setFG(7) ; // set foreground to white
                break ; // wall
            case 2:  c = 'S' ;
                current->x = x ;
                current->y = y ; 
                break ; // start
            case 3:  c = 'G' ;
                tty.green() ;
                goal->x = x ;
                goal->y = y ; 
                break ; // goal
            default: c = '?' ; break ; // wth?
            }
            tty.locate(x+1, y+1) ;
            printf("%c", c) ;
            tty.setBG(7) ; // set background to white
            tty.setFG(0) ; // set foreground to black
        }
        printf("\n\r") ;
    }
}

float filterVal(float in)
{
    float result = 0.0 ;
    if ((-0.2 < in)&&(in < 0.2)) {
        result = 0.0 ;
    } else {
        result = in ;
    }
    return( result ) ;
}

int getDirection(float res[])
{
    float dx, dy ;
    int direction = DIR_STAY ;
    dx = filterVal(res[0]) ;
    dy = filterVal(res[1]) ;

    if ((dx*dx) > (dy*dy)) { // holizontal move
        if (dx == 0.0) {
            //
        } else if (dx > 0.0) {
            direction = DIR_DOWN ;
        } else {
            direction = DIR_UP ;
        }
    } else { // vertical move
        if (dy == 0.0) {
            //      
        } else if (dy > 0) {
            direction = DIR_RIGHT ;
        } else {
            direction = DIR_LEFT ;
        }
    }
    return(direction) ;
}

pos_type getNext(pos_type current, int direction) 
{
    pos_type next = current ;
    switch(direction) {
    case DIR_STAY: 
        break ;
    case DIR_UP: 
        if (next.y > 0) { 
            next.y-- ; 
        }  
        break ;
    case DIR_DOWN: 
        if (next.y < (MAZE_H - 1)) { 
            next.y++ ; 
        } 
        break ;
    case DIR_RIGHT: 
        if (next.x < (MAZE_W - 1)) { 
            next.x++ ; 
        } ; 
        break ;
    case DIR_LEFT: 
        if (next.x > 0) { 
            next.x-- ; 
        } 
        break ;
    default: 
        break ;
    }
    return( next ) ;
}

bool checkMove(pos_type next) 
{
    bool result = false ;
    
    switch(maze[next.y][next.x]) {
    case POS_PATH:
    case POS_GOAL:
        result = true ;
        break ;
    case POS_START:
    case POS_WALL:
    default:
        result = false ;
        break ;
    } 
    return( result ) ;
}
    
int main() {
    float res[3] ;
    pos_type current, next, goal ;
    int direction = DIR_STAY ;
    
    tty.cls() ;
    drawTextMaze(&current, &goal) ;
    tty.locate(current.x+1, current.y+1) ;
    tty.black() ;
    printf("@") ;
    printf("\r\n") ;
    
    for (;;) {
        acc.getAccAllAxis(res) ;
        direction = getDirection(res) ;
        next = getNext(current, direction) ;
        if (((next.x != current.x)||(next.y != current.y)) && checkMove(next)) {
           tty.locate(current.x+1, current.y+1) ;
            printf(" ") ;
            tty.locate(next.x+1, next.y+1) ;
            printf("@") ;
            tty.green() ;
            tty.locate(1, MAZE_H+1) ;
            printf("\r\n") ;
            tty.black() ;
            current = next ;
            if ((next.x == goal.x)&&(next.y == goal.y)) {
                break ;
            }
        }
        wait(0.1) ;
    }
    tty.blue() ;
    tty.frame((MAZE_W/2)-4,(MAZE_H/2)-1,(MAZE_W/2)+4,(MAZE_H/2)+1) ;
    tty.red() ;
    tty.locate((MAZE_W/2)-3, (MAZE_H/2)) ;
    printf("G O A L\n\r") ;
    for (;;) {
    }
}