井字游戏编程

Tic Tac Toe Programming

本文关键字:编程 游戏      更新时间:2023-10-16

我是c++编程新手。我正在为井字游戏编写代码,以了解其算法是如何工作的。我的问题是关于我有两个函数。其中一个是clearBoard函数另一个是drawBoard函数。我得到的帮助很少,但我不知道这些函数是怎么工作的。谁能给我解释一下到底什么是什么?我一直在试图解决它,理解它,但我觉得我更困惑了。这可能是小菜一碟,但我真的想知道到底发生了什么。感谢您的时间和关注……

这里是clearBoard函数:

void clearBoard(int board[])
{
 int i;
  for(i = 0; i < board_size; i++) {
   board[i] = -i - 1;
 }
}

这是我的drawBoard函数

 void drawBoard(int board[])
 {
  int i, j;
  int n = 0;
  for(i = 0; i <= 6; i = i+3) {
   for(j = 0; j < 3; ++j) {
    if(board[i + j] == 2)
    cout << "|X|";
     else if(board[i + j] == 1)
    cout << "|O|";
     else
    cout << "|" << n << "|";
     n = n+1;
    }
   cout << endl;
   }
  }

这是我的main.cpp文件。我只是想张贴我的整个工作,至少它会更容易看到完整的图片。

 #include <iostream>
 #include <ctime>
 #include<cstdlib>
 #include "Define.h"
 using namespace std;

 int main()
 {
  int board[board_size];
  int turn = 0;
  int p = 0;
  int move = 10;
  srand(time(NULL));
  clearBoard(board);

  cout << "This turn is randomly chosen!" << endl;
  p = random(2) + 1;
  cout << "The first move goes to Player: " << p << endl;
  turn = p;
  do {
   if(p== 2 && 2 == turn)
  {
    drawBoard(board);
    move = getPlayerMove(turn);
  }
  else
    move = makeRandMove(turn);
  } while(!isMoveValid(board, move));
    board[move] = turn;
 while(!isWin(board, move)){
 drawBoard(board);
  if(2 == turn)
    turn = 1;
  else
    turn = 2;
  do {
   if(2 == turn)
      move = getPlayerMove(turn);
  else
    move = makeRandMove(turn);
  } while(!isMoveValid(board, move));
   board[move] = turn;
  }
  drawBoard(board);
  cout << "Player " << turn << " wins." << endl;
  return 0;
  }

这是functions.cpp文件,里面有我上面提到的函数。

#include <iostream>
#include<cstdlib>
using namespace std;

const int board_size = 9;
void clearBoard(int board[])
{
 int i;
  for(i = 0; i < board_size; i++) {
  board[i] = -i - 1;
 }
 }
 int random(int x)
 {
 return rand() % x;
 }
 void drawBoard(int board[])
 {
 int i, j;
 int n = 0;
 for(i = 0; i <= 6; i = i+3) {
  for(j = 0; j < 3; ++j) {
    if(board[i + j] == 2)
 cout << "|X|";
  else if(board[i + j] == 1)
cout << "|O|";
  else
cout << "|" << n << "|";
n = n+1;
}
cout << endl;
 }
 }

int getPlayerMove(int player)
{
int move;
cout << "Player " << player << " enter move: ";
cin >> move;
return move;
}

int makeRandMove(int player)
{
cout << "Computer (player " << player << ") moving." << endl;
return rand() % board_size;
}

 bool isMoveValid(int board[], int move)
 {
  if(board[move] < 0)
  return true;
  return false;
  }

  bool isWin(int board[], int move)
  {
  if((board[0] == board[1] && board[0] == board[2]) ||
 (board[3] == board[4] && board[3] == board[5]) ||
 (board[6] == board[7] && board[6] == board[8]) ||
 (board[0] == board[3] && board[0] == board[6]) ||
 (board[1] == board[4] && board[1] == board[7]) ||
 (board[2] == board[5] && board[2] == board[8]) ||
 (board[0] == board[4] && board[0] == board[8]) ||
 (board[2] == board[4] && board[2] == board[6]))
  return true;
  return false;
 }

这里是我的define.h头文件有所有的原型…

#ifndef formula
#define formula
const int board_size = 9;
int random(int x);
void clearBoard(int board[]);
void drawBoard(int board[]);
int getPlayerMove(int player);
int makeRandMove(int player);
bool isMoveValid(int boardp[], int move);
bool isWin(int board[], int move);
#endif

理解clearBoard和drawBoard这两个你难以理解的棋盘函数的关键在于,你需要理解你所存储的游戏棋盘的数据结构。事实上,这是一个非常简单的例子。您的board被定义为包含9个项目的数组:

int board[board_size];
...
const int board_size = 9;

考虑这个问题的最佳方式是,如果你有一个3 x 3的井字游戏棋盘,并将每一行并排放置。所以前三个元素是第一行,后三个元素是第二行,后三个元素是最后一行。

drawBoard函数是这两个函数中更复杂的一个,但是如果你理解了数组是什么以及它代表了什么,它会让这个函数更容易理解。外部的for循环循环遍历游戏板的每一行,而内部的for循环循环遍历该行中的每个元素。