21xrx.com
2025-04-13 14:54:17 Sunday
文章检索 我的文章 写文章
C++小游戏代码示例
2023-07-06 06:53:21 深夜i     12     0
C++ 小游戏 代码 示例

随着计算机科学的发展,游戏成为了一个广泛受欢迎的领域之一。编写游戏代码,成为了许多程序员的一项有趣和挑战性的任务。在这篇文章中,我们将介绍一些C++小游戏代码示例,以帮助您开始掌握这项技能。

1. 猜数字游戏

猜数字游戏是一个简单的小游戏,能够向您展示如何使用C++实现基本逻辑。代码如下:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
  int randomNumber, userInput;
  
  srand(time(0)); //用当前时间初始化随机数生成器
  randomNumber = (rand() % 100) + 1; //生成1-100中的随机数
  
  cout << "猜数字游戏-猜1-100中的一个数字:\n";
  
  while(true)
  {
    cout << "请输入您的数字猜测:\n";
    cin >> userInput;
    
    if(userInput == randomNumber)
    {
      cout << "恭喜您猜对了!\n";
      break;
    }
    else if(userInput < randomNumber)
    {
      cout << "您输入的数字过小,请再次尝试:\n";
    }
    else if(userInput > randomNumber)
    {
      cout << "您输入的数字过大,请再次尝试:\n";
    }
  }
  
  return 0;
}

2. 扫雷游戏

扫雷游戏是一个受欢迎的游戏,它在寻找和标记地雷的同时,还要确保玩家不会不小心踩上它们。下面是一个简单的代码示例,它用C++实现了扫雷游戏的基本逻辑:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
const int ROWS = 10; //行数
const int COLS = 10; //列数
const int BOMBS = 10; //地雷数量
int gameBoard[ROWS][COLS];
void initializeGameBoard()
{
  int row, col, bombsPlaced = 0;
  
  for(row = 0; row < ROWS; row++)
  {
    for(col = 0; col < COLS; col++)
    {
      gameBoard[row][col] = 0; //初始化每个方块
    }
  }
  
  srand(time(0));
  
  while(bombsPlaced < BOMBS)
  {
    row = (rand() % ROWS);
    col = (rand() % COLS);
    
    if(gameBoard[row][col] != -1)
    {
      gameBoard[row][col] = -1; //将方块标记为地雷
      bombsPlaced++;
    }
  }
}
int countAdjacentBombs(int row, int col)
{
  int count = 0;
  //检查每个相邻的单元格,包括对角线
  if(row-1 >= 0 && gameBoard[row-1][col] == -1) count++;
  if(col-1 >= 0 && gameBoard[row][col-1] == -1) count++;
  if(row+1 < ROWS && gameBoard[row+1][col] == -1) count++;
  if(col+1 < COLS && gameBoard[row][col+1] == -1) count++;
  if(row-1 >= 0 && col-1 >= 0 && gameBoard[row-1][col-1] == -1) count++;
  if(row+1 < ROWS && col+1 < COLS && gameBoard[row+1][col+1] == -1) count++;
  if(row-1 >= 0 && col+1 < COLS && gameBoard[row-1][col+1] == -1) count++;
  if(row+1 < ROWS && col-1 >= 0 && gameBoard[row+1][col-1] == -1) count++;
  
  return count;
}
void printBoard(bool shouldShowBombs)
{
  int row, col;
  
  for(row = 0; row < ROWS; row++)
  {
    for(col = 0; col < COLS; col++)
    {
      if(gameBoard[row][col] == -1 && shouldShowBombs)
      {
        cout << "B ";
      }
      else if(gameBoard[row][col] == -2)
      {
        cout << "F ";
      }
      else if(gameBoard[row][col] == -3)
      {
        cout << "M ";
      }
      else if(gameBoard[row][col] >= 0)
      {
        cout << gameBoard[row][col] << " ";
      }
    }
    cout << endl;
  }
}
bool checkForWin()
{
  int row, col, countNonBomb = 0, countFlag = 0;
  
  for(row = 0; row < ROWS; row++)
  {
    for(col = 0; col < COLS; col++)
    {
      if(gameBoard[row][col] >= 0 && gameBoard[row][col] <= 8)
      {
        countNonBomb++;
      }
      else if(gameBoard[row][col] == -2)
      {
        countFlag++;
      }
    }
  }
  
  if(countFlag == BOMBS && countNonBomb == (ROWS * COLS - BOMBS))
  {
    return true;
  }
  else
  {
    return false;
  }
}
int main()
{
  int row, col, counter = 0;
  bool gameOver = false, winGame = false;
  
  cout << "扫雷游戏-看看您能否找到所有地雷!\n";
  
  initializeGameBoard(); //初始化游戏板
  
  while(!gameOver)
  {
    printBoard(false);
    cout << "请输入要翻转的行和列(中间用空格隔开):";
    cin >> row >> col;
    
    if(gameBoard[row][col] == -1) //如果玩家翻开了地雷,则游戏结束
    {
      cout << "BOOM! 你已经踩到了地雷。游戏结束。" << endl;
      gameBoard[row][col] = -3; //标记被翻开的地雷
      printBoard(true); //展示游戏板,包括所有地雷
      gameOver = true;
    }
    else if(gameBoard[row][col] >= 0 && gameBoard[row][col] <= 8) //如果玩家翻开了数字方块
    {
      gameBoard[row][col] = countAdjacentBombs(row, col);
      counter++;
      if(checkForWin()) //检查是否胜利
      {
        cout << "你赢了!你在翻开" << counter << "个方块后找到了所有的地雷!" << endl;
        printBoard(true);
        gameOver = true;
        winGame = true;
      }
    }
    else if(gameBoard[row][col] == -2) //如果玩家标记了旗帜
    {
      cout << "你已经标记了一个旗帜,现在请移除它(Y/N)?";
      char response;
      cin >> response;
      
      if(response == 'Y' || response == 'y')
      {
        gameBoard[row][col] = 0; //移除旗帜
      }
    }
    else //玩家翻开空方块
    {
      cout << "这是一个空的方块,请尝试别的地方。" << endl;
    }
  }
  
  return 0;
}

