上一篇简单介绍一下项目和创建游戏界面
本篇介绍如何达到消除方块的功能。具体思路,代码都有详细注释。
下一篇消除同色方块后其他方块的下落。
#include
#include
#include
#include
#include
#pragma comment(lib,"Winmm.lib")
#pragma warning(disable:4996)
#define N 40
IMAGE bgImage;//游戏页面背景图片
IMAGE RegbgImage;//注册页面背景图片
IMAGE nowImage; //当前
MOUSEMSG m; //鼠标
COLORREF colorArr[6] = { RGB(200, 0, 0), RGB(0, 200, 0),
RGB(0, 200, 200), RGB(200, 0, 200),RGB(200,200,0) };//颜色池
typedef struct position
{
int x;
int y;
}posType; //位置信息
posType mou; //鼠标位置结构体
posType sameArr[100]; //同色方块坐标
int index = 0; //同色方块个数
void game(void); //初始化游戏界面
void playgame(void); //游戏玩法
void getsameclolr(posType, COLORREF);//获取同颜色的方块
int isValid(posType, COLORREF); //判断方块附近颜色是否一样
int main() {
initgraph(700, 700);//初始化窗口
game();
playgame();
system("pause");
return 0;
}
void game() {
loadimage(&bgImage, "../Project2/bg2.2.jpg", 700, 700);//取背景图
putimage(0, 0, &bgImage);//放置背景图
setfillcolor(RGB(0, 0, 0));
fillrectangle(150, 0, 550, 700);//黑色背景
settextstyle(15, 0, _T(""));
settextcolor(RGB(255, 255, 255));
outtextxy(10, 10, "hello,");
srand((unsigned)time(NULL));
for (int i = 0; i < 10; i++) { //生成方块
for (int j = 0; j < 10; j++) {
COLORREF cl = colorArr[rand() % 5]; //产生0~5六个随机数在随即颜色池中取颜色
setfillcolor(cl);
setlinecolor(RGB(0, 0, 0));
fillroundrect(150 + j * N, 150 + i * N, 150 + N + j * N, 150 + (i + 1)*N, 10, 10);
settextstyle(30, 0, _T(""));
setbkmode(TRANSPARENT);
settextcolor(RGB(255, 255, 255));
outtextxy(155 + j * N, 155 + i * N, "☆");
}
}
}
void playgame() { //游戏玩法
COLORREF c2 = RGB(0, 0, 0);
while (true)
{
m = GetMouseMsg(); //获取鼠标位置
switch (m.uMsg)
{
case WM_LBUTTONDOWN:
mou.x = m.x;
mou.y = m.y;
int a = 0;
for (int i = 0; i < 5; i++) {
if (getpixel(mou.x, mou.y) == colorArr[i])//点击位置的颜色是否在颜色池
a = 1;
}
if (a == 1) {
getsameclolr(mou, getpixel(mou.x, mou.y));//查找附近相同颜色格子
if (index > 1) {
int j = 0;
for (j = 0; j < index; j++)
{
setlinecolor(RGB(0, 0, 0));
setfillcolor(RGB(0, 0, 0));
fillroundrect(sameArr[j].x - 20, sameArr[j].y - 20, sameArr[j].x + 20, sameArr[j].y + 20, 10, 10);//将相同颜色填充成黑色
}
Sleep(150);
}
index = 0;
break;
}
}
}
}
void getsameclolr(posType mou, COLORREF cl) {
int k = 0;
posType temp;
mou.x = (mou.x - 150) / N * N + 150 + 20;//定位位置到格子中点
mou.y = (mou.y - 150) / N * N + 150 + 20;
sameArr[index].x = (mou.x);//将格子存入相同颜色的数组
sameArr[index].y = (mou.y);
index++;
for (k = 0; k < 4; k++) {//递归查找相邻相同颜色的格子
switch (k)
{
case 0:temp.x = mou.x; temp.y = mou.y - N; break; //上
case 1:temp.x = mou.x; temp.y = mou.y + N; break; //下
case 2:temp.x = mou.x - N; temp.y = mou.y; break; //左
case 3:temp.x = mou.x + N; temp.y = mou.y; break; //右
}
if (isValid(temp, cl) == 1) {
getsameclolr(temp, cl);
}
}
}
int isValid(posType mou, COLORREF cl)//判断查找到的格子是否合法
{
if (getpixel(mou.x, mou.y) != cl)//不在颜色池不合法
{
return 0; //不合法
}
else
{
int i = 0;
for (i = 0; i < index; i++)
{
if (mou.x == sameArr[i].x && mou.y == sameArr[i].y)//已经存在同色方块里 不合法
{
return 0; //不合法
}
}
return 1; //合法
}
}