一、Windows下获取方向键
1、导入#include <conio.h>
2、通过getch()的返回值获取键盘上的键值
上:72 下:80 左:75 右:77
二、Linux下获取方向键
1、在window中吧getch.h文件放入共享文件夹中
2、把getch.h放入C标准库默认路径中,在Linux终端输入 sudo cp/media/共享文件名/getch.h user/include/
3、给getch.h加读写权限
sudo chmod +r /user/include/getch.h
4、Linux方向键键值:上183 下184 左186 右185
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_1 = old;
// 取消确认、回显
new_1.c_lflag &= ~(ICANON|ECHO);
// 设置终端配置信息
tcsetattr(STDIN_FILENO,TCSANOW,&new_1);
// 在新模式下获取数据
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、定义整数类型的二维数组(int型,以下数值代表对应一个物体或事件)
0 路 ' '
1 墙壁 '#'
2 人 '@'
3 箱子 '$'
4 目标点 'o'
6 人+目标点 '@'
7 箱子+目标点 '$'
2、定义记录人的位置变量
3、定义记录步数
逻辑分析
进入死循环
1、清屏、显示界面
2、获取方向键并处理
① 前方是路或者空目标点
参考走迷宫项目,前方+2,原位置-2
② 当人前方是箱子
当箱子的前方是路/目标点,移动
3、判断在目标点上箱子的数量是否==4
是:程序结束;
否:循环继续;
四、项目实现
#include <stdio.h>
#include <stdbool.h>
#include <getch.h>
#include <stdlib.h>
//定义整张游戏地图二维数组
int arr[8][8]={
{0,0,1,1,1,1,0,0},
{0,0,1,4,4,1,0,0},
{0,1,1,0,4,1,1,0},
{0,1,0,0,3,4,1,0},
{1,1,0,3,0,0,1,1},
{1,0,0,1,3,3,0,1},
{1,0,0,2,0,0,0,1},
{1,1,1,1,1,1,1,1}
};
//定义记录人位置变量
int x=6,y=3;
//定义记录步数变量
int cnt=0;
//显示地图
void show(void);
//移动
void up(void);
void down(void);
void left(void);
void right(void);
//判断游戏结束
bool end(void);
int main()
{
while(1)
{
int dir=0;
//显示地图
show();
//移动
dir=getch();
switch(dir)
{
case 183:up();break;
case 184:down();break;
case 186:left();break;
case 185:right();break;
}
//判断游戏结束
if(end())
{
show();
printf("恭喜通关!\n一共走了%d步\n",cnt);
return 0;
}
}
}
//显示地图
void show(void)
{
//清屏
system("clear");
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
switch(arr[i][j])
{
case 0:printf(" ");break;
case 1:printf("# ");break;
case 2:printf("@ ");break;
case 3:printf("$ ");break;
case 4:printf("o ");break;
case 6:printf("@ ");break;
case 7:printf("$ ");break;
}
}
printf("\n");
}
}
//移动
void up(void)
{
if(arr[x-1][y]==0||arr[x-1][y]==4)
{
arr[x-1][y]+=2;
arr[x][y]-=2;
x=x-1;
cnt++;
}
else if(arr[x-1][y]==3||arr[x-1][y]==7)
{
if(arr[x-2][y]==0||arr[x-2][y]==4)
{
arr[x-2][y]+=3;
arr[x-1][y]=arr[x-1][y]-1;
arr[x][y]-=2;
x=x-1;
cnt++;
}
}
}
void down(void)
{
if(arr[x+1][y]==0||arr[x+1][y]==4)
{
arr[x+1][y]+=2;
arr[x][y]-=2;
x=x+1;
cnt++;
}
else if(arr[x+1][y]==3||arr[x+1][y]==7)
{
if(arr[x+2][y]==0||arr[x+2][y]==4)
{
arr[x+2][y]+=3;
arr[x+1][y]=arr[x+1][y]-1;
arr[x][y]-=2;
x=x+1;
cnt++;
}
}
}
void left(void)
{
if(arr[x][y-1]==0||arr[x][y-1]==4)
{
arr[x][y-1]+=2;
arr[x][y]-=2;
y=y-1;
cnt++;
}
else if(arr[x][y-1]==3||arr[x][y-1]==7)
{
if(arr[x][y-2]==0||arr[x][y-2]==4)
{
arr[x][y-2]+=3;
arr[x][y-1]=arr[x][y-1]-1;
arr[x][y]-=2;
y=y-1;
cnt++;
}
}
}
void right(void)
{
if(arr[x][y+1]==0||arr[x][y+1]==4)
{
arr[x][y+1]+=2;
arr[x][y]-=2;
y=y+1;
cnt++;
}
else if(arr[x][y+1]==3||arr[x][y+1]==7)
{
if(arr[x][y+2]==0||arr[x][y+2]==4)
{
arr[x][y+2]+=3;
arr[x][y+1]=arr[x][y+1]-1;
arr[x][y]-=2;
y=y+1;
cnt++;
}
}
}
//判断游戏结束
bool end(void)
{
int sum=0;
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
if(arr[i][j]==7)
{
sum++;
}
}
}
if(sum==4)
{
return 1;
}
else
{
return 0;
}
}