期末项目设计 C语言写的连连看
学会熟练运用C语言,以及一些做游戏的简单思路,还有esayX的图形界面的使用等。
#include<stdio.h>
#include<graphics.h>
#include <conio.h>
#pragma comment(lib,"Winmm.lib")
#pragma warning(disable : 4996)
#define IMG_SIZE 39
#define MAX_ANIMAL_NUM 42
#define MAP_SIZE 10
#define WIN_SIZE (MAP_SIZE*IMG_SIZE+2*IMG_SIZE)
IMAGE img_total[2];
IMAGE img_animal[MAX_ANIMAL_NUM][2];
IMAGE img_gamestart_bg;
IMAGE img_rule_bg;
IMAGE img_win_bg;
IMAGE img_lose_bg;
int gameStatus = 0;
int map[MAP_SIZE + 2][MAP_SIZE + 2];
static int time = 8000;
POINT begin = { -1, -1 }, end = { -1, -1 };
enum STATE
{
BEGIN,
END,
};
int flag = BEGIN;
void musicPalying()
{
mciSendString("open backmusic.mp3 alias backmusic", NULL, 0, NULL);
mciSendString("play backmusic repeat", NULL, 0, NULL);
}
void winMusic()
{
mciSendString("close backmusic", NULL, 0, NULL);
mciSendString("open win.mp3 alias win", NULL, 0, NULL);
mciSendString("play win", NULL, 0, NULL);
}
void loseMusic()
{
mciSendString("close backmusic", NULL, 0, NULL);
mciSendString("open lose.mp3 alias lose", NULL, 0, NULL);
mciSendString("play lose", NULL, 0, NULL);
}
void startMenu()
{
putimage(0, 0, 800, 480, &img_gamestart_bg, 0, 0);
setbkmode(TRANSPARENT);
settextcolor(YELLOW);
settextstyle(30, 0, _T("隶书"));
outtextxy(20, 400, _T("NEW GAME"));
outtextxy(300, 400, _T("RULES"));
settextcolor(BLACK);
settextstyle(70, 0, _T("华文琥珀"));
outtextxy(70, 200, _T("动物连连看"));
rectangle(15, 400, 150, 430);
rectangle(295, 400, 400, 430);
FlushBatchDraw();
Sleep(2);
MOUSEMSG m;
while (MouseHit())
{
m = GetMouseMsg();
if (m.uMsg == WM_LBUTTONDOWN && m.x >= 20 && m.x <= 150 && m.y >= 410 && m.y <= 430)
{
gameStatus = 1;
}
else if (m.uMsg == WM_LBUTTONDOWN && m.x >= 300 && m.x <= 380 && m.y >= 410 && m.y <= 430)
{
gameStatus = 2;
}
}
}
void rules()
{
putimage(0, 0, 800, 480, &img_rule_bg, 0, 0);
setbkmode(TRANSPARENT);
settextcolor(BLACK);
settextstyle(30, 0, _T("楷体"));
outtextxy(20, 300, _T("相同的图片可以进行消除,"));
outtextxy(20, 350, _T("同行,同列,转角即可消除"));
outtextxy(20, 400, _T("R键可以使动物重置"));
settextstyle(50, 0, _T("华文琥珀"));
settextcolor(BLUE);
outtextxy(20, 20, _T("START"));
rectangle(650, 410, 780, 460);
FlushBatchDraw();
Sleep(2);
MOUSEMSG m;
while (MouseHit())
{
m = GetMouseMsg();
if (m.uMsg == WM_LBUTTONDOWN && m.x >= 20 && m.x <= 120 && m.y >= 20 && m.y <= 90)//鼠标点击“START”开始游戏
{
gameStatus = 1;
}
}
}
void timeCount()
{
char temp[20] = "";
sprintf(temp, "所剩时间: %d s", time/100);
setbkmode(TRANSPARENT);
outtextxy(1, 1, temp);
}
void winMenu()
{
putimage(0, 0, &img_win_bg);
setbkmode(TRANSPARENT);
settextcolor(WHITE);
settextstyle(30, 0, _T("黑体"));
outtextxy(WIN_SIZE * 0.1, WIN_SIZE * 0.2, "恭喜!您的时间:");
char s[5];
sprintf(s, "%d s", time/100);
outtextxy(WIN_SIZE * 0.6, WIN_SIZE * 0.2, s);
settextcolor(WHITE);
settextstyle(20, 0, _T("黑体"));
outtextxy(WIN_SIZE * 0.6, WIN_SIZE * 0.8, "按任意键退出!");
FlushBatchDraw();
Sleep(2);
}
void loseMenu()
{
putimage(0, 0, &img_lose_bg);
setbkmode(TRANSPARENT);
settextcolor(WHITE);
settextstyle(30, 0, _T("黑体"));
outtextxy(WIN_SIZE * 0.1, WIN_SIZE * 0.2, "失败喽!");
settextcolor(WHITE);
settextstyle(20, 0, _T("黑体"));
outtextxy(WIN_SIZE * 0.6, WIN_SIZE * 0.8, "按任意键退出!");
}
void Bug()
{
settextstyle(30, 0, _T("黑体"));
settextcolor(BLUE);
outtextxy(400, 5, _T("BUG"));
MOUSEMSG j;
while (MouseHit())
{
j = GetMouseMsg();
if (j.uMsg == WM_LBUTTONDOWN && j.x >= 400 && j.x <= 500 && j.y >= 20 && j.y <= 90)
{
for (int i = 0; i <= 12; i++)
{
for (int k = 0; k <=12; k++)
{
map[i][k] = 0;
}
}
}
}
}
void GameInit()
{
initgraph(WIN_SIZE, WIN_SIZE, SHOWCONSOLE);
srand(GetTickCount());
loadimage(&img_total[0], "./res/animal.bmp");
loadimage(&img_total[1], "./res/bk.jfif", WIN_SIZE, WIN_SIZE);
loadimage(&img_gamestart_bg, "./res/gameStart.jpg", WIN_SIZE, WIN_SIZE);
loadimage(&img_rule_bg, "./res/rule.jpg", WIN_SIZE, WIN_SIZE);
loadimage(&img_win_bg, "./res/win.jpg", WIN_SIZE, WIN_SIZE);
loadimage(&img_lose_bg, "./res/lose.jpg", WIN_SIZE, WIN_SIZE);
SetWorkingImage(&img_total[0]);
for (int i = 0; i < MAX_ANIMAL_NUM; i++)
{
for (int k = 0; k < 2; k++)
{
getimage(&img_animal[i][k], k * IMG_SIZE, i * IMG_SIZE, IMG_SIZE, IMG_SIZE);
}
}
SetWorkingImage();
for (int i = 1; i <= MAP_SIZE; i++)
{
for (int k = 1; k <= MAP_SIZE; k++)
{
map[i][k] = i;
}
}
for (int i = 1; i <= MAP_SIZE; i++)
{
for (int k = 1; k <= MAP_SIZE; k++)
{
int row = rand() % 10 + 1;
int col = rand() % 10 + 1;
int temp = map[i][k];
map[i][k] = map[row][col];
map[row][col] = temp;
}
}
}
void GameDraw()
{
putimage(0, 0, &img_total[1]);
timeCount();
for (int i = 1; i <= MAP_SIZE; i++)
{
for (int k = 1; k <= MAP_SIZE; k++)
{
if (map[i][k] > 0)
{
putimage(k * IMG_SIZE, i * IMG_SIZE, &img_animal[map[i][k]][1], SRCAND);//遮罩图
putimage(k * IMG_SIZE, i * IMG_SIZE, &img_animal[map[i][k]][0], SRCPAINT);//原图
}
}
}
}
void GameMouse()
{
if (MouseHit())
{
MOUSEMSG msg = GetMouseMsg();
if (msg.uMsg == WM_LBUTTONDOWN)
{
if (flag == BEGIN)
{
begin.x = msg.y / IMG_SIZE;
begin.y = msg.x / IMG_SIZE;
flag = END;
}
else if (flag == END)
{
end.x = msg.y / IMG_SIZE;
end.y = msg.x / IMG_SIZE;
flag = BEGIN;
}
printf("begin(%d,%d),end(%d,%d)\n", begin.x, begin.y, end.x, end.y);
}
}
if (kbhit())
{
char ch = getch();
if (ch == 'r')
{
srand(GetTickCount());
for (int i = 1; i <= MAP_SIZE; i++)
{
for (int k = 1; k <= MAP_SIZE; k++)
{
int row = rand() % 10 + 1;
int col = rand() % 10 + 1;
int temp = map[i][k];
map[i][k] = map[row][col];
map[row][col] = temp;
}
}
}
}
}
void show()
{
for (int i = 0; i <= MAP_SIZE + 2; i++)
{
for (int k = 0; k <= MAP_SIZE + 2; k++)
{
printf("%2d ", map[i][k]);
}
printf("\n");
}
}
int isBlocked(int x, int y)
{
return map[x][y];
}
bool horizon(POINT begin, POINT end)
{
if (begin.x == end.x && begin.y == end.y)
{
return false;
}
if (begin.x != end.x)
{
return false;
}
int m_min = min(begin.y, end.y);
int m_max = max(begin.y, end.y);
for (int i = m_min + 1; i < m_max; i++)
{
if (isBlocked(begin.x, i))
{
return false;
}
}
return true;
}
bool vertical(POINT begin, POINT end)
{
if (begin.x == end.x && begin.y == end.y)
{
return false;
}
if (begin.y != end.y)
{
return false;
}
int m_min = min(begin.x, end.x);
int m_max = max(begin.x, end.x);
for (int i = m_min + 1; i < m_max; i++)
{
if (isBlocked(i, begin.y))
{
return false;
}
}
return true;
}
bool turn_ocne(POINT begin, POINT end)
{
if (begin.x == end.x && begin.y == end.y)
{
return false;
}
POINT temp1 = { begin.x, end.y }, temp2 = { end.x, begin.y };
if (!isBlocked(begin.x, end.y))
{
if (horizon(begin, temp1) && vertical(end, temp1))
{
return true;
}
}
if (!isBlocked(end.x, begin.y))
{
if (horizon(end, temp2) && vertical(temp2, begin))
{
return true;
}
}
return false;
}
void gameover()
{
EndBatchDraw();
getch();
closegraph();
}
int main()
{
musicPalying();
GameInit();
show();
while (1)
{
while (gameStatus == 0)
{
startMenu();
}
while (gameStatus == 2)
{
rules();
}
BeginBatchDraw();
GameDraw();
/*Bug();*/
FlushBatchDraw();
GameMouse();
if (map[begin.x][begin.y] == map[end.x][end.y])
{
if (horizon(begin, end))
{
time -= 0.1;
map[begin.x][begin.y] = 0;
map[end.x][end.y] = 0;
Sleep(10);
}
else if (vertical(begin, end))
{
time -= 0.1;
map[begin.x][begin.y] = 0;
map[end.x][end.y] = 0;
Sleep(10);
}
else if (turn_ocne(begin, end))
{
time -= 0.1;
map[begin.x][begin.y] = 0;
map[end.x][end.y] = 0;
Sleep(10);
}
}
if (time <= 0)
{
loseMenu();
loseMusic();
gameover();
}
int t = 0;
for (int i = 0; i < 12; i++)
{
for (int k = 0; k < 12; k++)
{
if (map[i][k] == 0) t++;
}
}
if (t == 144)
{
winMenu();
winMusic();
gameover();
}
}
return 0;
}
`