这个程序与真正的扫雷游戏相比,还有很多有待改进的地方。但是,它可以帮助您开始理解C++如何实现复杂的游戏逻辑。

3. 黑白棋游戏

黑白棋游戏,也称反棋,是两个人玩的棋类游戏。在这个游戏中,每个玩家尝试使他们的棋子比对手多。黑白棋游戏的C++代码示例如下:

#include <iostream>
#include <cstring>
using namespace std;
const int BOARD_SIZE = 8; //棋盘大小
enum class Color {BLACK, WHITE}; //黑色和白色棋子
class Reversi {
private:
  Color board[BOARD_SIZE][BOARD_SIZE]; //棋盘
  Color turn; //当前玩家的回合
  int blackCount; //黑色棋子的数量
  int whiteCount; //白色棋子的数量
  
  void initializeBoard() //初始化棋盘
  {
    int row, col;
    
    for(row = 0; row < BOARD_SIZE; row++)
    {
      for(col = 0; col < BOARD_SIZE; col++)
      {
        board[row][col] = Color::WHITE; //初始化所有方块为白色
      }
    }
    
    board[3][3] = Color::BLACK;
    board[4][4] = Color::BLACK;
    board[3][4] = Color::WHITE;
    board[4][3] = Color::WHITE;
    
    turn = Color::BLACK; //黑色棋子先行
    blackCount = 2;
    whiteCount = 2;
  }
  
  bool canPlacePiece(int row, int col, Color piece) //检查是否能够在指定的位置放置棋子
  {
    if(board[row][col] != Color::WHITE) //如果不是白色方块,则不能在此放置棋子
    {
      return false;
    }
    
    int r, c;
    bool foundPiece;
    
    for(r = -1; r <= 1; r++)
    {
      for(c = -1; c <= 1; c++)
      {
        if(r == 0 && c == 0) //如果是当前位置,则跳过
        {
          continue;
        }
        
        int i = 1;
        foundPiece = false;
        
        while(r*i + row >= 0 && r*i + row < BOARD_SIZE && c*i + col >= 0 && c*i + col < BOARD_SIZE)
        {
          if(board[row + r*i][col + c*i] == piece) //如果找到了同色的棋子,则说明可以将对手的棋子反转
          {
            foundPiece = true;
            break;
          }
          else if(board[row + r*i][col + c*i] == Color::WHITE) //如果找到了空方块,则跳出循环
          {
            break;
          }
          
          i++;
        }
        
        if(foundPiece) //如果可以进行反转,则该位置可行
        {
          return true;
        }
      }
    }
    
    return false; //否则,该位置不可行
  }
  
