您好我正在控制台中制作一个tic tac toe游戏。 我的代码出了什么问题? 我将链接器设置设置为控制台。
代码:
// Tic tac Toe
// Plays a tic tac toe game against a npc
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
// global constants
const char X = 'X';
const char O = '0';
const char EMPTY = ' ';
const char TIE = 'T';
const char NO_ONE = 'N';
//function prototypes
void instructions();
char askYesNo(string question);
int askNumber(string question, int high, int low =0);
char humanPiece();
char opponent(char piece);
void displayBoard(const vector<char>& board);
char winner(const vector<char>& board);
bool isLegal(const vector<char>& board, int move);
int humanMove(const vector<char>& board, char human);
int computerMove(const vector<char>& board, char computer);
void announceWinner(char winner, char computer, char human);
int main()
{
int move;
const int NUM_SQUARES = 9;
vector<char> board(NUM_SQUARES, EMPTY);
instructions();
char human = humanPiece();
char computer = opponent(human);
char turn = X;
displayBoard(board);
while (winner(board) == NO_ONE)
{
if (turn == human)
{
move = humanMove(board, human);
board[move] = human;
}
else
{
move = computerMove(board, computer);
board[move] = computer;
}
displayBoard(board);
turn = opponent(turn);
}
announceWinner(winner(board), computer, human);
return 0;
}
void instructions()
{
cout << "Welcome to the ultimate man-machine showdown: Tic Tac Toe.\n";
cout << "--I'm gonna cut you in half like a knife and butter like a lightsaber and steel!!!\n\n";
cout << "make your move now by entering a number, 0-8. The number\n";
cout << "corresponds to the desired board position , as illustrated: \n\n";
cout << " 0|1|2 \n";
cout << " ------- \n";
cout << " 3|4|5 \n";
cout << " ------- \n";
cout << " 6|7|8 \n\n";
cout << "Prepare yourself human, the battle is about to begin.\n\n";
}
char askYesNo(string question)
{
char response;
do
{
cout << question << "(y\n): ";
cin >> response;
}while (response != 'y' && response != 'n');
return response;
}
int askNumber(string question, int high, int low)
{
int number;
do
{
cout << question << "(" << low << "-" << high << "): ";
cin >> number;
}while (number > high || number < low);
return number;
}
char humanPiece()
{
char go_first = askYesNo("Do you require the first move?");
if (go_first == 'y')
{
cout << "\n Then take the first move. You will need it.\n";
return X;
}
else
{
cout << "Then I will make the first move.\n";
return 0;
}
}
char opponent(char piece)
{
if (piece == 'X')
{
return X;
}
else
{
return 0;
}
}
void displayBoard(const vector<char>& board)
{
cout << "\n\t" << board[0] << "|" << board[1] << "|" << board[3];
cout << "\n\t" << "-------";
cout << "\n\t" << board[3] << "|" << board[4] << "|" << board[5];
cout << "\n\t" << "-------";
cout << "\n\t" << board[6] << "|" << board[7] << "|" << board[8];
cout << "\n\n";
}
char winner(const vector<char>& board)
{
// all possible winning rows
const int WINNING_ROWS[8][3] = {{0,1,2},
{3,4,5},
{6,7,8},
{0,3,6},
{1,4,7},
{2,5,8},
{0,4,8},
{2,4,6}};
const int TOTAL_ROWS = 8;
// if any winning row has three values wich are the same(and not EMPTY)
// then we have a winner
for (int row = 0; row < TOTAL_ROWS; ++row)
{
if ((board[WINNING_ROWS[row][0]] != EMPTY) && (board[WINNING_ROWS[row][0]] == board[WINNING_ROWS[row][1]]) && (board[WINNING_ROWS[row][1]] == board[WINNING_ROWS[row][2]]))
{
return board[WINNING_ROWS[row][0]];
}
}
//since nobody has won check for a tie (no empty squares left)
if (count(board.begin(), board.end(), EMPTY) == 0)
{
return TIE;
}
//since nobody has won and it isn't a tie, the game ain't over
return NO_ONE;
}
inline bool isLegal(int move, const vector<char>& board)
{
return (board[move] == EMPTY);
}
int humanMove(const vector<char>& board, char human)
{
int move = askNumber("Where will you move?", (board.size() - 1));
while (!isLegal(move, board))
{
cout << "\n That square is already occupied, foolish human.\n" << endl;
int move = askNumber("Where will you move?", (board.size() - 1));
}
cout << "Fine....\n";
return move;
}
int computerMove(vector<char> board, char computer)
{
unsigned int move = 0;
bool found = false;
//if the pc can win on next move I will take that move
while (!found && move < board.size())
{
if (isLegal (move, board))
{
board[move] = computer;
found = winner(board) == computer;
board[move] = EMPTY;
}
if (!found)
{
++move;
}
}
// otherwise if the human can win with the next move that's the move I will make
if (!found)
{
move = 0;
char human = opponent(computer);
while (!found && move < board.size())
{
if (isLegal(move, board))
{
board[move] = human;
found = winner(board) == human;
board[move] = human;
}
if (!found)
{
++move;
}
}
}
// otherwise i'll be moving to the next best square
if (!found)
{
move = 0;
unsigned int i = 0;
const int BEST_MOVES[] = {4,0,2,6,8,1.3,5,7};
// pick best open square
while (!found && i < board.size())
{
move = BEST_MOVES[i];
if (isLegal(move, board))
{
found = true;
}
++i;
}
}
cout << "I shall take square number" << move << endl;
return move;
}
void announceWinner(char winner, char computer, char human)
{
if (winner == computer)
{
cout << winner << "has won!\n";
cout << "As I predicted human, I am triumphant once more!\n";
}
else if (winner == human)
{
cout << winner << "has won" << endl;
cout << "no, no it cannot be! Somehow you tricked me Human!\n";
}
else
{
cout << "It's just a tie, I'll beat you next time! \n";
cout << "You cannot beat me though!";
}
}
答案 0 :(得分:1)
-
的前瞻声明int computerMove(const vector<char>& board, char computer);
与实际实施不同。 (错过const部分)
int computerMove(vector<char> board, char computer)