Ошибка C ++ LNK2019 и ошибка LNK1120 - PullRequest
0 голосов
/ 30 июня 2011

Здравствуйте, я делаю игру 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!";
    }   

}

1 Ответ

1 голос
/ 30 июня 2011

Предварительная декларация -

int computerMove(const vector<char>& board, char computer);

отличается от фактической реализации. (Пропускает константную часть)

int computerMove(vector<char> board, char computer)
...