  void printBoard() //展示棋盘
  {
    cout << " ";
    for(int col = 0; col < BOARD_SIZE; col++)
    {
      cout << col << " ";
    }
    cout << endl;
    
    for(int row = 0; row < BOARD_SIZE; row++)
    {
      cout << row << " ";
      for(int col = 0; col < BOARD_SIZE; col++)
      {
        if(board[row][col] == Color::BLACK)
        {
          cout << "@ ";
        }
        else if(board[row][col] == Color::WHITE)
        {
          cout << "O ";
        }
      }
      cout << endl;
    }
  }
  
  void flipPieces(int row, int col, Color piece) //将对手的棋子反转为当前玩家的颜色
  {
    int r, c;
    bool foundPiece;
    
    for(r = -1; r <= 1; r++)
    {
      for(c = -1; c <= 1; c++)
      {
        if(r == 0 && c == 0)
        {
          continue;
        }
        
        int i = 1;
        foundPiece = false;
        
        while(r*i + row >= 0 && r*i + row < BOARD_SIZE && c*i + col >= 0 && c*i + col < BOARD_SIZE)
        {
          if(board[row + r*i][col + c*i] == piece)
          {
            foundPiece = true;
            break;
          }
          else if(board[row + r*i][col + c*i] == Color::WHITE)
          {
            break;
          }
          
          i++;
        }
        
        if(foundPiece)
        {
          for(int j = 1; j < i; j++)
          {
            board[row + r*j][col + c*j] = piece;
          }
        }
      }
    }
  }
  
public:
  Reversi()
  {
    initializeBoard();
  }
  
  void playGame() //开始游戏
  {
    int row, col;
    bool inputValid, canPlace;
    char response;
    
    while(true)
    {
      printBoard();
      
      if(turn == Color::BLACK)
      {
        cout << "黑色棋子的回合。" << endl;
      }
      else
      {
        cout << "白色棋子的回合。" << endl;
      }
      
      inputValid = false;
      canPlace = false;
      
      while(!inputValid || !canPlace)
      {
        cout << "请输入要放置棋子的行和列(例如“3 4”): ";
        cin >> row >> col;
        
        if(row >= 0 && row < BOARD_SIZE && col >= 0 && col < BOARD_SIZE)
        {
          inputValid = true;
        }
        else
        {
          cout << "无效的输入,请重试。" << endl;
        }
        
        if(inputValid) //检查是否能够放棋子
        {
          if(turn == Color::BLACK)
          {
            canPlace = canPlacePiece(row, col, Color::BLACK);
          }
          else
          {
            canPlace = canPlacePiece(row, col, Color::WHITE);
          }
          
          if(!canPlace)
          {
            cout << "您不能在此处放置棋子,请重试。" << endl;
          }
        }
      }
      
      if(turn == Color::BLACK)
      {
        board[row][col] = Color::BLACK;
        blackCount++;
        flipPieces(row, col, Color::BLACK);
      }
      else
      {
        board[row][col] = Color::WHITE;
        whiteCount++;
        flipPieces(row, col, Color::WHITE);
      }
      
      if(blackCount + whiteCount == BOARD_SIZE*BOARD_SIZE) //如果棋盘已满,则游戏结束
      {
        break;
      }
      
      if(turn == Color::BLACK)
      {
        turn = Color::WHITE;
      }
      else
      {
        turn = Color::BLACK;
      }
    }
    
    printBoard();
    
    if(blackCount > whiteCount)
    {
      cout << "黑色棋子胜利!" << endl;
    }
    else if(whiteCount > blackCount)
    {
      cout << "白色棋子胜利!" << endl;
    }
    else
    {
      cout << "平局!" << endl;
    }
    
    cout << "游戏结束。是否再玩一次(Y/N)?";
    cin >> response;
    
    if(response == 'Y' || response == 'y')
    {
      initializeBoard();
      playGame();
    }
    else
    {
      cout << "感谢您的游戏。" << endl;
    }
  }
};
int main()
{
  Reversi game;
  
  cout << "欢迎来玩黑白棋游戏。" << endl;
  
  game.playGame();
  
  return 0;
}

总结

在本文中,我们介绍了三个不同的C++小游戏代码示例,包括猜数字游戏、扫雷游戏和黑白棋游戏。这些示例向您展示了如何使用C++语言编写游戏代码,并让您开始了解游戏编程的基本原理。如果您想进一步深入学习游戏编程,可以寻找更多有关C++游戏编程的学习资源和教程。

  
  

评论区

请求出错了