C語言代碼實現(xiàn)簡單的掃雷小游戲
更新時間:2021年03月19日 10:24:09 作者:Joker0x00
這篇文章主要為大家詳細介紹了C語言代碼實現(xiàn)簡單的掃雷小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
C語言+EASYX實現(xiàn)掃雷,供大家參考,具體內(nèi)容如下
主要思路就是通過一個二維數(shù)組存儲不同的數(shù)來代表0到8等具體的圖片,再配合鼠標的位置和點擊情況,來改變數(shù)組某一項的值,而顯示不同的圖片。
水平有限,有些地方的代碼過于復(fù)雜和繁瑣,有待優(yōu)化;有些功能的實現(xiàn)也不是很完整和合理,敬請指正。
#include <stdio.h> //標準的輸入輸出頭文件。
#include <graphics.h> //EasyX圖形界面。
#include <time.h>
#include <stdlib.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")//導(dǎo)入靜態(tài)庫
int f2=0;//標志信號
int flag=0;//標志信號
int ROW = 0; //棋盤行數(shù)
int COL = 0; //棋盤列數(shù)
int NUM = 0; //雷的個數(shù)
int size; //圖片尺寸
HWND hwnd1;
int count = 0;//已掀開的數(shù)量;
void BGMPLAY(void)//播放音樂函數(shù)
{
mciSendString(L"open ./image/XXX.mp3 alias bgm",0,0,0);//XX可替換為自己的歌曲
mciSendString(L"play bgm repeat",0,0,0);
}
struct rayxy//地雷位置
{
int x;
int y;
}xy[200];//地雷位置
IMAGE img[21];//存儲圖像
void welcome()
{
initgraph( 640, 480);
loadimage(&img[9], L"./image/開始界面1.jpg", 640, 480);//開始界面
loadimage(&img[15], L"./image/菜單界面.jpg", 640, 480);//菜單選擇界面
if (!flag)
{
putimage(0, 0, &img[9]);
Sleep(1000);
}
cleardevice();
putimage(0, 0, &img[15]);
//模式選擇
MOUSEMSG msg = { 0 };
const int x1=9,y1=8, x2=290,y2=8,x3=9,y3=330,x4=290,y4=330, h=306, w=265;
int sx = 0, sy = 0;
//模式選擇
while (1)
{
HWND hwnd;
msg = GetMouseMsg();
if (msg.uMsg == WM_LBUTTONDOWN)
{
sx = msg.x;
sy = msg.y;
break;
}
}
if ((sx >= x1 && sy >= y1)&& (sx <= x1+w && sy <= y1+h))
{
ROW = 9;
COL = 9;
NUM = 10;
size = 70;
}
if ((sx >= x2 && sy >= y2) && (sx <= x2 + w && sy <= y2 + h))
{
ROW = 16;
COL = 30;
NUM = 99;
size = 43;
}
if((sx >= x3 && sy >= y3) && (sx <= x3 + w && sy <= y3 + h))
{
ROW = 16;
COL = 16;
NUM = 40;
size = 48;
}
if ((sx >= x4 && sy >= y4) && (sx <= x4 + w && sy <= y4 + h))
{
MessageBox(hwnd1, L"敬請期待!?。?, L"提示", MB_OK);
f2 = 1;
flag = 1;
Sleep(1000);
}
}//歡迎界面
int map[30][30];//棋盤地圖
void imgplay(void)
{
loadimage(&img[0], L"./image/空白.jpg",size, size);//空白
loadimage(&img[1], L"./image/1.jpg", size, size);
loadimage(&img[2], L"./image/2.jpg", size, size);
loadimage(&img[3], L"./image/3.jpg", size, size);
loadimage(&img[4], L"./image/4.jpg", size, size);
loadimage(&img[5], L"./image/5.jpg", size, size);
loadimage(&img[6], L"./image/6.jpg", size, size);
loadimage(&img[7], L"./image/7.jpg", size, size);
loadimage(&img[8], L"./image/8.jpg", size, size);//8
loadimage(&img[16], L"./image/問號.jpg", size, size);//問號
loadimage(&img[10], L"./image/覆蓋.jpg", size, size);//覆蓋
loadimage(&img[11], L"./image/標記.jpg", size, size);//標記
loadimage(&img[12], L"./image/地雷.jpg", size, size);//地雷
loadimage(&img[13], L"./image/勝利.jpg", size, size);//勝利
loadimage(&img[14], L"./image/問號.jpg", size, size);//問號
loadimage(&img[16], L"./image/9.jpg", size, size);//9
loadimage(&img[17], L"./image/0.jpg", size, size);//0
loadimage(&img[18], L"./image/冒號.jpg", size, size);//冒號
loadimage(&img[20], L"./image/標記錯誤.jpg", size, size);/標記錯誤
}
void gameinit()
{
int i, j;
srand((unsigned int)time(NULL));//為隨機布雷提供隨機數(shù)
for (i = 0; i < ROW + 2; i++)
{
for (j = 0; j < COL + 2; j++)
{
map[i][j] = 0;
}
}
int r, c, n = 0;
while (n < NUM)
{
r = rand() % ROW + 1;
c = rand() % COL + 1;
if (map[r][c] != -1)
{
map[r][c] = -1;
xy[n].x = r;
xy[n].y = c;
n++;
}
else
{
continue;
}
}
for (i = 1; i <= ROW; i++)
{
for (j = 1; j <= COL; j++)
{
if (map[i][j] != -1)
{
for (r = i - 1; r <= i + 1; r++)
for (c = j - 1; c <= j + 1; c++)
{
if (map[r][c] == -1)
{
map[i][j]++;
}
}
}
}
}
for (i = 1; i <= ROW; i++)
{
for (j = 1; j <= COL; j++)
{
map[i][j] += 20;
}
}
}
void drawgraph()
{
int i, j;
for (i = 1; i <= ROW; i++)
{
for (j = 1; j <= COL; j++)
{
if (map[i][j] == -1)
{
putimage((j - 1) * size, (i - 1) * size, &img[12]);//地雷
}
else if (map[i][j] >= 0 && map[i][j] <= 8)
{
putimage((j - 1) * size, (i - 1) * size, &img[map[i][j]]);//顯示數(shù)字和空白
}
else if (map[i][j] >= 19 && map[i][j] <= 28)
{
putimage((j - 1) * size, (i - 1) * size, &img[10]);//覆蓋
}
else if (map[i][j] >= 29&&map[i][j]<=38)
{
putimage((j - 1) * size, (i - 1) * size, &img[11]);//標記
}
else if(map[i][j]>=39&&map[i][j]<=48)
{
putimage((j - 1) * size, (i - 1) * size, &img[14]);//問號
}
if (map[i][j] == -2)
{
putimage((j - 1) * size, (i - 1) * size, &img[13]);//勝利
}
}
}
}
void draw(int i, int j)
{
if (map[i][j] == -1)
{
putimage((j - 1) * size, (i - 1) * size, &img[12]);//地雷
}
else if (map[i][j] >= 0 && map[i][j] <= 8)
{
putimage((j - 1) * size, (i - 1) * size, &img[map[i][j]]);//顯示數(shù)字和空白
}
else if (map[i][j] >= 19 && map[i][j] <= 28)
{
putimage((j - 1) * size, (i - 1) * size, &img[10]);//覆蓋
}
else if (map[i][j] >= 29&&map[i][j]<=38)
{
putimage((j - 1) * size, (i - 1) * size, &img[11]);//標記
}
else
{
putimage((j - 1) * size, (i - 1) * size, &img[14]);//問號
}
}
void blankopen(int r, int c)
{
int a, b;
if (map[r][c] == 20)
{
count++;
map[r][c] -= 20;
}
for (a = r - 1; a <= r + 1; a++)
{
for (b = c - 1; b <= c + 1; b++)
{
if (a >= 1 && a <= ROW && b >= 1 && b <= COL)
{
if (map[a][b] >= 20 && map[a][b] <= 28)
{
map[a][b] -= 20;
count++;
}
}
}
}
}
int playgame()
{
MOUSEMSG msg = { 0 };
int r, c;
//while (1)
//{
msg = GetMouseMsg();
switch (msg.uMsg)
{
case WM_LBUTTONDOWN:
c = msg.x / size + 1;
r = msg.y / size + 1;
if (map[r][c] >= 29&&map[r][c]<=38)
{
map[r][c] -= 10;
}
if (map[r][c] >= 39 && map[r][c] <= 48)
{
map[r][c] -= 20;
}
if (map[r][c] >= 19 && map[r][c] <= 28)
{
if (map[r][c] == 20)
{
blankopen(r, c);
}
else
{
if (map[r][c] != 19)
count++;
map[r][c] -= 20;
}
}
if (map[r][c] == 0)
blankopen(r, c);
draw(r, c);
return map[r][c];
//break;
case WM_RBUTTONDOWN:
c = msg.x / size + 1;
r = msg.y / size + 1;
if (map[r][c] >= 19 && map[r][c] <= 28)
{
map[r][c] += 10;
}
else if (map[r][c] >= 29&&map[r][c]<=38)
{
map[r][c] += 10;
}
else
{
map[r][c] -= 20;
}
draw(r, c);
return map[r][c];
//break;
}
//}
}
int timerec(void)
{
time_t timep;
struct tm p;
time(&timep);
gmtime_s(&p, &timep);
int t = p.tm_min * 60 + p.tm_sec;
return t;
}
void timeplay(int t)
{
int min=0 ,sec=0;
printf("%d\n", t);
min = t / 60;
putimage((COL - 3) * size, (ROW)*size, &img[18]);
switch (min / 10)
{
case 0:putimage((COL - 5) * size, (ROW ) * size, &img[17]); break;
case 1:putimage((COL - 5) * size, (ROW ) * size, &img[1]); break;
case 2:putimage((COL - 5) * size, (ROW ) * size, &img[2]); break;
case 3:putimage((COL - 5) * size, (ROW ) * size, &img[3]); break;
case 4:putimage((COL - 5) * size, (ROW ) * size, &img[4]); break;
case 5:putimage((COL - 5) * size, (ROW ) * size, &img[5]); break;
case 6:putimage((COL - 5) * size, (ROW ) * size, &img[6]); break;
case 7:putimage((COL - 5) * size, (ROW ) * size, &img[7]); break;
case 8:putimage((COL - 5) * size, (ROW ) * size, &img[8]); break;
case 9:putimage((COL - 5) * size, (ROW ) * size, &img[16]); break;
default:putimage((COL - 5) * size, (ROW ) * size, &img[10]); break;
}
switch (min % 10)
{
case 0:putimage((COL - 4) * size, (ROW ) * size, &img[17]); break;
case 1:putimage((COL - 4) * size, (ROW ) * size, &img[1]); break;
case 2:putimage((COL - 4) * size, (ROW ) * size, &img[2]); break;
case 3:putimage((COL - 4) * size, (ROW ) * size, &img[3]); break;
case 4:putimage((COL - 4) * size, (ROW ) * size, &img[4]); break;
case 5:putimage((COL - 4) * size, (ROW ) * size, &img[5]); break;
case 6:putimage((COL - 4) * size, (ROW ) * size, &img[6]); break;
case 7:putimage((COL - 4) * size, (ROW ) * size, &img[7]); break;
case 8:putimage((COL - 4) * size, (ROW ) * size, &img[8]); break;
case 9:putimage((COL - 4) * size, (ROW ) * size, &img[16]); break;
default:putimage((COL - 4) * size, (ROW ) * size, &img[10]); break;
}
sec = t % 60;
switch (sec / 10)
{
case 0:putimage((COL - 2) * size, (ROW ) * size, &img[17]); break;
case 1:putimage((COL - 2) * size, (ROW ) * size, &img[1]); break;
case 2:putimage((COL - 2) * size, (ROW ) * size, &img[2]); break;
case 3:putimage((COL - 2) * size, (ROW ) * size, &img[3]); break;
case 4:putimage((COL - 2) * size, (ROW ) * size, &img[4]); break;
case 5:putimage((COL - 2) * size, (ROW ) * size, &img[5]); break;
case 6:putimage((COL - 2) * size, (ROW ) * size, &img[6]); break;
case 7:putimage((COL - 2) * size, (ROW ) * size, &img[7]); break;
case 8:putimage((COL - 2) * size, (ROW ) * size, &img[8]); break;
case 9:putimage((COL - 2) * size, (ROW ) * size, &img[16]); break;
default:putimage((COL - 2) * size, (ROW ) * size, &img[10]); break;
}
switch (sec % 10)
{
case 0:putimage((COL - 1) * size, (ROW ) * size, &img[17]); break;
case 1:putimage((COL - 1) * size, (ROW ) * size, &img[1]); break;
case 2:putimage((COL - 1) * size, (ROW ) * size, &img[2]); break;
case 3:putimage((COL - 1) * size, (ROW ) * size, &img[3]); break;
case 4:putimage((COL - 1) * size, (ROW ) * size, &img[4]); break;
case 5:putimage((COL - 1) * size, (ROW ) * size, &img[5]); break;
case 6:putimage((COL - 1) * size, (ROW ) * size, &img[6]); break;
case 7:putimage((COL - 1) * size, (ROW ) * size, &img[7]); break;
case 8:putimage((COL - 1) * size, (ROW ) * size, &img[8]); break;
case 9:putimage((COL - 1) * size, (ROW ) * size, &img[16]); break;
default:putimage((COL - 1) * size, (ROW ) * size, &img[10]); break;
}
for (int i = 0; i < COL-5; i++)
{
putimage((i) * size, (ROW)*size, &img[20]);
}
}
int main()
{
BGMPLAY();//播放初始音樂
int i = 0, j = 0, MAX = 0;
srand((unsigned int)time(NULL));
loop:
loop1:
f2 = 0;
welcome();
if (f2)goto loop1;
imgplay();
count = 0;
hwnd1 = initgraph(COL * size, (ROW+1) * size);
gameinit();
MAX = ROW * COL - NUM;
time_t timep;
struct tm p;
time(&timep);
gmtime_s(&p,&timep);
int t1 = timerec();
while (1)
{
drawgraph();
timeplay(timerec() - t1);
if (playgame() == -1)
{
for (i = 0; i < NUM; i++)
{
map[xy[i].x][xy[i].y] = -1;
}
drawgraph();
Sleep(1000);
MessageBox(hwnd1, L"很遺憾!", L"提示", MB_OK);
int x = MessageBox(hwnd1, L"回到主菜單", L"Minesweeper", MB_OKCANCEL);
if (x == 1)
{
flag = 1;
goto loop;
}
break;
}
if (count == MAX)
{
for (i = 0; i < NUM; i++)
{
map[xy[i].x][xy[i].y] = -2;
}
drawgraph();
Sleep(1000);
MessageBox(hwnd1, L"Very good!!!", L"提示", MB_OK);
int y = MessageBox(hwnd1, L"回到主菜單", L"Minesweeper", MB_OKCANCEL);
if (y)
{
flag = 1;
goto loop;
}
else
{
break;
}
}
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Qt物聯(lián)網(wǎng)管理平臺之實現(xiàn)數(shù)據(jù)查詢導(dǎo)出打印
這篇文章主要為大家介紹了如何利用Qt編寫物聯(lián)網(wǎng)管理平臺中數(shù)據(jù)查詢導(dǎo)出打印的功能,文字的示例代碼講解詳細,感興趣的可以了解一下2022-07-07

