c++實現掃雷(坐標)


昨天在觀察貪食蛇的代碼時,看到了有如何實現掃雷的c++代碼,覺得挺有趣,今天便又試了一下

#include <ctime>
#include <cstdlib>
#include <iostream>
using namespace std;
int map[12][12];    // 為避免邊界的特殊處理,故將二維數組四周邊界擴展1
int derection[3] = { 0, 1, -1 };  //方向數組
int calculate ( int x, int y )
{
 int counter = 0;
 for ( int i = 0; i < 3; i++ )
  for ( int j = 0; j < 3; j++ )
   if ( map[ x+derection[i]][ y+derection[j] ] == 9 )
    counter++;                 // 統計以(x,y)為中心的四周的雷數目
 return counter;
}
void game ( int x, int y )
{
    if ( calculate ( x, y ) == 0 )
 {
  map[x][y] = 0;
  for ( int i = 0; i < 3; i++ )
  {                                  // 模擬游戲過程,若點到一個空白,則系統自動向外擴展
   for ( int j = 0; j < 3; j++ )
    if ( x+derection[i] <= 9 && y+derection[j] <= 9 && x+derection[i] >= 1 && y+derection[j] >= 1
     && !( derection[i] == 0 && derection[j] == 0 ) &&  map[x+derection[i]][y+derection[j]] == -1 ) 
                      game( x+derection[i], y+derection[j] ); // 條件比較多,一是不可以讓兩個方向坐標同時為0,否則

  }                                                      //二是遞歸不能出界.三是要保證不返回調用。
 }
 else
  map[x][y] = calculate(x,y);
}
void print ()
{
 for ( int i = 1; i < 10; i++ )
 {
  for ( int j = 1; j < 10; j++ )
  {
   if ( map[i][j] == -1 || map[i][j] == 9 )
    cout << "#";
   else
    cout << map[i][j];
  }
  cout << endl;
 }
}
bool check ()
{
 int counter = 0;
 for ( int i = 1; i < 10; i++ )
  for ( int j = 1; j < 10; j++ )
   if ( map[i][j] != -1 )
    counter++;
 if ( counter == 10 )
  return true;
 else
  return false;
}

int main ()
{
 
 int i, j, x, y;
 char ch; 
 srand ( time ( 0 ) );
 
 do
 {
  memset ( map, -1, sizeof(map) );  // 將map全部初始化為-1,以后用-1表示未涉及的區域
 
  for ( i = 0; i < 10;  )
  {
   x = rand()%9 + 1;
   y = rand()%9 + 1;
   if ( map[x][y] != 9 )
   {
    map[x][y] = 9;
    i++;
   }
  }
 
  for ( i = 1; i < 10; i++ )
  {
   for ( j = 1; j < 10; j++ )
    cout << "#";
   cout << "\n";
  }
  cout << "\n";
 
  cout << "Please enter a coordinate: ";
  while ( cin >> x >> y )
  {
   if ( map[x][y] == 9 )
   {
    cout << "GAME OVER" << endl;    //點中雷之后游戲結束,並且輸出雷的位置
    for ( i = 1; i < 10; i++ )
    {
     for ( j = 1; j < 10; j++ )
     {
      if ( map[i][j] == 9 )
       cout << "@";
      else
       cout << "#";
     }
     cout << endl;
    }
    break;
   }

   game(x,y);
   print();
 
   if ( check () )
   {
    cout << "YOU WIN" << endl;
    break;
   }
   cout << "\n\n";
  }
 
  cout << "Do you want to play again, if true enter Y, or enter N" << endl;
  cin >> ch;
  cout << "\n\n";
 } while ( ch == 'Y' );
 
 return 0;
}
  

程序截圖:

界面有點簡陋,並是通過坐標來排雷的,而且到現在還沒搞懂他這個程序到底該怎樣輸入坐標,不過還是感謝作者吧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM