我们进行有游戏的美化,插入了一个开始游戏的界面即欢迎界面代码如下
在主函数中调用即可
void welcome()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);//设置红色
cout<<"\t\t\t\t\t\t\t\t------->北格迷宫升级版<--------"<<endl;
cout<<"\t\t\t\t\t\t\t\t*******************************"<<endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |FOREGROUND_GREEN);//设置红色和绿色相加
cout<<"\t\t\t\t\t\t\t\t*********欢迎进入游戏**********"<<endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);//设置蓝色
cout<<"\t\t\t\t\t\t\t\t*******************************"<<endl;
cout<<"\t\t\t\t\t\t\t\t*********工商幼儿园队**********"<<endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);//设置绿色
cout<<"\t\t\t\t\t\t\t\t*******************************"<<endl;
cout<<"\t\t\t\t\t\t\t\t******请按任意键开始游戏*******"<<endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);//设置红色
cout<<"\t\t\t\t\t\t\t\t*******************************"<<endl;
getch();
system("cls");
}
1:绘制游戏地图(*为游戏角色),首先我们要定义一个char型的二维数组,如下:
char a[500][500]={
" ",
" 山西工商学院(北格校区) ",
" _______________________________________________________________________________________________",
" | * __________ | |建工实验室||学术报告厅||建工实验室| | 笃行楼 | |锅炉房| |",
" | |学员公寓| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |~~~~|~~~~~~~~ |~~~~~~~ |",
" | ~~~~~~~~~~ |学生活动中心| _____________ | | F1-F3南苑餐厅 | |",
" | __________ |~~~~~~~~~~~~~ | 弘学楼 | | 敏学楼 | | F4学生活动中心 | |",
" | |学员公寓| |________ ~~~~~~~~~~~~~ ~~~~~~~~~| | | |",
" | ~~~~~~~~~~ | 砺能楼| | | | |",
" | ____________ | |羽 | |羽 | | |",
" | | 科技楼 | | |毛 | |毛 | | |_____ __________| |",
" | ~~~~~~~~~~~~ | |球 | |球 | | ~~~~~ |",
" |____ _________| ~~~~~ ~~~~~ | |",
" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |",
" |~~~| -》 |",
" |~~~~~~~~~~~~~~~~~~~~~~~~~~~通识大道~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`~~~~~~~|",
" | |",
" | _____ __________ |",
" | | ~~~~~ | ~ |~~~~~~~~~~~~~~~~~| ~ |~~~~~~~~~~~~~~|~1号~| |",
" | | | ~ | | ~ |____ | |",
" | | 体 # # | ~ | <- 乐思胡 | ~ | 4号| | 3号 | |",
" | | 育 | 文 | | 慎 |~~~~~ 明 | |",
" | | 场 # # | ~ | | ~ |____ | 5号 | |",
" | | | 博 | <- 乐知亭 | 思 | 6号| 德 | |",
" | | # # | ~ | | ~ |~~~~~ | 7号 | |",
" | | | 路 | | 路 |____ 路 | |",
" | | 体育馆 | ~ | <- 乐信岛 | ~ | 8号| |素质 | |",
" | |___________________| ~ |_________________| ~ |~~~~~ |拓展 | |",
" | ~ | | ~ |____ |基地 | |",
" | |~~~~~~~~~~~~~~~~~~~| ~ 篮球场 | ~ |10号| | |",
" | | | ~ |_________________| ~ |~~~~~ | |",
" | | 教学楼 | ~ ~ | | |",
" |___|___________________|______ ______|__图文信息中心___|______ _____|____|___实验楼___|__|____|",
" | *工商幼儿园队* |",
" | ↑W 软件工程二班 图为山西工商学院北格校区 |",
" | ←A D→ *代表小人 -牛梦飞 | _ 为墙不可通过 -小人走到道路名称 |",
" | S↓ -赵纪龙 ~~~ 为门路可通过 -第一次?第二次消失 |",
" | -黄凡 # 为 篮球场地 |",
" |______________________________________________________________________________________________|",
};
如何绘制地图呢?
这里我们运用for循环来绘制地图,输出的话使用puts函数,因为puts函数输出后会自动换行比cout使用起来更加便捷
for(int i=0;i<=40;i++)
puts(a[i]);
接下来游戏角色移动我们怎么解决呢?
我们定义游戏角色为“*”
我们可以把整个地图也就是二维数组想象成一个二维坐标图
还是和之前一样定义他最开始的坐标
int x=3,y=35;
由于我们地图居中,计算出来的坐标是这个
接下来是角色的移动问题
while(1)
{
ch= getch();
if(ch=='a')
{
if(a[x][y-1]!='|'&& a[x][y-1]!='_'){
a[x][y]=' ';
y--;
a[x][y]='*';
}
}
if(ch=='s'){
if(a[x+1][y]!='_' && a[x+1][y]!='|'){
a[x][y]=' ';
x++;
a[x][y]='*';
}
}
if(ch=='d'){
if(a[x][y+1]!='_' && a[x][y+1]!='|'){
a[x][y]=' ';
y++;
a[x][y]='*';
}
}
if(ch=='w'){
if(a[x-1][y]!='_' && a[x-1][y]!='|'){
a[x][y]=' ';
x--;
a[x][y]='*';
}
}
Set();
for(int i=0;i<=40;i++)
puts(a[i]);
我们移动角色是通过坐标计算然后进行替换把原先空白的地方填补为“*”
这样就实现了角色移动
但是在这里我们遇到一个问题,因为通过两次for循环来绘制地图,所以说游戏地图会出现频闪的问题,接下来我们定义一个set函数来控制光标初始位置就完美的解决了频闪问题,代码如下
void Set()//设置光标到初始位置
{
HANDLE hOut;
COORD pos={0,0};
hOut=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut,pos);
}
在主函数第二次for循环后调用即可解决
游戏中有光标闪来闪去,对游戏美观度也造成影响
我们通过以下代码来隐藏控制台光标实现美化
void Hide()//用于隐藏控制台光标
{
HANDLE hOut;
CONSOLE_CURSOR_INFO curInfo;
hOut=GetStdHandle(STD_OUTPUT_HANDLE);
curInfo.dwSize=1;
curInfo.bVisible=0;
SetConsoleCursorInfo(hOut,&curInfo);
}
最后为了游戏的体验程度我们还插入了背景音乐
音乐叫洪荒之力,希望每一个工商学子都有洪荒之力
PlaySound(TEXT("c:\\hhh.wav"),NULL,SND_FILENAME | SND_ASYNC);
整部程序头文件调用
#include <iostream> //cout 输出流运用
#include <cstdio>
#include <conio.h>
#include <windows.h>
#include "mmsystem.h" //playsound音乐调用
#pragma comment(lib,"winmm.lib")
因为是整个程序的起源是迷宫,但地图是我们山西工商学院北格校区
所以我们象征性的插入了一个出口出用if来判断
这样就实现了整个迷宫游戏的概念
if(x==13 && y==34)
break;
cout<<"你成功走出了迷宫!"<<endl;
Sleep(10000);
整个程序的代码
#include <iostream>
#include <cstdio>
#include <conio.h>
#include <windows.h>
#include "mmsystem.h"
#pragma comment(lib,"winmm.lib")
using namespace std;
void welcome()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);//设置红色
cout<<"\t\t\t\t\t\t\t\t------->北格迷宫升级版<--------"<<endl;
cout<<"\t\t\t\t\t\t\t\t*******************************"<<endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |FOREGROUND_GREEN);//设置红色和绿色相加
cout<<"\t\t\t\t\t\t\t\t*********欢迎进入游戏**********"<<endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);//设置蓝色
cout<<"\t\t\t\t\t\t\t\t*******************************"<<endl;
cout<<"\t\t\t\t\t\t\t\t*********工商幼儿园队**********"<<endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);//设置绿色
cout<<"\t\t\t\t\t\t\t\t*******************************"<<endl;
cout<<"\t\t\t\t\t\t\t\t******请按任意键开始游戏*******"<<endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);//设置红色
cout<<"\t\t\t\t\t\t\t\t*******************************"<<endl;
getch();
system("cls");
}
void Hide()//用于隐藏控制台光标
{
HANDLE hOut;
CONSOLE_CURSOR_INFO curInfo;
hOut=GetStdHandle(STD_OUTPUT_HANDLE);
curInfo.dwSize=1;
curInfo.bVisible=0;
SetConsoleCursorInfo(hOut,&curInfo);
}
void Set()//设置光标到初始位置
{
HANDLE hOut;
COORD pos={0,0};
hOut=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut,pos);
}
int main()
{
system("title 迷宫游戏->北格校区");
PlaySound(TEXT("c:\\hhh.wav"),NULL,SND_FILENAME | SND_ASYNC);
char a[500][500]={
" ",
" 山西工商学院(北格校区) ",
" _______________________________________________________________________________________________",
" | * __________ | |建工实验室||学术报告厅||建工实验室| | 笃行楼 | |锅炉房| |",
" | |学员公寓| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |~~~~|~~~~~~~~ |~~~~~~~ |",
" | ~~~~~~~~~~ |学生活动中心| _____________ | | F1-F3南苑餐厅 | |",
" | __________ |~~~~~~~~~~~~~ | 弘学楼 | | 敏学楼 | | F4学生活动中心 | |",
" | |学员公寓| |________ ~~~~~~~~~~~~~ ~~~~~~~~~| | | |",
" | ~~~~~~~~~~ | 砺能楼| | | | |",
" | ____________ | |羽 | |羽 | | |",
" | | 科技楼 | | |毛 | |毛 | | |_____ __________| |",
" | ~~~~~~~~~~~~ | |球 | |球 | | ~~~~~ |",
" |____ _________| ~~~~~ ~~~~~ | |",
" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |",
" |~~~| -》 |",
" |~~~~~~~~~~~~~~~~~~~~~~~~~~~通识大道~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`~~~~~~~|",
" | |",
" | _____ __________ |",
" | | ~~~~~ | ~ |~~~~~~~~~~~~~~~~~| ~ |~~~~~~~~~~~~~~|~1号~| |",
" | | | ~ | | ~ |____ | |",
" | | 体 # # | ~ | <- 乐思胡 | ~ | 4号| | 3号 | |",
" | | 育 | 文 | | 慎 |~~~~~ 明 | |",
" | | 场 # # | ~ | | ~ |____ | 5号 | |",
" | | | 博 | <- 乐知亭 | 思 | 6号| 德 | |",
" | | # # | ~ | | ~ |~~~~~ | 7号 | |",
" | | | 路 | | 路 |____ 路 | |",
" | | 体育馆 | ~ | <- 乐信岛 | ~ | 8号| |素质 | |",
" | |___________________| ~ |_________________| ~ |~~~~~ |拓展 | |",
" | ~ | | ~ |____ |基地 | |",
" | |~~~~~~~~~~~~~~~~~~~| ~ 篮球场 | ~ |10号| | |",
" | | | ~ |_________________| ~ |~~~~~ | |",
" | | 教学楼 | ~ ~ | | |",
" |___|___________________|______ ______|__图文信息中心___|______ _____|____|___实验楼___|__|____|",
" | *工商幼儿园队* |",
" | ↑W 软件工程二班 图为山西工商学院北格校区 |",
" | ←A D→ *代表小人 -牛梦飞 | _ 为墙不可通过 -小人走到道路名称 |",
" | S↓ -赵纪龙 ~~~ 为门路可通过 -第一次?第二次消失 |",
" | -黄凡 # 为 篮球场地 |",
" |______________________________________________________________________________________________|",
};
welcome();
Hide();
for(int i=0;i<=40;i++)
puts(a[i]);
system("color 0A");
char ch;
int x=3,y=35;
while(1)
{
ch= getch();
if(ch=='a')
{
if(a[x][y-1]!='|'&& a[x][y-1]!='_'){
a[x][y]=' ';
y--;
a[x][y]='*';
}
}
if(ch=='s'){
if(a[x+1][y]!='_' && a[x+1][y]!='|'){
a[x][y]=' ';
x++;
a[x][y]='*';
}
}
if(ch=='d'){
if(a[x][y+1]!='_' && a[x][y+1]!='|'){
a[x][y]=' ';
y++;
a[x][y]='*';
}
}
if(ch=='w'){
if(a[x-1][y]!='_' && a[x-1][y]!='|'){
a[x][y]=' ';
x--;
a[x][y]='*';
}
}
Set();
for(int i=0;i<=40;i++)
puts(a[i]);
if(x==13 && y==34)
break;
system("color 0A");
}
cout<<"你成功走出了迷宫!"<<endl;
Sleep(10000);
return 0;
}