利用c++和easyx圖形庫(kù)做一個(gè)低配版掃雷游戲
游戲界面
由于這個(gè)游戲是我抱著玩一玩的心態(tài)做出來(lái)的,所以沒有過多的去設(shè)計(jì)界面,也沒有去找游戲的資源(圖片、游戲音效等)。僅使用了不同顏色的方塊來(lái)表示游戲中方塊的狀態(tài)和種類。(綠色為初始狀態(tài)(未翻轉(zhuǎn)的狀態(tài)),黃色為翻轉(zhuǎn)后的背景顏色,藍(lán)色表示已插旗的方塊,紅色代表地雷)
圖1 游戲主菜單界面

圖二 模式一的游戲界面(20*20 40個(gè)雷)

圖三 模式二的游戲界面(10*10 20個(gè)雷)

圖四 游戲成功界面

圖五 游戲失敗界面

2.全部代碼
#include<graphics.h>
#include<iostream>
#include<conio.h>
#include<time.h>
using namespace std;
#define POINTWIDTH 30
//雷的數(shù)量
int mineCnt;
int mapSize;
//已翻轉(zhuǎn)的個(gè)數(shù)
int _count;
//是否有雷
bool mine[20][20] = { false };
//是否已翻轉(zhuǎn)
bool overturned[20][20] = { false };
bool flaged[20][20] = { false };
//游戲模式
int mode;
//游戲重新開始的標(biāo)志
int cmd = 1;
//游戲結(jié)束標(biāo)志
bool gameOver;
//玩家獲勝標(biāo)志
bool _win;
//小方格(坐標(biāo))
typedef struct point {
int x;
int y;
point(int _x, int _y) {
x = _x; y = _y;
}
}point;
//計(jì)算周圍的地雷數(shù)量
int getAroundMineCnt(point p) {
int cnt=0;
for (int i = p.x - 1; i <= p.x + 1; i++) {
for (int j = p.y - 1; j <= p.y + 1; j++) {
if (i >= 0 && i < 20 && j >= 0 && j < 20 && mine[i][j])
cnt++;
}
}
return cnt;
}
//畫點(diǎn)(小方格)
void drawPoint(point p,int color) {
setfillcolor(color);
fillrectangle(p.x*POINTWIDTH +140,p.y*POINTWIDTH +140, p.x * POINTWIDTH + 140+ POINTWIDTH, p.y * POINTWIDTH + 140+ POINTWIDTH);
}
//畫地雷(紅色方塊代替)
void drawMine(point p) {
setfillcolor(RED);
fillrectangle(p.x * POINTWIDTH + 140, p.y * POINTWIDTH + 140, p.x * POINTWIDTH + 140+POINTWIDTH, p.y * POINTWIDTH + 140+POINTWIDTH);
}
//畫旗(藍(lán)色方塊代替)
void drawflag(point p) {
flaged[p.x][p.y] = true;
drawPoint(p, BLUE);
}
//游戲結(jié)束對(duì)話框與"重玩"、"退出"
void gameover(int &cmd) {
gameOver = 1;
for (int i = 0; i < mapSize; i++) {
for (int j = 0; j < mapSize; j++) {
if (mine[i][j]) {
point p(i, j);
drawMine(p); }
}
}
Sleep(500);
setfillcolor(LIGHTGRAY);
fillrectangle(200,300,700,550);
rectangle(200, 500, 350, 550);
rectangle(550, 500, 700, 550);
setbkmode(1);
settextstyle(60, 0, 0);
outtextxy(300, 400, _T("Game over"));
settextstyle(38, 0, 0);
outtextxy(220, 510, _T("Restart"));
outtextxy(560, 510, _T( " Quit"));
MOUSEMSG m;
while (1) {
m = GetMouseMsg();
if (m.mkLButton&&m.y > 500 && m.y < 550 && m.x>200 && m.x < 350)
break;
else if (m.mkLButton&&m.y > 500 && m.y < 550 && m.x>550 && m.x < 700) {
cmd = 0;
break;
}
}
}
//游戲勝利對(duì)話框與"重玩"、"退出"
void win(int &cmd) {
_win = 1;
setfillcolor(LIGHTGRAY);
fillrectangle(200, 300, 700, 550);
rectangle(200, 500, 350, 550);
rectangle(550, 500, 700, 550);
setbkmode(1);
settextstyle(60, 0, 0);
outtextxy(300, 400, _T("You Win!"));
settextstyle(38, 0, 0);
outtextxy(220, 510, _T("Restart"));
outtextxy(560, 510, _T(" Quit"));
MOUSEMSG m;
while (1) {
m = GetMouseMsg();
if (m.mkLButton&&m.y > 500 && m.y < 550 && m.x>200 && m.x < 350)
break;
else if (m.mkLButton&&m.y > 500 && m.y < 550 && m.x>550 && m.x < 700) {
cmd = 0;
break;
}
}
}
//翻轉(zhuǎn)
void overturn(point p,int t) {
settextstyle(POINTWIDTH*0.8 , POINTWIDTH*0.8 , 0);
settextcolor(BLACK);
if (t == 1) {
if (!mine[p.x][p.y]) {
_count++;
drawPoint(p, YELLOW);
overturned[p.x][p.y] =true ;
//判斷周圍的雷的數(shù)量是否為0,為0則翻轉(zhuǎn)該方塊周邊的8個(gè)方塊
if (getAroundMineCnt(p) != 0) {
int cnt = getAroundMineCnt(p);
_TCHAR a[3];
_stprintf_s(a, L"%d", cnt);
outtextxy(p.x*POINTWIDTH+POINTWIDTH*0.1+ 140, p.y*POINTWIDTH+POINTWIDTH*0.1 + 140, a);
if (_count == mapSize * mapSize - mineCnt) { win(cmd); return; }
}
else {
for (int i = p.x - 1; i <= p.x + 1; i++) {
for(int j=p.y-1;j<=p.y+1;j++)
if (i >= 0 && i < mapSize && j >= 0 && j < mapSize&&!overturned[i][j]) {
point temp(i, j);
overturn(temp, 1);
}
}
}
}
else { gameover(cmd); return; }
}
else {
if (!flaged[p.x][p.y]) {
drawflag(p);
}
else {
flaged[p.x][p.y] = false;
drawPoint(p, GREEN);
}
}
}
//右鍵插旗
void play() {
while (true) {
MOUSEMSG m;
m = GetMouseMsg();
if (m.mkLButton&&m.x > 140 && m.x < 140+mapSize*POINTWIDTH && m.y > 140 && m.y < 140+mapSize*POINTWIDTH)
{
point p((m.x - 140) / POINTWIDTH, (m.y - 140) / POINTWIDTH);//將鼠標(biāo)點(diǎn)擊的坐標(biāo)轉(zhuǎn)換成對(duì)應(yīng)位置的方塊
if(!overturned[p.x][p.y])
overturn(p,1);
}
if (m.mkRButton&&m.x > 140 && m.x < 740 && m.y > 140 && m.y < 740)
{
point p((m.x - 140) / POINTWIDTH, (m.y - 140) / POINTWIDTH);
if(!overturned[p.x][p.y])
overturn(p, 2);
}
if (gameOver) return;
else if (_win) return;
}
}
//初始化游戲界面
void initGameface() {
if(mode==1)
rectangle(140, 140, 740, 740);
else rectangle(140, 140, 440, 440);
setbkcolor(LIGHTGRAY);
cleardevice();
setbkcolor(YELLOW);
point p(0, 0);
for (int i = 0; i < mapSize; i++) {
for (int j = 0; j < mapSize; j++) {
p.x = i;
p.y = j;
drawPoint(p, GREEN);
}
}
}
//地雷的隨機(jī)生成器
void generator() {
int cnt = 0;
while (cnt < mineCnt) {
int i = rand() % mapSize;
int j = rand() % mapSize;
if (!mine[i][j]) {
mine[i][j] = true;
cnt++;
}
}
}
//游戲的開始界面(圖1)
void startInterface(int &mode) {
mode = 1;
initgraph(880, 880);
setbkcolor(LIGHTGRAY);
cleardevice();
setlinecolor(RED);
rectangle(100, 100, 780, 300);
rectangle(300, 400, 580, 500);
rectangle(300, 530, 580, 630);
rectangle(300,660, 580, 760);
settextcolor(RED);
settextstyle(100,0,0);
outtextxy(300,140,L"掃 雷");
settextstyle(60, 0, 0);
outtextxy(320, 420, L"新 游 戲");
outtextxy(320, 550, L"簡(jiǎn) 單");
outtextxy(320, 680, L"游戲幫助");
MOUSEMSG m;
while (1) {
m = GetMouseMsg();
if (m.mkLButton&&m.x > 300 && m.x < 580 && m.y>400 && m.y < 500)
break;
else if (m.mkLButton&&m.x > 300 && m.x < 580 && m.y>530 && m.y < 630)
if (mode == 1) {
mode = 2;
rectangle(300, 530, 580, 630);
outtextxy(320, 550, L"困 難");
}
else {
mode = 1;
rectangle(300, 530, 580, 630);
outtextxy(320, 550, L"簡(jiǎn) 單");
}
else if (m.mkLButton&&m.x > 300 && m.x < 580 && m.y>660 && m.y < 760) {
cleardevice();
MOUSEMSG mm;
while (1) {
mm = GetMouseMsg();
if (mm.mkLButton) break;
}
startInterface(mode);
}
}
}
//初始化游戲
void initgame(int mode) {
_win = 0;
_count = 0;
gameOver = 0;
if (mode == 1) {
mineCnt= 40;
mapSize = 20;
}
else {
mineCnt = 20;
mapSize = 10;
}
for (int i = 0; i < mapSize; i++) {
for (int j = 0; j < mapSize; j++) {
mine[i][j] = 0;
flaged[i][j] = 0;
overturned[i][j] = 0;
}
}
}
//整個(gè)游戲過程
void game() {
srand(unsigned(time));
startInterface(mode);
while (cmd) {
initgame(mode);
initGameface();
generator();
play();
}
}
int main() {
game();
}
3. 符加說明:本程序使用了簡(jiǎn)單好用的easyx圖形庫(kù):可以Easyx官網(wǎng)中下載安裝,且Easyx官網(wǎng)提供的文檔詳細(xì)的介紹了各種函數(shù)的用法,很容易上手。
總結(jié)
以上所述是小編給大家介紹的利用c++和easyx圖形庫(kù)做一個(gè)低配版掃雷游,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)我們網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
上一篇:沒有了
欄 目:C語(yǔ)言
下一篇:C語(yǔ)言實(shí)現(xiàn)航班管理系統(tǒng)
本文標(biāo)題:利用c++和easyx圖形庫(kù)做一個(gè)低配版掃雷游戲
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/1.html
您可能感興趣的文章
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 01-10求子數(shù)組最大和的解決方法詳解
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入C/C++浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式詳解


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文


