楼层切换是游戏中必不可少的一个元素,总不能一直待在某一层,这样就无法享受通关的快感,在原本的设想中,我打算画十层地图,并且每层地图都添加一些新的素材进去,后来发现,太过繁琐,于是这个游戏就成了一个半成品。 但是主要的逻辑已经实现完毕,剩下的主要是画地图。如果哪位有精力的朋友,可以试试画他几百张地图我暂时只介绍逻辑实现。
一旦碰触的切换楼层的元素,就需要刷新页面,将另一张图片打印出来,因为之前的二维数组设计界面,所以切换界面并不需要花费多少步骤。
int map2[13][13] =
{
0,0,0,0,0,0,0,0,0,0,0,0,0,
0,15,0,1,10,5,0,0,6,0,8,1,0,
0,1,0,1,0,0,0,0,11,0,0,18,0,
0,6,1,1,1,1,0,0,1,1,1,1,0,
0,0,0,0,1,0,0,0,1,0,0,10,0,
0,1,1,1,1,0,1,2,1,3,6,1,0,
0,1,0,0,1,0,6,11,10,0,0,9,0,
0,1,1,0,1,0,0,0,1,0,18,5,0,
0,1,1,11,1,1,1,1,1,0,7,14,0,
0,1,0,0,0,0,1,0,10,0,0,11,0,
0,1,0,5,1,3,1,0,1,2,10,1,0,
0,1,18,6,5,0,1,0,6,0,0,16,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,
};
首先 画出第二张地图来。
static int Floor = 2; 定义全局变量控制层数
每层显示不一样的地图,如果到了最后一层,则不必要再填充切换楼层的
元素,直接放出信号,跳出程序,凭个人喜好还可以添加一些画面或者音乐
if (floor == 2)
{
for (int q = 0; q < 13; q++)
{
for (int k = 0; k < 13; k++)
{
map[q][k] = map2[q][k];
}
}
}
if (floor == 3)
{
for (int q = 0; q < 13; q++)
{
for (int k = 0; k < 13; k++)
{
map[q][k] = map3[q][k];
}
}
}
Floor++;
为游戏添加一些背景音乐: 提前下载好MP3格式的音乐,播放只需要三行 相应的,我们可以为某一层,或者打斗场面添加不同的音乐,让游戏更加的丰富。
#pragma comment(lib,"Winmm.lib")
mciSendString(_T("open 1.mp3 alias mymusic"), NULL, 0, NULL);
mciSendString(_T("play mymusic"), NULL, 0, NULL);
相应的,我们也需要更多的元素去增加游戏的趣味性,没有人会想在游戏里体会比生活更大的压力。玩家玩游戏是为了放松。一些轻松诙谐的元素可以让玩家有更好的体验,从而充钱。
void beijing1()
{
initgraph(55 * 13, 55 * 13);
IMAGE PIAN;
loadimage(&PIAN, "191.jpg", 55 * 14, 55 * 13);
putimage(0, 0, &PIAN);
}
void beijing2()
{
initgraph(55 * 13, 55 * 13);
IMAGE PIAN;
loadimage(&PIAN, "192.jpg", 55 * 14, 55 * 13);
putimage(0, 0, &PIAN);
}
void beijing3()
{
initgraph(55 * 13, 55 * 13);
IMAGE PIAN;
loadimage(&PIAN, "193.jpg", 55 * 14, 55 * 13);
putimage(0, 0, &PIAN);
}
这三个函数是为了模拟一个选择的场景,分别是开始游戏,存档开始和退出游戏。 存档游戏并没有实现,但是已经有了逻辑思路,可以给各位读者讲解一下。 我们只要保存当时的位图显示界面的二维数组就可以了,使用文件输入:

然后使用文件输出来读取上次保存的二维数组,直接接替了游戏运行

至此 ,存档开始游戏就可以实现了
控制滑窗界面其实是一种模拟,当接收键盘输入后,刷新界面,切换图片,就可以实现切换显示的场景
int choose(int y)
{
char userKey;
userKey = _getch();
switch (userKey)
{
case'w':
case'W':
case 72:
if (y == 191)
{
beijing1();
return 191;
}
if (y == 192)
{
beijing1(); return 191;
}
if (y == 193)
{
beijing2(); return 192;
}
break;
case 's':
case 'S':
case 80:
if (y == 191)
{
beijing2();
return 192;
}
if (y == 192)
{
beijing3(); return 193;
}
if (y == 193)
{
beijing3();
return 193;
}
break;
case 13:
return 200; break;
default: break;
}
}
添加一些个人元素来丰富游戏可玩性
void qiang(int x)
{
if (x == 1)
cout << "what color is this?";
if (x == 2)
cout << " 什么垃圾游戏?";
if (x == 3)
cout << "what fuck?";
if (x == 4)
cout << "ni ma lgbd";
if (x == 5)
cout << "马化腾女儿今天过生日";
if (x == 6)
cout << "转发此消息5000条";
if (x == 7)
cout << "你就能得到傻逼证明书";
if (x == 8)
cout << "什么鬼?";
if (x == 9)
cout << "hey man!";
}
void wen()
{
int ID = MessageBox(hwnd, "是否花费五元创建一个角色 ", "欢迎来到魔塔单机 ", MB_YESNO);
if (ID == IDYES)
{
system("cls");
HANDLE hConsole;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, 5);
gotoxy(10, 30);
cout << "是否花费十元给角色起个名字:";
cin.get(role.RoleName, 20);
}
else {
system("cls");
HANDLE hConsole;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, 5);
gotoxy(10, 30);
cout << "阁下牛批,告辞!";
Sleep(1500);
exit(0);
}
ID = MessageBox(hwnd, "您打算给这游戏充钱吗? ", "欢迎来到魔塔单机 ", MB_YESNO);
if (ID == IDYES)
{
HANDLE hConsole;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
gotoxy(10, 30);
SetConsoleTextAttribute(hConsole, 5);
cout << "充钱你会变得更强,我欣赏你,年轻人!";
Sleep(1500);
}
else
{
system("cls");
HANDLE hConsole;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
gotoxy(10, 30);
SetConsoleTextAttribute(hConsole, 5);
cout << "不充钱就别玩了,告辞!";
Sleep(1500);
exit(0);
}
}
void init()
{
int y = 191;
HANDLE hConsole;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
for (int j = 1; j > 0; j--)
{
for (int i = 255; i >= 0; i--)
{
int count = rand() % 9 + 1;
SetConsoleTextAttribute(hConsole, i);
qiang(count);
Sleep(18);
}
}
wen();//窗口询问
beijing1();
while (1)
{
y = choose(y);
if (y == 200)
break;
}
inputRoleName();
}
void donghua()
{
IMAGE PIAN;
loadimage(&PIAN, "300.jpg");
for (int i = 0; i < 55 * 13; i++)
{
putimage(0, 0, 55 * 14, i, &PIAN, 0, 0);
Sleep(5);
}
}
至此,这个简单的魔塔小游戏就开发结束了,因为并没有什么复杂的逻辑处理,所以我将所有代码写在了一个.cpp文件里,下一篇将会展示一些运行场景以及源代码。