基本信息
源码名称:c++ 迷宫游戏 源码下载
源码大小:0.47M
文件格式:.zip
开发语言:C/C++
更新时间:2017-05-07
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
#include<iostream>
#include<string>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
#include <conio.h>
using namespace std;
#define Size 15
#define maxsmall 7
#define smallroad 6
#define mouse 4
#define start 2
#define end 3
#define wall 1
#define road 0
#define up 0
#define down 1
#define left 2
#define right 3
#define Esc 5
bool iftime=false;
const int Max=1000;
class Cirqueue
{
public :
Cirqueue(){front=rear=Max-1;}
void Enqueue(int x)
{
if((rear 1)%Max==front)
cout<<"Queue Full"<<endl;
else
{
rear=(rear 1)%Max;
data[rear]=x;
}
}
int Dequeue()
{
if(rear==front)
return 0;
else
{
front=(front 1)%Max;
return data[front];
}
}
int empty()
{
if(rear==front)
return 0;
return 1;
}
void deleteall()
{
while(empty()!=0)
{
Dequeue();
}
}
private:
int front,rear;
int data[Max];
};Cirqueue q;
class Map
{
private:
char maparr[Size 1][Size 1];
int direction;
public:
Map();
int count;
void creatmap(int x,int y);
void meungame(int number);
void startpaint();
void creatall();
int startgame();
void roaddisplay();
void smallroaddisplay(int x,int y);
void display(int i,int j);
int walk();
};
void meun();
void gameexplain();
void remove(int x,int y)
{
COORD coord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );
}
void hidden()
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(hOut,&cci);
cci.bVisible=0;
SetConsoleCursorInfo(hOut,&cci);
}
HANDLE hThread1;
DWORD WINAPI Thread1(LPVOID lpParameter)
{
int i=15;
iftime=false;
while(1)
{
remove(2,17);
printf("\r\t%02d",i);
if(i==0)
{
iftime=true;
TerminateThread(hThread1, 0);
CloseHandle(hThread1);
break;
}
Sleep(1000);
i--;
}
return 0;
}
int main()
{
char choich;
while(true)
{
int number=1;
hidden();
meun();
cin>>choich;
int select,flag=0;
string go;
switch(choich)
{
case '1':
system("cls");
while(true)
{
Map map;
map.creatall();
flag=0;
while(true)
{
map.meungame(number);
system("cls");
map.startpaint();
cout<<"====================="<<endl;
cout<<"........倒计时......."<<endl;
hThread1 = CreateThread(NULL, 0, Thread1, NULL, 0, NULL);
Sleep(1000);
select=map.startgame();
if(select==1 && iftime==false)
{
map.roaddisplay();
TerminateThread(hThread1, 0);
CloseHandle(hThread1);
remove(2,18);
cout<<"......恭喜你成功走出迷宫......"<<endl;
cout<<" .............................."<<endl;
while(true)
{
cout<<"如果想查看最短路径ok"<<endl;
cout<<"是否继续闯关yes/no"<<endl;
cin>>go;
if(go=="yes")
{
flag=0;
number ;
}
else if(go=="no")
flag=1;
else if(go=="ok")
{
flag=-1;
system("cls");
map.smallroaddisplay((Size 1)/2,(Size 1)/2);
cout<<endl;
system("pause");
}
else
{
flag=-1;
cout<<"对不起,您输入的方式无效,请重新输入yes/no"<<endl;
}
if(flag==1||flag==0)
break;
}
if(flag==1||flag==0)
break;
}
if(select==-1 && iftime==true)
{
TerminateThread(hThread1, 0);
CloseHandle(hThread1);
remove(2,18);
cout<<"未在规定时间内走出迷宫,闯关失败"<<endl;
cout<<"是否再一次闯本关(yes) 或 退出(no)"<<endl;
while(cin>>go)
{
if(go=="yes")
{
flag=0;
q.deleteall();
break;
}
else if(go=="no")
{
flag=1;
break;
}
else
cout<<"输入不规范请重新输入yes/no"<<endl;
}
}
if(select==0||flag==1)
{
TerminateThread(hThread1, 0);
CloseHandle(hThread1);
break;
}
}
if(flag==1||select==0)
{
system("cls");
break;
}
}
break;
case '2':
gameexplain();
system("cls");
break;
case '3':
exit(0);
break;
default:
cout<<"输入的不规范,请重新输入"<<endl;
system("pause");
system("cls");
break;
}
}
return 0;
}
void meun()
{
cout<<"★.....★.....★.....★.....★.....★.....★.....★.....★"<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
cout<<" 欢 迎 进 入 迷 宫 游 戏 "<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
cout<<" 1 . 开 始 游 戏 "<<endl;
cout<<" "<<endl;
cout<<" 2 . 游 戏 说 明 "<<endl;
cout<<" "<<endl;
cout<<" 3 . 退 出 游 戏 "<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
cout<<"★.....★.....★.....★.....★.....★.....★.....★.....★"<<endl;
}
void gameexplain()
{
system("cls");
cout<<"........................................................."<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
cout<<" 1.键盘方向键控制,上下左右行走 "<<endl;
cout<<" "<<endl;
cout<<" up向上 "<<endl;
cout<<" down向下 "<<endl;
cout<<" left向左 "<<endl;
cout<<" right向右 "<<endl;
cout<<" "<<endl;
cout<<" 2.在规定的30内走出迷宫则为成功, "<<endl;
cout<<" "<<endl;
cout<<" 若给定时间内不能走出迷宫则失败 "<<endl;
cout<<" "<<endl;
cout<<" 3.游戏中途如想退出,请按ESC键 "<<endl;
cout<<" "<<endl;
cout<<"........................................................."<<endl;
system("pause");
}
void Map::meungame(int number)
{
system("cls");
count=number;
cout<<" "<<endl;
cout<<" ◤ 第"<<count<<"关 ◢ "<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
system("pause");
}
Map::Map()
{
int i,j;
count=0;
for(i=1;i<=Size;i )
for(j=1;j<=Size;j )
maparr[i][j]=wall;
}
void Map::startpaint()
{
maparr[(Size 1)/2][(Size 1)/2]=mouse;
maparr[Size-1][Size]=end;
for(int i=1;i<=Size;i )
{
for(int j=1;j<=Size;j )
{
if(maparr[i][j]==mouse && (i!=(Size 1)/2 || j!=(Size 1)/2))
maparr[i][j]=road;
display(i,j);
}
cout<<endl;
}
}
void Map::display(int i,int j)
{
remove(2*j-2,i-1);
switch(maparr[i][j])
{
case start:
cout<<"入";
break;
case end:
cout<<"出";
break;
case wall:
cout<<"■";
break;
case road:
cout<<" ";
break;
case mouse :
cout<<"♀";
break;
case smallroad:
cout<<"*";
break;
case maxsmall:
cout<<"@";
break;
}
}
void Map::creatmap(int x,int y)
{
int c[4][2]={0,1,1,0,0,-1,-1,0};
int i,j,t;
for(i=0;i<4;i )
{
j=rand()%4;
t=c[i][0];c[i][0]=c[j][0];c[j][0]=t;
t=c[i][1];c[i][1]=c[j][1];c[j][1]=t;
}
maparr[x][y]=road;
for(i=0;i<4;i )
if(maparr[x 2*c[i][0]][y 2*c[i][1]]==wall)
{
maparr[x c[i][0]][y c[i][1]]=road;
creatmap(x 2*c[i][0],y 2*c[i][1]);
}
}
void Map::creatall()
{
srand((unsigned)time(NULL));
creatmap(2*(rand()%(Size/2) 1),2*(rand()%(Size/2) 1));
}
int Map::walk()
{
char c;
while(c=getch())
{
if(c==27) return Esc;
if(c==72) return left;
if(c==80) return right;
if(c==75) return up;
if(c==77) return down;
}
return -1;
}
int Map::startgame()
{
int x=(Size 1)/2;
int y=(Size 1)/2;
int flag=0,select;
while(iftime!=true)
{
select=walk();
q.Enqueue(x);
q.Enqueue(y);
switch(select)
{
case up:
if(maparr[x][y-1]!=wall)
{
maparr[x][y]=road;
maparr[x][y-1]=mouse;
display(x,y);
display(x,y-1);
y--;
}
break;
case down:
if(maparr[x][y 1]!=wall)
{
maparr[x][y]=road;
maparr[x][y 1]=mouse;
display(x,y);
display(x,y 1);
y ;
}
break;
case left:
if(maparr[x-1][y]!=wall)
{
maparr[x][y]=road;
maparr[x-1][y]=mouse;
display(x,y);
display(x-1,y);
x--;
}
break;
case right:
if(maparr[x 1][y]!=wall)
{
maparr[x][y]=road;
maparr[x 1][y]=mouse;
display(x,y);
display(x 1,y);
x ;
}
break;
case Esc:
flag=1;
break;
default:
break;
}
if(maparr[Size-1][Size]==mouse||flag==1)
break;
if(iftime==true)
return -1;
}
if(flag==1)
return 0;
return 1;
}
void Map::roaddisplay()
{
int x,y;
while(true)
{
x=q.Dequeue();
y=q.Dequeue();
maparr[x][y]=6;
if(x==0)
break;
else
{
display(x,y);
maparr[x][y]=road;
}
}
}
void Map::smallroaddisplay(int x,int y)
{
int direction[][2]={{0,1},{1,0},{0,-1},{-1,0}};
int p=0,i=0,j=0;
int arr[100]={0};
int brr[100]={0};
int record[100]={0};
int visited[Size 1][Size 1]={0};
arr[p]=x;
brr[p]=y;
maparr[x][y]=road;
while(true)
{
i=i 1;
if(i<=4)
{
x=arr[p] direction[i-1][0];
y=brr[p] direction[i-1][1];
if(y<=Size && x<=Size)
{
if(maparr[x][y]==road && visited[x][y]==0)
{
p ;
record[p]=i;
arr[p]=x;
brr[p]=y;
visited[x][y]=1;
i=0;
}
}
}
else
{
i=record[p];
p--;
}
if(x==Size-1 && y==Size-1)
break;
}
for(j=1;j<=p;j )
maparr[arr[j]][brr[j]]=7;
for(int k=1;k<=Size;k )
for( j=1;j<=Size;j )
display(k,j);
}