使用C语言+EasyX完成消灭星星游戏(2)

使用C语言+EasyX完成消灭星星游戏(2)

上一篇简单介绍一下项目和创建游戏界面
本篇介绍如何达到消除方块的功能。具体思路,代码都有详细注释。
下一篇消除同色方块后其他方块的下落。

#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;                                                    //合法
 }
}

使用C语言+EasyX完成消灭星星游戏(2)_第1张图片

使用C语言+EasyX完成消灭星星游戏(2)_第2张图片
使用C语言+EasyX完成消灭星星游戏(3)
使用C语言+EasyX完成消灭星星游戏(1)

你可能感兴趣的:(使用C语言+EasyX完成消灭星星游戏(2))