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-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(¤t, &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 (;;) { } }