1.简单版本

简单版本是利用字符数组实现的,利用字符数组设定入口和出口,用户每次按键就刷新一下当前字符数组。

参考代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include<conio.h>
int main() {
	char a[50][50] = { "######",
						"#O #  ",
						"# ## #",
						"#  # #",
						"##   #",
						"######"};
	int  i, x, y, p, q;
	x = 1; y = 1; p = 1; q = 5;  //出生点和出口点
	char ch;
	for (i = 0; i <=5; i++)    //循环6次
		puts(a[i]);   //输出得到6行
	while (x!=p||y!=q)   //除了出口位置以外都可以移动
	{
		ch = _getch();      //赋值字符
		if (ch == 's')    //方向“下”键,,移动方向已二维坐标系为准
		{  
			if (a[x + 1][y] != '#')
			{//当碰到墙壁则不移动,不然就变成穿墙外挂了
				a[x][y] = ' '; //无墙时则移动
				x++;
				a[x][y] = 'O';
			}
		}
		if (ch=='w')
		{
			if (a[x - 1][y] != '#')
			{
				a[x][y] = ' ';
				x--;
				a[x][y] = 'O';
			}
		}
		if (ch=='a')
		{
			if(a[x][y-1]!='#')
			{
				a[x][y] = ' ';
				y--;
				a[x][y] = 'O';
			}
		}
		if (ch=='d')
		{
			if(a[x][y + 1] != '#')
			{
				a[x][y] = ' ';
				y++;
				a[x][y] = 'O';
			}
		}
		system("cls");    //清屏 ,,因为每次移动要清楚之前的位置,,可以理解为 刷新
		for (i = 0; i <= 5; i++)   //给每行加6个字符
			puts(a[i]);   //得到一行6个字符串
	}
	system("cls");
	printf("恭喜你通关了\n");
		Sleep(5000);
	return 0;
}
2.复杂版本

复杂版本,完成度80% ,没有检测边界碰撞问题。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<conio.h>
#include<windows.h> 

int x=0,y=1,m=8,n=8; //x,y表示入口,m,n表示出口 

void gotoxy(int x, int y) {
    COORD pos = {x,y};
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出设备句柄
    SetConsoleCursorPosition(hOut, pos);//两个参数分别是指定哪个窗体,具体位置
}
//地图函数 
char map[50][50]{
	"* ********",  //0
	"* ********",  //1
	"* ********",  //2
	"* ********",  //3
	"* ********",  //4
	"* ********",  //5
	"* ********",  //6
	"* ********",  //7
	"*         ",  //8
	"**********",  //9
   //0123456789
};

//展示地图函数 
void showMap(){  
	for(int i=0;i<10;i++)
		puts(map[i]);
} 
//判断结束游戏函数 
int  check(int p,int q)
{
	if(p==m&&q==n)  //如果是出口 
	{
		system("color A9");
		system("cls");
		puts("恭喜过关"); 
		return 0 ;
	}else if(map[q][p]=='*')
	{
		gotoxy(23,23);
		printf("xing"); 
		return 1;
	}
	else   //剩余是通道 
	{
		puts("@");
		gotoxy(20,20);
		printf("%d,%d,%d,%d",p,m,q,n); 
		gotoxy(25,25);
		printf("%c",map[p][q]);
		return 2;
		
	}
}

using namespace std;
int main()
{
	
    system("cls");
    showMap(); 
	gotoxy(y,x);
	puts("@");
   
    char ch;  
    while (1){
        if (_kbhit()){//如果有按键按下,则_kbhit()函数返回真
            ch = _getch();//使用_getch()函数获取按下的键值
            if (ch == 'w'){  
                 system("cls");
				 showMap(); 
				 gotoxy(y,x-1);
				 	x-=1;
				 check(y,x);	 //检查边界以及墙 
				 	
				 
            }; 
            if (ch == 's'){ 
            	system("cls");
				 showMap(); 
				 gotoxy(y,x+1);
				   x+=1;
 				 check(y,x); 
				   
            };
            if (ch == 'a'){ 
				system("cls");
				 showMap(); 
				 gotoxy(y-1,x);
				  y-=1; 
 				 check(y,x);
				  
            };
            if (ch == 'd'){   
             	system("cls");
				 showMap(); 
				 gotoxy(y+1,x);
				  y+=1;
			     check(y,x);
				  
            };
        }
    }
    
    
    
 }