一、Windows下获取方向键
1、导入#include<conin.h>
2、通过getch()返回值获取键盘上的键值
上:72 下:80 左:75 右:77
二、Linux下获取方向键:
1、在Windows中把getch.h文件放入共享文件夹中
2、把getch.h放入C标准库默认路径中,在Linux
sudo cp /media/sf_share/getch.h /usr/include/
3、给getch.h加读权限
sudo chmod +r /usr/include/getch.h
上:183 下:184 左:186 右:185
getch.h文件
(3条消息) Linux系统中获取键盘输入-Linux文档类资源-优快云文库
三、走迷宫练习
数据分析:
1、定义字符型的二维数组作为地图
2、定义记录角色位置变量
逻辑分析:
进入死循环
1、显示地图
2、获取方向键并处理
前方是墙 不需要处理
前方是路 可以移动
前方位置变成'@'
原来位置变成' '
更新坐标变量
3、判断是否到达出口
如果是:程序结束
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <getch.h>
void up(void);
void down(void);
void right(void);
void left(void);
void show(void);
bool is_win(void);
bool is_move=true;
int x=4,y=4;
int x_z=9,y_z=8;
int time1,time2;
//1、定义地图二维数组
char map [10][10]={
{' ','#','#','#','#','#','#','#','#','#'},
{' ',' ','#','#','#','#','#','#','#','#'},
{'#',' ',' ','#','#','#','#','#','#','#'},
{'#','#',' ',' ','#','#','#','#','#','#'},
{'#','#','#',' ','@','#','#','#','#','#'},
{'#','#','#','#',' ',' ','#','#','#','#'},
{'#','#','#','#','#',' ',' ','#','#','#'},
{'#','#','#','#','#','#',' ',' ','#','#'},
{'#','#','#','#','#','#','#',' ',' ','#'},
{'#','#','#','#','#','#','#','#',' ','#'},
};
//2、定义记录角色位置变量
int main()
{
for(;;)
{
time1=time(NULL);
show();
int dir=getch();
is_move=false;
switch(dir)
{
case 183:up();break;
case 184:down();break;
case 186:left();break;
case 185:right();break;
}
if(is_win())
{
show();
time2=time(NULL);
printf("游戏胜利,用时%d秒",time2-time1);
return 0;
}
}
}
void show(void)
{
system("clear");
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
printf("%c ",map[i][j]);
}
printf("\n");
}
}
void right(void)
{
if(y+1<10)
{
if(map[x][y+1]==' ')
{
map[x][y]=' ';
map[x][y+1]='@';
y=y+1;
is_move=true;
}
}
}
void left(void)
{
if(y-1>=0)
{
if(map[x][y-1]==' ')
{
map[x][y]=' ';
map[x][y-1]='@';
y=y-1;
is_move=true;
}
}
}
void up(void)
{
if(x-1>=0)
{
if(map[x-1][y]==' ')
{
map[x][y]=' ';
map[x-1][y]='@';
x=x-1;
is_move=true;
}
}
}
void down(void)
{
if(x+1<10)
{
if(map[x+1][y]==' ')
{
map[x][y]=' ';
map[x+1][y]='@';
x=x+1;
is_move=true;
}
}
}
bool is_win(void)
{
if(x==x_z&&y==y_z)
{
return true;
}
else
{
return false;
}
}
四、推箱子练习
数据分析:
0 路
1 墙壁
2 人
3 箱子
4 目标点
6 人(目标点)
7 箱子(目标点)
1、定义整数类型的二维数组
2、定义记录人的位置变量 x,y
3、定义记录步数的变量
for(;;)
{
1、清屏、显示界面
2、获取方向键并处理
1、前方是路或者目标点
参考走迷宫 前方+2 原位置-2
2、人的前方是箱子,箱子的前方是路或目标点
3、判断在目标点上箱子的数量是否==4
是:结束程序
}
#include <stdio.h>
#include <stdlib.h>
#include <getch.h>
#include <stdbool.h>
void show(void);
void up(void);
void down(void);
void right(void);
void left(void);
bool is_wim(void);
int x=6,y=3,step=0;;
int arr[8][8]={
{1,1,1,1,1,1,1,1},
{1,1,1,4,4,1,1,1},
{1,1,1,0,4,1,1,1},
{1,1,0,0,3,4,1,1},
{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 main()
{
for(;;)
{
show();
switch(getch())
{
case 183: up();break;
case 184: down();break;
case 185: right();break;
case 186: left();break;
}
if(is_wim())
{
show();
printf("共用了%d步",step);
return 0;
}
}
}
void show(void)
{
system("clear");
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
if(arr[i][j]==0)
{
printf(" ");
}
if(arr[i][j]==1)
{
printf("# ");
}
if(arr[i][j]==2)
{
printf("@ ");
}
if(arr[i][j]==3)
{
printf("$ ");
}
if(arr[i][j]==4)
{
printf("O ");
}
if(arr[i][j]==6)
{
printf("@ ");
}
if(arr[i][j]==7)
{
printf("$ ");
}
}
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-=1;
step++;
}
else if((arr[x-1][y]==7||arr[x-1][y]==3)&&(arr[x-2][y]!=1&&arr[x-2][y]!=3&&arr[x-2][y]!=7))
{
arr[x-1][y]-=1;
arr[x-2][y]+=3;
arr[x][y]-=2;
x-=1;
step++;
}
}
void down(void)
{
if(arr[x+1][y]==0||arr[x+1][y]==4)
{
arr[x+1][y]+=2;
arr[x][y]-=2;
x+=1;
step++;
}
else if((arr[x+1][y]==7||arr[x+1][y]==3)&&(arr[x+2][y]!=1&&arr[x+2][y]!=3&&arr[x+2][y]!=7))
{
arr[x+1][y]-=1;
arr[x+2][y]+=3;
arr[x][y]-=2;
x+=1;
step++;
}
}
void right(void)
{
if(arr[x][y+1]==0||arr[x][y+1]==4)
{
arr[x][y+1]+=2;
arr[x][y]-=2;
y+=1;
step++;
}
else if((arr[x][y+1]==7||arr[x][y+1]==3)&&(arr[x][y+2]!=1&&arr[x][y+2]!=3&&arr[x][y+2]!=7))
{
arr[x][y+1]-=1;
arr[x][y+2]+=3;
arr[x][y]-=2;
y+=1;
step++;
}
}
void left(void)
{
if(arr[x][y-1]==0||arr[x][y-1]==4)
{
arr[x][y-1]+=2;
arr[x][y]-=2;
y-=1;
step++;
}
else if((arr[x][y-1]==7||arr[x][y-1]==3)&&(arr[x][y-2]!=1&&arr[x][y-2]!=3&&arr[x][y-2]!=7))
{
arr[x][y-1]-=1;
arr[x][y-2]+=3;
arr[x][y]-=2;
y-=1;
step++;
}
}
bool is_wim(void)
{
int i=0;
for(int j=0;j<8;j++)
{
for(int k=0;k<8;k++)
{
if(arr[j][k]==7)
{
i+=1;
}
}
}
if(i==4)
{
return true;
}
else
{
return false;
}
}