欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用c++和easyx圖形庫做一個低配版掃雷游戲

 更新時間:2020年01月02日 13:10:37   作者:TTODS.  
這篇文章主要介紹了用c++和easyx圖形庫做一個低配版掃雷游戲,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

游戲界面

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

圖1 游戲主菜單界面

圖1游戲的主菜單

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

圖2 模式1的游戲界面

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

圖3 模式2的游戲界面

圖四 游戲成功界面

圖四 游戲成功界面

圖五 游戲失敗界面

游戲失敗界面

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)的個數(shù)
int _count;
//是否有雷
bool mine[20][20] = { false };
//是否已翻轉(zhuǎn)
bool overturned[20][20] = { false };
bool flaged[20][20] = { false };
//游戲模式
int mode;
//游戲重新開始的標志
int cmd = 1;
//游戲結(jié)束標志
bool gameOver;
//玩家獲勝標志
bool _win;
//小方格(坐標)
typedef struct point {
 int x;
 int y;
 point(int _x, int _y) {
 x = _x; y = _y;
 }
}point;
//計算周圍的地雷數(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;
}
//畫點(小方格)
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);
}
//畫旗(藍色方塊代替)
void drawflag(point p) {
  flaged[p.x][p.y] = true;
 drawPoint(p, BLUE);
}
//游戲結(jié)束對話框與"重玩"、"退出"
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;
 }
 }
}
//游戲勝利對話框與"重玩"、"退出"
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個方塊
  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);//將鼠標點擊的坐標轉(zhuǎn)換成對應位置的方塊
  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);
 }
 }
 
}
//地雷的隨機生成器
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"簡    單");
 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"簡    單");
  }
 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;
 }
 }
}
//整個游戲過程
void game() {
 srand(unsigned(time));
 startInterface(mode);
 while (cmd) {
 initgame(mode);
 initGameface();
 generator();
 play();
 }
}
int main() {
 game();
}

3. 符加說明:本程序使用了簡單好用的easyx圖形庫:可以Easyx官網(wǎng)中下載安裝,且Easyx官網(wǎng)提供的文檔詳細的介紹了各種函數(shù)的用法,很容易上手。

總結(jié)

以上所述是小編給大家介紹的利用c++和easyx圖形庫做一個低配版掃雷游,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • C++與C的差異分析

    C++與C的差異分析

    這篇文章主要介紹了C++與C的差異分析,非常實用,需要的朋友可以參考下
    2014-08-08
  • C++和java設(shè)計模式之單例模式

    C++和java設(shè)計模式之單例模式

    這篇文章主要為大家詳細介紹了C++和java設(shè)計模式之單例模式的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • C語言員工業(yè)績銷售源代碼

    C語言員工業(yè)績銷售源代碼

    這篇文章主要為大家詳細介紹了C語言員工業(yè)績銷售源代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • 利用Matlab繪制好看的旋轉(zhuǎn)九邊形

    利用Matlab繪制好看的旋轉(zhuǎn)九邊形

    這篇文章主要為大家介紹了如何利用Matlab繪制超好看的旋轉(zhuǎn)九邊形。文中的示例代碼講解詳細,對我們學習Matlab有一定幫助,需要的可以參考一下
    2022-03-03
  • C語言中memcpy 函數(shù)的用法詳解

    C語言中memcpy 函數(shù)的用法詳解

    這篇文章主要介紹了C語言中memcpy 函數(shù)的用法詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • C#和C++編程語言中的類淺析

    C#和C++編程語言中的類淺析

    在本篇文章里我們給大家分析了C#和C++編程語言中的類的相關(guān)知識點,正在學習的朋友們跟著操作下。
    2019-02-02
  • C++中的map使用方法詳解

    C++中的map使用方法詳解

    C++中的map是一種關(guān)聯(lián)容器,用于存儲鍵值對。它提供了一種非常高效的方法來快速查找特定的值,并且允許我們根據(jù)鍵來排序和遍歷數(shù)據(jù)。在本文中,我們將深入了解C++中的map以及如何使用它來提高程序的效率,感興趣的朋友可以參考下
    2023-05-05
  • C/C++語言中的頭文件匯總

    C/C++語言中的頭文件匯總

    這篇文章主要匯總了C/C++語言中的頭文件,方便各位朋友更好的工作和學習,有需要的朋友可以參考下
    2020-06-06
  • c++ vector模擬實現(xiàn)代碼

    c++ vector模擬實現(xiàn)代碼

    vector是C++ STL中一個非常重要的容器,了解 vector 的底層實現(xiàn)原理,可以很好的幫助我們更加熟練的使用vector。這篇文章通過實例代碼給大家介紹c++ vector模擬實現(xiàn),感興趣的朋友跟隨小編一起看看吧
    2020-02-02
  • C語言選擇排序算法及實例代碼

    C語言選擇排序算法及實例代碼

    本篇文章主要介紹了 C語言選擇排序算法,這里提供代碼實例以便大家理解,通過本文,更好的理解排序算法
    2016-07-07

最新評論