【C言語】アイコンでマインスイーピングゲームを実装するC言語-vs2010

描画関数はすべての要素を2次元配列で出力します

2次元配列を使用して、10行と10列のすべての数値を出力します

#include <stdio.h>
#define ROW 10//行
#define COL 10//列
int map[ROW][COL];//打印行和列
void DrawMap(){
    
    
int i,j;
for( i = 1;i < ROW; i++){
    
    
 for( j = 1;j < COL; j++)
           printf("%2d ",map[i][j]);
}
 printf("\n");
}
int main(){
    
    
DrawMap();
return 0;
}

初期化する関数

ゲームが終了したら、もう一度ゲームをプレイする場合は、すべての値を0に割り当てる必要があります

void GameInit(){
    
    
for( i = 0;i < ROW; i++){
    
    
for( j = 0;j < COL; j++){
    
    
     map[i][j] = 0}
  }
}

ブレイ

(1)地雷を表すには-1を使用します。合計でNUM個の地雷があります

#define NUM 10//雷

(2)乱数を使用して行と列を取得する

#include <stdlib.h>
#include <time.h>
void GameInit()
{
    
    
 srand((unsigned int)time(NULL));
 
 }
 int  n= 0;
  while(n < NUM)
   int r = rand() % ROW;//1--ROW
      int c = rand() % COL ;//1--COL
      if(map[r][c]==0){
    
    //排除行和列重复布雷
       map[r][c] = -1;
        n++;
      }

私のものではない要素を横断する

for(i = 0;i < ROW; i++){
    
    
 for(j = 0;j<COL;j++){
    
    //遍历不为雷的元素
 if(map[i][j]!= -1){
    
    //找到不为雷的元素
 for( m = i -1; m<=i+1; m++){
    
    //九宫格得出行和列
  for( n = j - 1; n<=j+1; n++)
  if(map[m][n] == -1)//找到不为雷的元素{
    
    
   map[i][j]++;}
         }
       } 
     } 
   }

Jiugonggeを使用して周囲の要素をトラバースする

(1)10行10列を12行12列に拡大します。Jiugonggeを使用して周囲の要素をトラバースする場合は、すべての行と列に2を追加します

for( i = 1;i < ROW+2; i++){
    
    
 for(j = 1;j < COL+2;j++){
    
    
    }
}

(2)周囲の行と列を九功を補助する補助領域として、中央の10行と10列をゲーム領域として使用し、ランダムな行と列を1増やす必要があります。

int r = rand() % ROW+1;//1-ROW
int c = rand() % COL+1 ;//1-COL

写真を埋める

要素に従って絵を記入してください

#include <graphics.h>//处理图片的图文件
#define SIZE 50//定义图片的长度
IMAGE img[12];//图片
int map[ROW+2][COL+2];//不为雷的元素
//绘制函数 打印图片
void DrawMap(){
    
    
for( int i = 1;i < ROW; i++){
    
    
for( j = 1;j < COL; j++){
    
    
     printf("%2d ",map[i][j]);
      /******************
      元素     图片
      -1       img[9]
       0-8       数字
       19-28     img[10]
       >30       img[11]
       ******************/
        if(map[i][j]== -1){
    
    
        putimage((i-1)*SIZE,(j-1)*SIZE,&img[9]);//当数字为-1放img[9]的雷图片
        }
        else if(map[i][j]>=0&&map[i][j]<= 8){
    
    
        putimage((i-1)*SIZE,(j-1)*SIZE,&img[map[i][j]]);//打印数字图片
        }
         else if (map[i][j]>=19&&map[i][j]<28){
    
    
         putimage((i-1)*SIZE,(j-1)*SIZE,&img[10]);//打印空白
         }
         else if(map[i][j]>30){
    
    
         putimage((i-1)*SIZE,(j-1)*SIZE,&img[11]);//小红旗标记图片
              }
          }
          printf("\n");
        
      }

}
int main(){
    
    
HWND hwnd = initgraph(ROW*SIZE,COL*SIZE,SHOWCONSOLE);//窗口 size的大小 显示在控制台
loadimage(&img[0],L"0.jpg",SIZE,SIZE);//加载数字为0的图片,图片名称为0.jpg 大小为SIZE乘SIZE
loadimage(&img[1],L"1.jpg",SIZE,SIZE);
loadimage(&img[2],L"2.jpg",SIZE,SIZE);
loadimage(&img[3],L"3.jpg",SIZE,SIZE);
loadimage(&img[4],L"4.jpg",SIZE,SIZE);
loadimage(&img[5],L"5.jpg",SIZE,SIZE);
loadimage(&img[6],L"6.jpg",SIZE,SIZE);
loadimage(&img[7],L"7.jpg",SIZE,SIZE);
loadimage(&img[8],L"8.jpg",SIZE,SIZE);
loadimage(&img[9],L"9.jpg",SIZE,SIZE);//雷
loadimage(&img[10],L"10.jpg",SIZE,SIZE);//空白
loadimage(&img[11],L"11.jpg",SIZE,SIZE);//标记
GameInit();
DrawMap(); 
    return 0

}

