21xrx.com
2025-04-06 11:14:02 Sunday
文章检索 我的文章 写文章
基于C++的五子棋游戏设计与实现
2023-06-24 02:00:04 深夜i     7     0
C++ 五子棋游戏 设计 实现 游戏AI

五子棋是一款非常经典的游戏,它可以培养人们的思维能力和策略性。在今天的数字化时代,我们可以利用计算机与程序语言来实现五子棋游戏,因此本文将分享一下基于C ++的五子棋游戏的设计与实现。

1. 游戏环境的设计

游戏环境是程序的主体,包括存储棋盘状态、显示棋盘、提示落子位置等操作。通过调用C ++中的相关库函数,可以很方便地实现游戏环境的设计。下面是游戏环境设计的示例代码:

#include <iostream>
#include <Windows.h>
using namespace std;
const int MAX_ROW = 15;
const int MAX_COL = 15;
enum CHESS WHITE ;
CHESS board[MAX_ROW][MAX_COL] = { EMPTY };
void draw_board() {
  system("cls"); // 清除屏幕
  for (int i = 0; i < MAX_ROW; i++) {
    for (int j = 0; j < MAX_COL; j++) {
      if (board[i][j] == BLACK)
        cout << "⚫️";
      
      else if (board[i][j] == WHITE)
        cout << "⚪️";
      
      else
        cout << " ";
      
    }
    cout << endl;
  }
}
int get_x(int cursor_x)
  return cursor_x / 2;
int get_y(int cursor_y)
  return cursor_y;
bool set_chess(int x, int y, CHESS chess) {
  if (board[x][y] != EMPTY)
    return false;
  
  board[x][y] = chess;
  return true;
}
int main() {
  draw_board();
  int cursor_x = 0;
  int cursor_y = 0;
  while (true) {
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursor_y ); // 设置光标位置
    char input = getchar();
    int x = get_x(cursor_x);
    int y = get_y(cursor_y);
    if (input == 'w' && cursor_y > 0)
      cursor_y--;
    
    else if (input == 's' && cursor_y < MAX_ROW - 1) {
      cursor_y++;
    }
    else if (input == 'a' && cursor_x > 0)
      cursor_x -= 2;
    
    else if (input == 'd' && cursor_x < (MAX_COL - 1) * 2) {
      cursor_x += 2;
    }
    else if (input == ' ' && set_chess(x, y, BLACK)) {
      draw_board();
    }
  }
  return 0;
}

代码中引入了Windows.h库函数,并使用了Windows API中的SetConsoleCursorPosition函数和GetStdHandle函数,来实现设置光标位置。该程序中通过键盘输入wasd移动光标,空格键落子。利用二维数组board来通过CHESS类型存储黑白棋子。

2. 胜负判断的设计

胜负判断是五子棋游戏中十分关键的一部分,它可以根据棋盘状态得出胜负结果。下面是胜负判断的设计示例代码:

bool check_win(int x, int y, int step, CHESS chess) {
  if (step == 5)
    return true;
  
  int dx[4] = 0;
  int dy[4] = 1;
  for (int i = 0; i < 4; i++) {
    int new_x = x + dx[i];
    int new_y = y + dy[i];
    if (new_x < 0 || new_x >= MAX_ROW ||
      new_y < 0 || new_y >= MAX_COL)
      continue;
    
    if (board[new_x][new_y] == chess) {
      if (check_win(new_x, new_y, step + 1, chess))
        return true;
      
    }
  }
  return false;
}
CHESS get_winner() {
  for (int i = 0; i < MAX_ROW; i++) {
    for (int j = 0; j < MAX_COL; j++) {
      if (board[i][j] != EMPTY) {
        if (check_win(i, j, 1, board[i][j])) {
          return board[i][j];
        }
      }
    }
  }
  return EMPTY;
}

通过递归的方式扫描棋盘,用dx、dy数组表示四个方向,每次递归使用新的坐标进行判断。若落子处距离目标处不超过5步,在这个方向上如果继续有同色棋子则继续递归,最终返回胜利状态。

3. 游戏AI的设计

在游戏中加入AI电脑对抗模式,可以为游戏增加更多的趣味性和挑战性,同时也可以为编程者提供更大的思维创新空间。下面是游戏AI的设计示例代码:

bool is_stop(int m, int n, int i, int j) {
  if (board[m][n] == board[i][j] && board[m][n] != EMPTY)
    return false;
  
  //当前路线上的棋子数目
  int count = 0;
  //第一个空位
  int first_empty = -1;
  for (int k = 0; k < 5; k++) {
    int x = m - (4 - k) * dx;
    int y = n - (4 - k) * dy;
    if (x < 0 || x >= MAX_ROW || y < 0 || y >= MAX_COL)
      continue;
    
    if (board[x][y] == CHESS::EMPTY) {
      if (first_empty == -1)
        first_empty = k;
      
      continue;
    }
    if (board[x][y] == board[m][n]) {
      count++;
      if (count == 2 && first_empty == 0)
        return true;
      
      if (count == 3 && first_empty != -1 && first_empty <= 1)
        return true;
      
      if (count == 4)
        return true;
      
    }
    else
      count = 0;
      first_empty = -1;
    
  }
  return false;
}
int eval() {
  int score = 0;
  for (int i = 0; i < MAX_ROW; i++) {
    for (int j = 0; j < MAX_COL; j++) {
      if (board[i][j] != CHESS::EMPTY) {
        for (int k = 0; k < 4; k++) {
          int x = i + dx * (4 - k);
          int y = j + dy * (4 - k);
          if (is_stop(i, j, x, y)) {
            if (board[i][j] == CHESS::BLACK)
              score -= 5;
            
            else {
              score += 5;
            }
          }
        }
      }
    }
  }
  return score;
}
void AI() {
  int max_score = -999999;
  int m = 0, n = 0;
  for (int i = 0; i < MAX_ROW; i++) {
    for (int j = 0; j < MAX_COL; j++) {
      if (board[i][j] == CHESS::EMPTY) {
        board[i][j] = CHESS::WHITE;
        int score = eval();
        if (score > max_score)
          max_score = score;
          m = i;
          n = j;
        
        board[i][j] = CHESS::EMPTY;
      }
    }
  }
  set_chess(m, n, WHITE);
}

代码中使用极大极小值算法来思考下一步的落子位置,首先遍历棋盘找到空位,然后暂时模拟其落子,通过调用eval函数来计算此时的分数。eval函数则就是代表了判断分数的具体极大极小算法实现,通过算法得分来评判当前棋子是否有优势。最终遍历寻找得分最高的落子位置,使用set_chess函数进行落子,实现AI的移步操作。

总结

通过以上代码示例,相信大家已经对基于C ++的五子棋游戏设计与实现有了一定的认识。C ++语言提供了强大的数据类型和函数库,这使得开发简单且高效。在实际的应用开发中,我们可以根据自己的需要对代码进行进一步的开发和优化,并通过结合其他技术手段来实现更加复杂的五子棋游戏功能。

  
  

评论区

    相似文章