常用键值
上:183 下:184 左:186 右:185(在ubuntu下)
可以导入头文件getch.h来获取各个键的键值
#ifndef GETCH_H
#define GETCH_H
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
// 修改终端的控制方式,1取消回显、确认 2获取数据 3还原
static int getch(void)
{
// 记录终端的配置信息
struct termios old;
// 获取终端的配置信息
tcgetattr(STDIN_FILENO,&old);
// 设置新的终端配置
struct termios new = old;
// 取消确认、回显
new.c_lflag &= ~(ICANON|ECHO);
// 设置终端配置信息
tcsetattr(STDIN_FILENO,TCSANOW,&new);
// 在新模式下获取数据
int key_val = 0;
do{
key_val += getchar();
}while(stdin->_IO_read_end - stdin->_IO_read_ptr);
// 还原配置信息
tcsetattr(STDIN_FILENO,TCSANOW,&old);
return key_val;
}
#endif//GETCH_H
小项目
走迷宫:
数据分析:
1,定义二维字符数组作为走迷宫的地图
2,定义两个变量来记录角色的位置x,y
逻辑分析:
1,进入死循环:
1,打印地图(遍历二维数组)
2,等待获取方向键并处理
判断前方是否是路' '
如果是:
1,把旧位置变成' '
2,把新位置变成 @
3,更新角色位置坐标 x,y
3,判断是否到达出口
如果是:结束程序
推箱子:
数据分析:
1,确定数值和字符的对应关系
0 ' '
1 '@'
2 '#'
3 '$'
4 'O'
5 '@'
7 '%'
2,定义一个8*8的整型二维数组并初始化
3,定义一个记录角色位置的变量 x y
4,定义一个记录步数的变量
逻辑分析:
1,进入死循环
1,清屏,显示地图
2,判断游戏是否胜利
3,获取方向键并处理
前方是路/目标点
前方+1
目标点-1
更新坐标
前方是箱子
箱子的前方是路/目标点
人前方的前方 +3
人前方 -3+1
人的位置 -1
更新
#include <stdio.h>
#include <getch.h>
#include <stdlib.h>
#include <time.h>
int main(int argc,const char* argv[])
{
char maze[10][10]={
{'#','#','#','#','#','#','#','#','#','#'},
{'#',' ',' ','#','#','#','#',' ',' ',' '},
{'#','@','#',' ',' ',' ','#',' ','#','#'},
{'#',' ','#',' ','#',' ','#',' ','#','#'},
{'#',' ',' ',' ','#',' ',' ',' ','#','#'},
{'#',' ','#','#',' ','#','#','#','#','#'},
{'#',' ','#',' ',' ',' ',' ',' ',' ','#'},
{'#',' ','#',' ','#','#','#','#',' ','#'},
{'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
{'#','#','#','#','#','#','#','#','#','#'},
};
//记录角色位置
char man_x = 2,man_y =1;
//显示地图
time_t start,end;
start = time(NULL);
for(;;)
{ //清理屏幕
system("clear");
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
printf("%c ",maze[i][j]);
}
printf("\n");
}
//获取方向
if(1 == man_x && 9 == man_y)
{
end = time(NULL);
printf("游戏胜利,用时%ld秒",end-start);
return 0;
}
switch(getch())
{
case 183://方向健上 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;
}
}
}
#include <stdio.h>
#include <getch.h>
#include <stdlib.h>
int main(int argc,const char* argv[])
{
int arr_map[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}
};
int x=6,y=3,count=0;
for(;;)
{
system("clear");
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
if(0==arr_map[i][j])
printf(" ");
if(1==arr_map[i][j])
printf("@ ");
if(2==arr_map[i][j])
printf("# ");
if(3==arr_map[i][j])
printf("$ ");
if(4==arr_map[i][j])
printf("O ");
if(5==arr_map[i][j])
printf("@ ");
if(7==arr_map[i][j])
printf("$ ");
}
printf("\n");
}
if(7 == arr_map[1][3] && 7 == arr_map[1][4] && 7 == arr_map[3][5] && 7 == arr_map[2][4])
{
printf("游戏胜利 共用了%d次",count);
return 0;
}
switch(getch())
{
case 183:
if(0 == arr_map[x-1][y] || 4 == arr_map[x-1][y])
{
arr_map[x][y]-=1;
arr_map[--x][y]+=1;
}
else if(3 == arr_map[x-1][y] && (0 == arr_map[x-2][y] || 4 == arr_map[x-2][y]))
{
arr_map[x][y]-=1;
arr_map[--x][y]-=2;
arr_map[x-1][y]+=3;
}
else if(7 == arr_map[x-1][y] && (4 == arr_map[x-2][y] || 0 == arr_map[x-2][y]))
{
arr_map[x][y]-=1;
arr_map[--x][y]-=2;
arr_map[x-1][y]+=3;
}
count++;
break;
case 184:
if(0 == arr_map[x+1][y] || 4 == arr_map[x+1][y])
{
arr_map[x][y]-=1;
arr_map[++x][y]+=1;
}
else if(3 == arr_map[x+1][y] && (0 == arr_map[x+2][y] || 4 == arr_map[x+2][y]))
{
arr_map[x][y]-=1;
arr_map[++x][y]-=2;
arr_map[x+1][y]+=3;
}
else if(7 == arr_map[x+1][y] && (4 == arr_map[x+2][y] || 0 == arr_map[x+2][y]))
{
arr_map[x][y]-=1;
arr_map[++x][y]-=2;
arr_map[x+1][y]+=3;
}
count++;
break;
case 186:
if(0 == arr_map[x][y-1] || 4 == arr_map[x][y-1])
{
arr_map[x][y]-=1;
arr_map[x][--y]+=1;
}
else if(3 == arr_map[x][y-1] && (0 == arr_map[x][y-2] || 4 == arr_map[x][y-2]))
{
arr_map[x][y]-=1;
arr_map[x][--y]-=2;
arr_map[x][y-1]+=3;
}
else if(7 == arr_map[x][y-1] && (4 == arr_map[x][y-2] || 0 == arr_map[x][y-2]))
{
arr_map[x][y]-=1;
arr_map[x][--y]-=2;
arr_map[x][y-1]+=3;
}
count++;
break;
case 185:
if(0 == arr_map[x][y+1] || 4 == arr_map[x][y+1])
{
arr_map[x][y]-=1;
arr_map[x][++y]+=1;
}
else if(3 == arr_map[x][y+1] && (0 == arr_map[x][y+2] || 4 == arr_map[x][y+2]))
{
arr_map[x][y]-=1;
arr_map[x][++y]-=2;
arr_map[x][y+1]+=3;
}
else if(7 == arr_map[x][y+1] && (4 == arr_map[x][y+2] || 0 == arr_map[x][y+2]))
{
arr_map[x][y]-=1;
arr_map[x][++y]-=2;
arr_map[x][y+1]+=3;
}
count++;
break;
}
}
}