ゲームの成功と失敗を判断する

int count = 0;//点开的个数
 while(1){
    
    
 DrawMap();
 if(PlayGame()== -1){
    
    
  DrawMap();
   MessageBox(hwnd,L"Gameover!",L"",MB_OK);//当为雷则宣布Gameover!
   break;
}
if(ROW*COL - NUM == count){
    
    //行数乘以列数减去雷的数量等于点开的个数
 DrawMap();
 MessageBox(hwnd,L"success!",L"",MB_OK);//宣布游戏成功
 break;
   }
 }

スイッチケースを使用して、マウスの左ボタンと右ボタンの機能を実現

int PlayGame(){
    
    
//定义鼠标初始化为零
MOUSEMSG msg = {
    
     0 };
int r,c;
while(1){
    
    
msg = GetMouseMsg();
switch(msg.uMsg){
    
    
case WM_LBUTTONDOWN:// 左键 翻开扫雷 空白图片
r = msg.x / SIZE + 1;
c = msg.y / SIZE + 1;//点击翻开的位置
if(map[r][c] >= 19 && map[r][c] <= 28){
    
    
if (map[r][c] == 20){
    
    
OpenZero(r,c);//调用打开空白区,下面实现空白辅助区
}
else{
    
    
map[r][c] -= 20;
count++;
   }
}
return map[r][c];
break;
case WM_RBUTTONDOWN:// 右键 标记一个空白图片 取消一个标记图片
r = msg.x / SIZE + 1;
c = msg.y / SIZE + 1;
if(map[r][c] >= 19 && map[r][c] <= 28){
    
    
map[r][c] += 50;
}
else if(map[r][c] > 30){
    
    
map[r][c] -= 50;
     }
}
 return map[r][c];
  break; 

空白の補助領域を実現

void OpenZero(int r,int c ){
    
    
map[r][c] -= 20;
count++;
//0为辅助区均为零
for(int m = r -1;m<= r +1;m++){
    
    
for(int n = c-1;n<= c +1;n++){
    
    
if(m>=1&&m<=ROW&&n>=1&&n<=COL){
    
    //游戏
if(map[m][n]>= 19&&map[m][n]<= 28){
    
    
if(map[m][n]!= 20){
    
    
map[m][n] -= 20;
count++;
}
else{
    
    
OpenZero(m,n); 
}}}}}

}

単純な暗号化

for(i = 1;i < ROW + 1; i++){
    
    
for(j = 1;j< COL + 1;j++){
    
    
map[i][j] += 20; 
   }
}

マインスイーパアイコン

注意:画像を追加するときは、プロジェクトから右クリックしてファイルを開き、画像のwindows-fillからファイルを開く必要があります。
数値0(自己修正)
0.jpg
数値1
1.jpg

2番
2.jpg

ナンバー3
3.jpg
ナンバー4
4.jpg
ナンバー5
5.jpg
ナンバー6(自分では直せないほど醜い)
ナンバー7
7.jpg
サンダー:
私の
小さな赤い旗マーク
小さな赤い旗

歩いたピット

画像の要件
1、画像のサイズは同じです:256の256倍にすることができます
2.画像​​はpngタイプではなくjpgタイプである必要があります
#include <graphics.h>
直接ダウンロードしたvs2010のバージョンには、#include <graphics.h>ファイルが付属していません。
対応するパッケージをオンラインで検索する必要があります(exeバージョンのみがmdをインポートできるため、対応するパッケージを検索して追加する必要があります)

終わり

励ましの一言を送ってください、私は最近それが好きです

私たちは本当にそれが好きなときだけ、この世界に住んでいます

いい加減にして

おすすめ

転載: blog.csdn.net/weixin_46038869/article/details/107696964