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); }; } } }