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-08
Revision:
1:6fab471dffd5
Parent:
0:f2f2c76b9816

File content as of revision 1:6fab471dffd5:

/** maze_vt100 a simple maze using vt100 and MMA8451Q libraries
 */
#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 ;
float threshold = 0.2 ;

/** Check if two pos_type values are same
 * @param pos_type a
 * @param pos_type b
 * @returns if a and b are same position
 */
bool isSame(pos_type a, pos_type b)
{
    return((a.x == b.x)&&(a.y == b.y)) ;
}

/** Draw the maze defined in the "maze.h"
 * @param pos_type *current actually the start point
 * @param pos_type *goal the position of the goal
 * @note those params are actually returned by this function
 */
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:  // path
                c = ' ' ; 
                break ; 
            case 1:  // wall
                c = ' ' ; 
                tty.setBG(0) ; // set background to black
                tty.setFG(7) ; // set foreground to white
                break ; 
            case 2: // Start point  
                c = 'S' ;
                current->x = x ;
                current->y = y ; 
                break ; // start
            case 3: // Goal  
                c = 'G' ;
                tty.green() ;
                goal->x = x ;
                goal->y = y ; 
                break ; 
            default: // should not be here 
                c = '?' ; 
                break ; // wth?
            }
            tty.putChar(x+1, y+1, c) ;
            tty.setBG(7) ; // set background to white
            tty.setFG(0) ; // set foreground to black
        }
        printf("\n\r") ;
    }
}

/** Filter out too little move 
 * @param float in returned value from the acc
 * @returns float result filtered value of in
 */
float filterVal(float in)
{
    float result = 0.0 ;
    if ((-threshold > in)||(in > threshold)) {
        result = in ;
    }
    return( result ) ;
}

/** Decide which direction to go
 * @param float res[] acc value of x, y 
 * @returns int direction to move 
 */
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) {
            direction = DIR_DOWN ;
        } else if (dx < 0.0) {
            direction = DIR_UP ;
        }
    } else { // vertical move
        if (dy > 0.0) {
            direction = DIR_RIGHT ;
        } else if (dy < 0.0) {
            direction = DIR_LEFT ;
        }
    }
    return(direction) ;
}

/** Get next positon to move to
 * @param pos_type current where we are now
 * @param int direction which way we'd like to move
 * @returns the candidate positon for the next move
 */
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 ) ;
}

/** Notice of the goal
 */
void showGoal(void)
{
    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") ;
}

/** Check if we can move to the next position
 * @param pos_type next the position we'd like to move next
 * @returns if the position is empty (movable)
 */
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 ) ;
}

/** main a simple maze program
 */
int main() {
    float res[3] ;
    pos_type current, next, goal ;
    int direction = DIR_STAY ;
    
    tty.cls() ;
    drawTextMaze(&current, &goal) ;
    tty.black() ;
    tty.putChar(current.x+1, current.y+1, '@') ;
    printf("\r\n") ;
    
    for (;;) {
        acc.getAccAllAxis(res) ;
        direction = getDirection(res) ;
        next = getNext(current, direction) ;
        if ((!isSame(current, next)) && checkMove(next)) {
           tty.putChar(current.x+1, current.y+1, ' ') ;
           tty.putChar(next.x+1, next.y+1, '@') ;
           tty.green() ;
           tty.putStr(1, MAZE_H+1, "\r\n") ;
           tty.black() ;
           current = next ;
           if (isSame(next, goal)) {
             break ; // goal in!
           }
        }
        wait(0.1) ;
    }
    showGoal() ;
    for (;;) {
        // wait for ever for reset
    }
}