【小程序】逃脱

没错这是我本人编的一个无聊的小程序

规则:你操控一个小人到达百分号(是黄色的),其他自己发掘
代码也就这么点:

#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
#define init register int
#define inf 1000000000
#define LL long long
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
#define teacher 1
#define student 2
using namespace std;
char mp[1005][1005]={};
bool cango[1005][1005]={};
int n=10,m=20,fx[5]={0,-1,0,1,0},fy[5]={0,0,1,0,-1};
int tc[4][4]={},QUE[1000005][3]={},vvv=10000;
int xx,yy,ct;
void gotoXY(short x, short y)
{
	x^=y^=x^=y;
    COORD pos = {x, y};
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOut, pos);
}
bool pdst(int,int);
void GO();
void BFS(int,int);
void WIN();
void LOSE();
void BAD();
int pre();
int main()
{
	CONSOLE_CURSOR_INFO cursor_info = {1, 0}; 
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
	srand(time(NULL));
	printf("The classroom bigs:");
	cin>>n>>m;
	printf("The number of teachers:");
	cin>>ct;
	system("cls");
	for(int i=0;i<=n;i++)
	{
		for(int j=0;j<=m;j++)
		{
			if(i==0||j==0||i==n||j==m)mp[i][j]='+';
			else mp[i][j]=' ';
		}
	}
	back:;
	int vx=rand()%n+1,vy=rand()%m+1;
	if(mp[vx][vy]==' ')mp[vx][vy]='%';
	else goto back;
	BFS(vx,vy);
	backc:;
	xx=rand()%n+1,yy=rand()%m+1;
	if(mp[xx][yy]!=' '&&pdst(xx,yy))goto backc;
	for(int i=0;i<=n;i++)
	{
		for(int j=0;j<=m;j++)
		{
			if(mp[i][j]==' '&&rand()%5==0)mp[i][j]='+';
			if(mp[i][j]=='%')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
			putchar(mp[i][j]);
			if(mp[i][j]=='%')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
		}
		putchar('\n');
	}
	for(int i=1;i<=ct;i++)
	{
		back2:;
		tc[i][1]=rand()%n+1,tc[i][2]=rand()%m+1;
		if(mp[tc[i][1]][tc[i][2]]!=' ')goto back2;
		if(tc[i][1]==xx||tc[i][2]==yy)goto back2;
		if(abs(tc[i][1]-xx)+abs(tc[i][2]-yy)<n/2)goto back2;
		tc[i][3]=vvv;
		tc[i][4]=rand()%4+1;
		gotoXY(tc[i][1],tc[i][2]),putchar(teacher);
	}
	gotoXY(xx,yy);
	putchar(student);
	while(1)
	{
		GO();
		int lx=xx,ly=yy;
		if(_kbhit())
		{
			char ch=_getch();
			if(ch=='w')
			{
				if(mp[xx-1][yy]==' ')xx--;
				else if(mp[xx-1][yy]=='%')WIN();
				gotoXY(lx,ly);
				putchar(' ');
				gotoXY(xx,yy);
				putchar(student);
			}
			if(ch=='s')
			{
				if(mp[xx+1][yy]==' ')xx++;
				else if(mp[xx+1][yy]=='%')WIN();
				gotoXY(lx,ly);
				putchar(' ');
				gotoXY(xx,yy);
				putchar(student);
			}
			if(ch=='a')
			{
				if(mp[xx][yy-1]==' ')yy--;
				else if(mp[xx][yy-1]=='%')WIN();
				gotoXY(lx,ly);
				putchar(' ');
				gotoXY(xx,yy);
				putchar(student);
			}
			if(ch=='d')
			{
				if(mp[xx][yy+1]==' ')yy++;
				else if(mp[xx][yy+1]=='%')WIN();
				gotoXY(lx,ly);
				putchar(' ');
				gotoXY(xx,yy);
				putchar(student);
			}
		}
	}
}
int pre(int xx1,int yy1,int xx2,int yy2,int ff)
{
	if(mp[xx1][yy1]!=' ')return -inf;
	if(xx1==xx2&&yy1==yy2)return 1;
	return pre(xx1+fx[ff],yy1+fy[ff],xx2,yy2,ff)+1;
}
void BAD()
{
	system("color 04");
	vvv=10;
}
void GO()
{
	for(int i=1;i<=ct;i++)
	{
		tc[i][3]--;
		if(tc[i][1]==xx&&tc[i][2]==yy)LOSE();
		if(tc[i][3]>vvv)tc[i][3]=vvv;
		if(tc[i][3]==0)
		{
			tc[i][3]=vvv;
			if(mp[tc[i][1]+fx[tc[i][4]]][tc[i][2]+fy[tc[i][4]]]==' ')
			{
				gotoXY(tc[i][1],tc[i][2]);
				putchar(' ');
				tc[i][1]+=fx[tc[i][4]];
				tc[i][2]+=fy[tc[i][4]];
				gotoXY(tc[i][1],tc[i][2]);
				putchar(teacher);
			}
			else
			{
				tc[i][4]=rand()%4+1;
			}
		}
		if(pre(xx,yy,tc[i][1],tc[i][2],1)>0||pre(xx,yy,tc[i][1],tc[i][2],3)>0)BAD();
		if(pre(xx,yy,tc[i][1],tc[i][2],2)>0||pre(xx,yy,tc[i][1],tc[i][2],4)>0)BAD();
	}
}
void BFS(int cx,int cy)
{
	int head=0,tail=1;
	QUE[1][1]=cx;QUE[1][2]=cy;
	cango[cx][cy]=1;
	while(head<=tail)
	{
		head++;
		for(int i=1;i<=4;i++)
		{
			int rx=QUE[head][1]+fx[i],ry=QUE[head][2]+fy[i];
			if(rx>=1&&rx<=n&&ry>=1&&ry<=m&&mp[rx][ry]==' ')
			{
				if(!cango[rx][ry])
				{
					cango[rx][ry]=1;
					tail++;
					QUE[tail][1]=rx;
					QUE[tail][2]=ry;
				}
			}
		}
	}
}
bool pdst(int cx,int cy)
{
	return cango[cx][cy];
}
void WIN()
{
	system("cls");
	system("color 02");
	printf("YOU WIN!\n\n");
	system("pause");
	exit(0);
}
void LOSE()
{
	system("cls");
	printf("YOU LOSE\n\n");
	system("pause");
	exit(0);
}

看完还不点赞

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值