浅学C++ (3)学习C语言(迷宫 推箱子)

常用键值
    上: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;
		}
	}
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值