前言: 先说说我写推箱子小游戏的过程。 第一版:没有图形化界面,不能选关。只有推箱子的最基础功能。 第二版:增加图形化界面,但是不能选择关卡。 最终版:增加选择关卡功能、播放/关闭音乐功能、退出游戏功能,捕获鼠标功能。
首先看一下最终版效果图  功能点分析: 打开/关闭音乐和退出游戏比较简单。 打开音乐所需调用的头文件
#include <graphics.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
打开音乐调用的easyx内部函数
mciSendString("open 1.mp3", 0, 0, 0);
mciSendString("play 1.mp3", 0, 0, 0);
关闭音乐调用的easyx内部函数
mciSendString("close 1.mp3", 0, 0, 0);
退出游戏功能:直接找一个图片,当鼠标点击退出游戏这个区域,那么就显示该退出游戏的图片,并退出控制台。
选择关卡可以用三维数组: 三维数组可以理解为多个二维数组。例如map[3][10][10]表示有三个10x10的二维数组。当我点击关卡1,那么就打印map[1][10][10]这个区域的地图。关卡二和关卡三类似。
捕获鼠标信息:
easyx图形库给我们提供了鼠标捕获函数getmessage(EM_MOUSE)。以及保存鼠标消息结构体:
struct
{
bool ctrl :1;
bool shift :1;
bool lbutton :1;
bool mbutton :1;
bool rbutton :1;
short x;
short y;
short wheel;
};
整体代码:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <graphics.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
int flag;
EASYXMSG m;
int map[3][10][10] =
{
1,1,1,1,1,1,1,1,1,1,
1,0,0,0,0,0,3,0,0,1,
1,0,0,5,4,0,0,0,0,1,
1,0,0,1,1,0,0,0,0,1,
1,0,1,0,0,0,1,0,0,1,
1,0,0,4,0,0,1,0,0,1,
1,0,0,0,0,0,0,0,0,1,
1,0,0,3,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,0,0,1,0,0,0,0,0,1,
1,0,0,1,4,0,3,0,0,1,
1,0,0,0,0,0,0,0,0,1,
1,0,1,0,0,0,1,0,0,1,
1,0,1,4,0,0,1,0,0,1,
1,0,1,0,0,0,0,0,0,1,
1,3,0,0,0,0,5,0,0,1,
1,0,0,0,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,0,0,1,1,0,0,0,1,
1,1,0,4,0,0,0,0,0,1,
1,1,0,1,1,0,0,0,0,1,
1,0,0,0,0,0,1,0,3,1,
1,0,0,4,0,0,1,0,0,1,
1,0,0,0,0,0,0,4,1,1,
1,0,0,3,0,5,0,0,1,1,
1,0,0,0,0,0,0,3,0,1,
1,1,1,1,1,1,1,1,1,1,
};
IMAGE img[9];
void loadResource()
{
loadimage(img + 0, "0.bmp", 50, 50);
loadimage(img + 1, "1.bmp", 50, 50);
loadimage(img + 2, "3.bmp", 50, 50);
loadimage(img + 3, "4.bmp", 50, 50);
loadimage(img + 4, "5.bmp", 50, 50);
loadimage(img + 5, "7.bmp", 50, 50);
loadimage(img + 6, "8.jpeg", 500, 200);
loadimage(img + 7, "9.jfif", 500, 500);
loadimage(img + 8, "10.jfif", 500, 500);
}
void Printmap()
{
int i,j;
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
int x,y;
x = j* 50;
y = i* 50;
switch (map[flag][i][j])
{
case 0: putimage(x, y, img + 0); break;
case 1: putimage(x, y, img + 1); break;
case 3: putimage(x, y, img + 2); break;
case 4: putimage(x, y, img + 3); break;
case 5:
case 8: putimage(x, y, img + 4); break;
case 7: putimage(x, y, img + 5); break;
default:
break;
}
}
printf("\n");
}
}
void PlayGame()
{
char temp;
int x,y;
int i,j;
for(x=0;x<10;x++)
{
for(y=0;y<10;y++)
{
if(map[flag][x][y] == 5 || map[flag][x][y] == 8)
{
i=x;
j=y;
}
}
}
temp = _getch();
switch (temp)
{
case 'W':
case 'w':
if (map[flag][i - 1][j] == 0 || map[flag][i - 1][j] == 3)
{
map[flag][i][j] -= 5;
map[flag][i - 1][j] += 5;
}
if (map[flag][i - 1][j] == 4 || map[flag][i - 1][j] == 7)
{
if (map[flag][i - 2][j] == 0 || map[flag][i - 2][j] == 3)
{
map[flag][i][j] -= 5;
map[flag][i - 1][j] += 1;
map[flag][i - 2][j] += 4;
}
}
break;
case 'S':
case 's':
if (map[flag][i + 1][j] == 0 || map[flag][i + 1][j] == 3)
{
map[flag][i][j] -= 5;
map[flag][i + 1][j] += 5;
}
if (map[flag][i + 1][j] == 4 || map[flag][i + 1][j] == 7)
{
if (map[flag][i + 2][j] == 0 || map[flag][i + 2][j] == 3)
{
map[flag][i][j] -= 5;
map[flag][i + 1][j] += 1;
map[flag][i + 2][j] += 4;
}
}
break;
case 'A':
case 'a':
if (map[flag][i][j - 1] == 0 || map[flag][i][j - 1] == 3)
{
map[flag][i][j] -= 5;
map[flag][i][j - 1] += 5;
}
if (map[flag][i][j - 1] == 4 || map[flag][i][j - 1] == 7)
{
if (map[flag][i][j - 2] == 0 || map[flag][i][j - 2] == 3)
{
map[flag][i][j] -= 5;
map[flag][i][j - 1] += 1;
map[flag][i][j - 2] += 4;
}
}
break;
case 'D':
case 'd':
if (map[flag][i][j + 1] == 0 || map[flag][i][j + 1] == 3)
{
map[flag][i][j] -= 5;
map[flag][i][j + 1] += 5;
}
if (map[flag][i][j + 1] == 4 || map[flag][i][j + 1] == 7)
{
if (map[flag][i][j + 2] == 0 || map[flag][i][j + 2] == 3)
{
map[flag][i][j] -= 5;
map[flag][i][j + 1] += 1;
map[flag][i][j + 2] += 4;
}
}
break;
default:
break;
}
}
int gamePass()
{
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if (map[flag][i][j] == 4)
{
return 0;
}
}
}
return 1;
}
void draw_initgraph()
{
initgraph(500, 500);
loadResource();
putimage(0, 0, &img[6]);
setbkmode(TRANSPARENT);
outtextxy(120, 250, "关卡1");
outtextxy(240, 250, "关卡2");
outtextxy(360, 250, "关卡3");
outtextxy(105, 300, "打开音乐");
outtextxy(105, 350, "关闭音乐");
outtextxy(345, 350, "退出游戏");
rectangle(100, 245, 175, 270);
rectangle(220, 245, 295, 270);
rectangle(340, 245, 415, 270);
rectangle(100, 295, 175, 320);
rectangle(100, 345, 175, 370);
rectangle(340, 345, 415, 370);
}
int main()
{
level:
draw_initgraph();
while (1)
{
m = getmessage(EM_MOUSE);
if (m.x >= 100 && m.x <= 175 && m.y >= 295 && m.y <= 320)
{
setlinecolor(RED);
rectangle(95, 290, 180, 325);
if (m.lbutton)
{
mciSendString("open 1.mp3", 0, 0, 0);
mciSendString("play 1.mp3", 0, 0, 0);
}
}
else if(m.x >= 100 && m.x <= 175 && m.y >= 345 && m.y <= 370)
{
setlinecolor(RED);
rectangle(95, 340, 180, 375);
if (m.lbutton)
{
mciSendString("close 1.mp3", 0, 0, 0);
}
}
else if(m.x >= 340 && m.x <= 415 && m.y >= 345 && m.y <= 370)
{
setlinecolor(RED);
rectangle(335, 340, 420, 375);
if (m.lbutton)
{
putimage(0, 0, &img[7]);
Sleep(2000);
closegraph();
break;
}
}
else if(m.x >= 100 && m.x <= 175 && m.y >= 245 && m.y <= 270)
{
setlinecolor(RED);
rectangle(95, 240, 180, 275);
flag = 0;
if (m.lbutton)
{
while(!gamePass())
{
Printmap();
PlayGame();
system("cls");
}
putimage(0, 0, &img[8]);
Sleep(1500);
goto level;
}
}
else if(m.x >= 220 && m.x <= 295 && m.y >= 245 && m.y <= 270)
{
setlinecolor(RED);
rectangle(215, 240, 300, 275);
flag = 1;
if (m.lbutton)
{
while(!gamePass())
{
Printmap();
PlayGame();
system("cls");
}
putimage(0, 0, &img[8]);
Sleep(1500);
goto level;
}
}
else if(m.x >= 340 && m.x <= 415 && m.y >= 245 && m.y <= 270)
{
setlinecolor(RED);
rectangle(335, 240, 420, 275);
flag = 2;
if (m.lbutton)
{
while(!gamePass())
{
Printmap();
PlayGame();
system("cls");
}
putimage(0, 0, &img[8]);
Sleep(1500);
goto level;
}
}
else
{
setlinecolor(BLACK);
rectangle(95, 290, 180, 325);
setlinecolor(BLACK);
rectangle(95, 340, 180, 375);
setlinecolor(BLACK);
rectangle(335, 340, 420, 375);
setlinecolor(BLACK);
rectangle(95, 240, 180, 275);
setlinecolor(BLACK);
rectangle(215, 240, 300, 275);
setlinecolor(BLACK);
rectangle(335, 240, 420, 275);
}
}
return 0;
}
ps:这里面需要用到的图片和音乐素材可以自己寻找,也可以在评论区留下邮箱我看到了就发给你。
|