1、在windows种把getch.h放入共享文件夹
2、在Ubuntu终端输入cd /media/sf_Share/ 进入共享文件夹
3、复制getch.h到c标准库中
sudo cp getch.h /usr/include/
4、加读权限
sudo chmod +r /usr/include/getch.h
5、导入getch.h头文件,使用getch()函数获取键值
Ubuntu下的键值:
上: 183 下: 184 左: 186 右: 185
走迷宫:
数据分析:
1、定义二维字符数组作为迷宫地图
2、定义变量记录角色的位置 x y
3、时间: time(NULL) 获取1970-1-1到运行时过了总秒数
逻辑分析:
进入死循环:
1、打印地图
2、等待获取方向键并处理
判断前方是不是路' '
如果是路:
1、把旧位置变成' '
2、把新位置变成'@'
3、更新角色位置坐标 x y
3、判断是否到达出口
如果是:程序结束
#include#include #include #include int main(int argc,const char* argv[]) { char maze[10][10]={ {'#','#','#','#','#','#','#','#','#','#'}, {'#',' ','#',' ',' ',' ',' ',' ','#','#'}, {'#','@',' ',' ','#',' ','#',' ',' ','#'}, {'#','#','#','#','#',' ','#','#',' ','#'}, {'#',' ','#',' ',' ',' ',' ','#',' ','#'}, {'#',' ',' ',' ','#','#','#','#',' ','#'}, {'#',' ','#','#','#',' ',' ','#',' ','#'}, {'#',' ','#',' ','#','#',' ','#',' ','#'}, {'#',' ',' ',' ',' ',' ',' ','#',' ',' '}, {'#','#','#','#','#','#',' ','#','#','#'} }; time_t s1,s2; s1 = time(NULL); // 记录角色位置 char man_x = 2,man_y = 1,flag = 0; for(;;) { // 清理屏幕 system("clear"); printf("走迷宫小游戏,按上下左右键移动角色!nn"); // 显示地图 for(int i=0; i<10; i++) { for(int j=0;j<10;j++) { printf("%c ",maze[i][j]); } printf("n"); } if(1 == flag) { printf("游戏胜利,总共用时%ld秒!n",s2-s1); return 0; } // 获取方向键处理 switch(getch()) { case 183: //向上 if(' ' == (maze[man_x-1][man_y])) { maze[man_x][man_y] = ' '; maze[--man_x][man_y] = '@'; } break; case 184: //向下 if(' ' == (maze[man_x+1][man_y])) { maze[man_x][man_y] = ' '; maze[++man_x][man_y] = '@'; } break; case 186: //向左 if(' ' == (maze[man_x][man_y-1])) { maze[man_x][man_y] = ' '; maze[man_x][--man_y] = '@'; } break; case 185: //向右 if(' ' == (maze[man_x][man_y+1])) { maze[man_x][man_y] = ' '; maze[man_x][++man_y] = '@'; } break; } if(1 == man_x && 1 == man_y && 0 == flag) { flag = 1; s2 = time(NULL); } } }
推箱子:
数据分析:
1、确定数值与字符的对应关系、
0 ' ' 路
1 '@' 人
2 '#' 墙
3 '$' 箱子
4 'O' 目标
5 '@' 人在目标上
7 '$' 箱子在目标上
2、定义8*8的二维数组作为地图
3、定义记录角色位置的变量 x y
4、定义记录步数的变量
逻辑分析:
进入死循环:
1、清理屏幕、显示地图
if(0 == map[i][j]) printf(" ");
2、判断是否游戏胜利
3、获取方向键并处理
前方是路/目标点,参考走迷宫
前方 +1
原位置 -1
更新坐标
前方是箱子
箱子的前方是路/目标点,参考走迷宫
人前方的前方 +3
人前方 -3+1
人原位置 -1
更新左边
#include#include #include int main(int argc,const char* argv[]) { int cnt=0; char Sokoban[8][8]={ {0,0,2,2,2,2,0,0}, {0,0,2,4,4,2,0,0}, {0,2,2,0,4,2,2,0}, {0,2,0,0,3,4,2,0}, {2,2,0,3,0,0,2,2}, {2,0,0,2,3,3,0,2}, {2,0,0,1,0,0,0,2}, {2,2,2,2,2,2,2,2} }; // 记录角色位置 char man_x = 6,man_y = 3,flag = 0; for(;;) { // 清理屏幕 system("clear"); cnt++; printf("推箱子小游戏,按上下左右键移动角色!nn"); // 显示地图 for(int i=0; i<8; i++) { for(int j=0;j<8;j++) { switch(Sokoban[i][j]) { case 0: printf(" "); break; case 1: printf("@ "); break; case 2: printf("# "); break; case 3: printf("$ "); break; case 4: printf("O "); break; case 5: printf("@ "); break; case 7: printf("$ "); break; } } printf("n"); } if(1 == flag) { printf("游戏胜利,共走了%d步!n",cnt-1); return 0; } // 获取方向键处理 switch(getch()) { case 183: //向上 if(0 == (Sokoban[man_x-1][man_y]) || 4 == (Sokoban[man_x-1][man_y])) { Sokoban[man_x][man_y] -= 1; Sokoban[--man_x][man_y] += 1; } else if(3 == (Sokoban[man_x-1][man_y]) || 7 == (Sokoban[man_x-1][man_y])) { if(0 == (Sokoban[man_x-2][man_y]) || 4 == (Sokoban[man_x-2][man_y])) { Sokoban[man_x][man_y] -= 1; Sokoban[--man_x][man_y] -= 2; Sokoban[man_x-1][man_y] += 3; } } break; case 184: //向下 if(0 == (Sokoban[man_x+1][man_y]) || 4 == (Sokoban[man_x+1][man_y])) { Sokoban[man_x][man_y] -= 1; Sokoban[++man_x][man_y] += 1; } else if(3 == (Sokoban[man_x+1][man_y]) || 7 == (Sokoban[man_x+1][man_y])) { if(0 == (Sokoban[man_x-2][man_y]) || 4 == (Sokoban[man_x-2][man_y])) { Sokoban[man_x][man_y] -= 1; Sokoban[++man_x][man_y] -= 2; Sokoban[man_x+1][man_y] += 3; } } break; case 186: //向左 if(0 == (Sokoban[man_x][man_y-1]) || 4 == (Sokoban[man_x][man_y-1])) { Sokoban[man_x][man_y] -= 1; Sokoban[man_x][--man_y] += 1; } else if(3 == (Sokoban[man_x][man_y-1]) || 7 == (Sokoban[man_x][man_y-1])) { if(0 == (Sokoban[man_x][man_y-2]) || 4 == (Sokoban[man_x][man_y-2])) { Sokoban[man_x][man_y] -= 1; Sokoban[man_x][--man_y] -= 2; Sokoban[man_x][man_y-1] += 3; } } break; case 185: //向右 if(0 == (Sokoban[man_x][man_y+1]) || 4 == (Sokoban[man_x][man_y+1])) { Sokoban[man_x][man_y] -= 1; Sokoban[man_x][++man_y] += 1; } else if(3 == (Sokoban[man_x][man_y+1]) || 7 == (Sokoban[man_x][man_y+1])) { if(0 == (Sokoban[man_x][man_y+2]) || 4 == (Sokoban[man_x][man_y+2])) { Sokoban[man_x][man_y] -= 1; Sokoban[man_x][++man_y] -= 2; Sokoban[man_x][man_y+1] += 3; } } } if(7 == Sokoban[1][3] && 7 == Sokoban[1][4] && 7 == Sokoban[2][4] && 7 == Sokoban[3][5]) { flag = 1; } } }



