小项目走迷宫

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.h()函数获取键值
Ubuntu下的键值:
上:183 下:184 左:186 右:185

走迷宫:
数据分析 :
1、定义二维字符数组作为迷宫地图
2、定义变量记录角色当前位置 x y
3、时间:time(NULL)获取1970-1-1到达运行时
过了总秒数
逻辑分析:
进入死循环:
1、显示地图
2、获取方向键并处理
判断前方是不是路’ ’
如果是:
1、把旧位置变成’ ’
2、把新位置变成’@’
3、更新角色位置坐标 x y
3、判断是否到达出口
如果是:程序结束

    #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 seconds1=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(6man_x&&9man_y)
{printf(“游戏胜利,过了%lu秒!\n”,time(NULL)-seconds1);
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;
}
}
}

推箱子:
数据分析:
1、确定数值与字符的对应关系
0 ’ ’
1 ‘@’
2 ‘#’
3 ‘ ′ 4 ′ o ′ 5 ′ @ ′ 7 ′ ' 4 'o' 5 '@' 7 ' 4o5@7
2、定义8*8整数地图并初始化
3、定义记录角色位置的变量 x y
4、定义记录步数的变量

逻辑分析:
    进入死循环:
    1、清理屏幕、显示地图
        if(0==map[i][j])  printf(" ");
    2、判断是否游戏胜利
    3、获取方向键并处理
        1、前面是路/目标点,参考走迷宫
            前方 +1
            原位置 -1
            更新坐标
        2、前方是箱子
            箱子的前方是路\目标点
                人前方的前方    +3
                人前方  -3+1
                人原位置    -1
                更新坐标

#include <stdio.h>
#include <getch.h>
#include <stdlib.h>
int main(int argc,const char* argv[])
{
int 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 count=0;
int steps=0;
char man_x=6,man_y=3;
for(;😉
{
count=0;
system(“clear”);

for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
if(0map[i][j])
printf(" ");
if(1
map[i][j])
printf(“@”);
if(2map[i][j])
printf(“#”);
if(3
map[i][j])
printf(“KaTeX parse error: Expected '}', got 'EOF' at end of input: … printf("”);
}
}
printf(“\n”);

    }
    if(count==4)
    {
    printf("游戏胜利");
    printf("步数%d:\n",steps);
    return 0;
    }
switch(getch())
{
    case 183:
        if(0==map[man_x-1][man_y]||4==map[man_x-1][man_y])
        {
            map[man_x][man_y]-=1;
            map[--man_x][man_y]+=1;
        }
        else if(3==map[man_x-1][man_y]||7==map[man_x-1][man_y])
        {
            if(0==map[man_x-2][man_y]||4==map[man_x-2][man_y])

            {
            map[man_x][man_y]-=1;
            map[man_x-2][man_y]+=3;
            map[--man_x][man_y]-=2;
            }
            }
    steps++;
        break;
    case 184:
        if(0==map[man_x+1][man_y]||4==map[man_x+1][man_y])
        {
            map[man_x][man_y]-=1;
            map[++man_x][man_y]+=1;
        }
        else if(3==map[man_x+1][man_y]||7==map[man_x+1][man_y])
        {
            if(0==map[man_x+2][man_y]||4==map[man_x+2][man_y])

            {   
            map[man_x][man_y]-=1;
            map[man_x+2][man_y]+=3;
            map[++man_x][man_y]-=2;
            }
        }
        steps++;
         break;
    case 186:
         if(0==map[man_x][man_y-1]||4==map[man_x][man_y-1])
        {
            map[man_x][man_y]-=1;
            map[man_x][--man_y]+=1;
        }
        else if(3==map[man_x][man_y-1]||7==map[man_x][man_y-1])
        {
            if(0==map[man_x][man_y-2]||4==map[man_x][man_y-2])
            {map[man_x][man_y]-=1;
            map[man_x][man_y-2]+=3;
            map[man_x][--man_y]-=2;
            }
        }
        steps++;
        break;
    case 185:
         if(0==map[man_x][man_y+1]||4==map[man_x][man_y+1])
        {
            map[man_x][man_y]-=1;
            map[man_x][++man_y]+=1;
        }
        else if(3==map[man_x][man_y+1]||7==map[man_x][man_y+1])
        {
            if(0==map[man_x][man_y+2]||4==map[man_x][man_y+2])
            {
            map[man_x][man_y]-=1;
            map[man_x][man_y+2]+=3;
            map[man_x][++man_y]-=2;
            }
        }
        steps++;
        break;
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值