C++ 自制迷宫游戏

基础功能实现

对于一个迷宫游戏,最重要的功能就是要让角色实时移动。在这里,我们可以利用getch()函数。但是这里我们用另外一个函数——GetAsyncKeyState。这个函数更加方便,不懂的可以自行再去搜索。

void control(char mp[105][105]){ //mp是当前地图
	while(true){
		Sleep(60);
		if(KD(87)&&!check(mp,ix-1,iy)){ix--;if(!check(mp,monster_x-1,monster_y)){monster_x--;}break;}
		if(KD(65)&&!check(mp,ix,iy-1)){iy--;if(!check(mp,monster_x,monster_y-1)){monster_y--;}break;}
		if(KD(83)&&!check(mp,ix+1,iy)){ix++;if(!check(mp,monster_x+1,monster_y)){monster_x++;}break;}
		if(KD(68)&&!check(mp,ix,iy+1)){iy++;if(!check(mp,monster_x,monster_y+1)){monster_y++;}break;}
}

至于里面的check函数就根据自己的设定编写即可。这里的KD其实就是前面的GetAsyncKeyState函数(使用了define缩短代码长度)。KD中的值为键值,详细可自行搜索。

除此之外,我们在让角色坐标移动的同时要让地图实时更新。打印函数如下。

void print(char mp[105][105],int ix,int iy,int n,int m){
	pair<int,int> AB;
	AB = get_AB(mp,n,m);
	for(int i = 0;i < n;i++){
		for(int j = 0;j < m;j++){
			bool flag = 0;
            //视野功能
			if(!(abs(ix-i) <= eye*0.7))flag = 1;
			if(!(abs(iy-j) <= eye))flag = 1;
            //圆形视野
			//if(!(abs(ix-i)*abs(ix-i)+abs(iy-j)*abs(iy-j)*0.3<=eye*eye))flag = 1;
			if(eye == -1)flag = 0;
			if(ix == i && iy == j){
				cout << 'i';
				continue;
			}
			if(flag)cout << ' ';
			else cout << (mp[i][j] == '&' ? ' ' : mp[i][j]);
		}
		cout << '\n';
	}
} 

拓展

做完基本功能后,你会发现这个游戏很平庸

下面这些函数可以帮助你优化自己的程序

隐藏光标

void HideCursor(){
	CONSOLE_CURSOR_INFO cursor_info = {1,0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}

缓慢输出

void slowout(char *p,int t){
	while(1){
		if(*p != 0)cout << *p;
		else break;
		Sleep(t);
		*p++;
	}
}

更改颜色

int changecolor(string text,int r,int g,int b){
	HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
	if(hOut==INVALID_HANDLE_VALUE) return GetLastError();
	DWORD dwMode = 0;
	if(!GetConsoleMode(hOut,&dwMode)) return GetLastError();
	dwMode |= 0x0004;
	if(!SetConsoleMode(hOut,dwMode)) return GetLastError();
	wprintf(L"\x1b[38;2;%d;%d;%dm\x1b[48;2;%d;%d;%dm",r,g,b,12,12,12);
	printf(text.c_str());
	wprintf(L"\x1b[38;2;%d;%d;%dm\x1b[48;2;%d;%d;%dm",204,204,204,12,12,12);
	return 0;
}

作者程序

比较史山。见谅。

#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
#define KD(VK_NONAME) ((GetAsyncKeyState(VK_NONAME)&0x8000)?1:0)
#define cls system("cls")
#define init ix = 1,iy = 1,have_mon = 0,monster_x = -1,monster_y = -1,al_monster_x = -1,al_monster_y = -1,sw_open = 0,sw_x = -1,sw_y = -1,get_key = 0,get_small_key = 0,eye = -1,open = 0,get_water = 0,o1x=-1,o1y=-1,o2x=-1,o2y=-1,s_o1x=-1,s_o1y=-1,s_o2x=-1,s_o2y=-1
#define init_al_mon while(!mp18mon.empty())mp18mon.pop();mp18mon.push({10,7}),mp18mon.push({10,8}),mp18mon.push({10,9}),mp18mon.push({10,10}),mp18mon.push({10,11}),mp18mon.push({10,10}),mp18mon.push({10,9}),mp18mon.push({10,8}),mp18mon.push({10,7}); while(!mp19mon.empty())mp19mon.pop();mp19mon.push({1,4}),mp19mon.push({1,5}),mp19mon.push({1,6}),mp19mon.push({1,7}),mp19mon.push({1,8}),mp19mon.push({1,9}),mp19mon.push({1,8}),mp19mon.push({1,7}),mp19mon.push({1,6}),mp19mon.push({1,5}),mp19mon.push({1,4});
using namespace std;
int level_sum;
char backlevel[50][105][105] = {};
int ix = 1,iy = 1,fx,fy;
int o1x,o1y,o2x,o2y;
int s_o1x,s_o1y,s_o2x,s_o2y;
int monster_x,monster_y;
int al_monster_x,al_monster_y;
int sw_x,sw_y;
int eye = -1;
bool sw_open = 0;
bool open = 0;
bool get_water = 0;
bool get_key = 0;
bool get_small_key = 0;
bool accepted[105],open_level[105];
bool goback = 0;
bool have_mon = 0;
char mp1[105][105] = {
  {'#','#','#','#','#','#','#','#','#','#'},
					  {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
					  {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
					  {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
					  {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
					  {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
					  {'#',' ',' ',' ',' ',' ',' ',' ',' ','F'},
					  {'#','#','#','#','#','#','#','#','#','#'}};
char mp2[105][105] = {
  {'#','#','#','#','#','#','#','#','F','#'},
					  {'#',' ','#',' ',' ',' ',' ','#',' ','#'},
					  {'#',' ','#',' ','#','#',' ','#',' ','#'},
					  {'#',' ','#',' ','#',' ',' ','#',' ','#'},
					  {'#',' ','#',' ','#',' ','#','#',' ','#'},
					  {'#',' ','#',' ','#',' ','#','#',' ','#'},
					  {'#',' ',' ',' ','#',' ',' ',' ',' ','#'},
					  {'#','#','#','#','#','#','#','#','#','#'}};
char mp3[105][105] = {
  {'#','#','#','#','#','#','#','#','#','#','#','F','#'},
					  {'#',' ','#',' ','#',' ','#',' ',' ',' ','#',' ','#'},
					  {'#',' ',' ',' ','#',' ',' ','#','#',' ','#',' ','#'},
					  {'#',' ','#',' ',' ',' ','#','#',' ',' ','#',' ','#'},
					  {'#',' ','#','#','#',' ','#',' ','#',' ','#',' ','#'},
					  {'#',' ','#',' ','#','#',' ','#','#',' ',' ',' ','#'},
					  {'#',' ','#',' ',' ',' ',' ',' ',' ',' ','#','#','#'},
					  {'#',' ','#','#',' ','#',' ','#',' ','#','#',' ','#'},
					  {'#',' ',' ',' ',' ','#',' ','#',' ',' ',' ',' ','#'},
					  {'#','#','#','#','#','#','#','#','#','#','#','#','#'}};
char mp4[105][105] = {
  {'#','#','#','#','#','#','#','#','#','#','#','F','#'},
					  {'#',' ','#',' ','#','K',' ','#',' ',' ','#',' ','#'},
					  {'#',' ',' ',' ','#','#',' ','#','#',' ',' ',' ','#'},
					  {'#',' ','#',' ',' ',' ',' ','#',' ',' ','#','#','#'},
					  {'#',' ','#','#','#',' ',' ',' ','#',' ','#',' ','#'},
					  {'#',' ','#',' ','#','#','#','#','#',' ','#',' ','#'},
					  {'#',' ','#',' ',' ',' ',' ','D',' ',' ','#',' ','#'},
					  {'#',' ','#','#',' ','#',' ','#',' ','#','#',' ','#'},
					  {'#',' ',' ',' ',' ','#',' ','#',' ',' ',' ',' ','#'},
					  {'#','#','#','#','#','#','#','#','#','#','#','#','#'}};
char mp5[105][105] = {
  {'#','#','#','#','#','#','#','#','#','#','#','#','#'},
					  {'#',' ',' ',' ','#','K',' ',' ',' ',' ','#',' ','#'},
					  {'#',' ','#',' ','#','D','#','#','#',' ',' ',' ','#'},
					  {'#',' ','#',' ',' ',' ','#',' ',' ',' ','#','#','#'},
					  {'#',' ','#','#','#',' ',' ',' ','#',' ','#',' ','F'},
					  {'#',' ','#',' ','#','#','#','#','#',' ','#',' ','#'},
					  {'#',' ','#',' ',' ',' ',' ','#',' ',' ','#',' ','#'},
					  {'#',' ','#','#','D','#',' ','#','D','#','#',' ','#'},
					  {'#',' ',' ',' ',' ','#',' ','#',' ',' ',' ',' ','#'},
					  {'#','#','#','#','#','#','#','#','#','#','#','#','#'}};
char mp6[105][105] = {
  {'#','#','#','#','#','#','#','#','#','#','#','#','#'},
					  {'#',' ',' ',' ','#','K',' ',' ',' ',' ','#','O','#'},
					  {'#','#','#',' ','#','#','#','#','#',' ','D',' ','#'},
					  {'#','O','#',' ',' ',' ','#',' ',' ',' ','#','#','#'},
					  {'#',' ','#','#','#',' ',' ',' ','#',' ','#',' ','F'},
					  {'#',' ','#',' ','#','#','#','#','#',' ','#',' ','#'},
					  {'#',' ','#',' ',' ',' ',' ','#',' ',' ','#',' ','#'},
					  {'#',' ','#',' ','#','#',' ','#','#','#','#',' ','#'},
					  {'#',' ',' ',' ',' ','#',' ',' ',' ',' ',' ',' ','#'},
					  {'#','#','#','#','#','#','#','#','#','#','#','#','#'}};
char mp7[105][105] = {
  {'#','#','#','#','#','#','#','#','#','#','#','#','#','#','#'},
					  {'#',' ',' ',' ','#',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'},
					  {'#',' ','#',' ','#',' ','#','#','#','#','#','#','#',' ','#'},
					  {'#',' ','#',' ','#','K','#','O',' ',' ',' ',' ','#',' ','#'},
					  {'#',' ','#',' ','#','#','#','#',' ','#','#',' ',' ',' ','#'},
					  {'#',' ','#','#','#',' ',' ',' ',' ','#','#','#','#','#','#'},
					  {'#',' ','#','O','#','#','#',' ',' ',' ','#',' ',' ',' ','F'},
					  {'#',' ','#',' ',' ',' ',' ','#','#','#','#',' ','#','#','#'},
					  {'#',' ','#',' ','#','#',' ','#',' ',' ','D',' ','#',' ','#'},
					  {'#',' ','#',' ','#','#',' ','#',' ','#','#','#','#',' ','#'},
					  {'#',' ',' ',' ',' ','#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
					  {'#','#','#','#','#','#','#','#','#','#','#','#','#','#','#'}};
char mp8[105][105] = {
  {'#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#'},
					  {'#',' ',' ',' ','#',' ',' ',' ',' ','#',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'},
					  {'#',' ',
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值