当前位置:首页 > 趣味小程序 > 正文内容

C++实现走迷宫小游戏

亿万年的星光5年前 (2021-01-28)趣味小程序2612
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);
                 
           };
       }
   }
   
   
   
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

【C++图形化编程】EasyX函数~图形绘制相关函数(2)

【C++图形化编程】EasyX函数~图形绘制相关函数(2)

(1)ellipse  椭圆void ellipse( int left, int top, int right, int ...

【二分与分治】中间值、边界值、循环条件、模块写法(1)

【二分与分治】中间值、边界值、循环条件、模块写法(1)

0.前言二分法并不简单,或者说“思路简单,细节爆炸”,举例来说,你可能已经看过很多题解,那么可能会看到下面几种写法mid=(left+right)/2 mid=(left+right)>&...

C++使用键盘控制物体移动

C++使用键盘控制物体移动

0.前言在前面几篇文章中,学习了键盘事件和光标移动,在这篇文章中,我们要使用键盘的上下左右键控制在控制台中出现的角色1.原理因为我们要通过移动键盘控制光标位置,那么在此之前需要提前获取到光标位置,然后...

【C++图形化编程】播放背景音乐

再做小游戏的时候有的时候需要背景音乐,这一点EasyX也可以实现。需要的头文件#include <mmsystem.h>  //多媒体设备接口 #pragm...

【算法】前缀和与差分(1)一维数组前缀和

【算法】前缀和与差分(1)一维数组前缀和

一、定义前缀和:是指某序列的前n项和。可以理解成数学上上的数列的前n项和。差分:是前缀和的逆运算。二、前缀和的分类可以分成一维数组的前缀和和二维 数组的前缀和一维数组前缀和  &n...

C++小游戏制作基础—键盘事件

0.前言我们制作小游戏的时候,需要用到键盘,一般是控制上下左右,这个时候就需要用到键盘事件了。1.键盘事件需要用到<conio.h>头文件,和_kbhit()函数程序参考:#include...