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” を編集することで独自の迷路を作成していただけます。
After download and reset, the point "@" is located at the start point. Goal is the green "G."
ダウンロードしてリセットすると、画面のスタート位置に“@”が置かれます。 ゴールは緑色の“G”です。
Move the FRDM-KL25Z board to let the "@" go.
FRDM-KL25Z を動かして、“@”を移動させます。
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(¤t, &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 } }