| |||||||||
|
|
«
Previous Thread
|
Next Thread
»
|
Thread Tools | Search this Thread | Display Modes |
|
#1
|
|||
|
|||
|
tic-tac-toe problem
k so i am doin tic tac toe the game i had to do some changes so it will work so here is the code
Code:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
//global constants
const char X = 'X';
const char O = 'O';
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(vector<char> board, char computer);
void announceWinner(char winner, char computer, char human);
//main function
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; //Note: might put something else
}
void instructions()
{
cout<<"Welcome to the ultimate man-machine showdown:Tic-Tac-Toe.\n";
cout<<"-where human brain is pit against silicon processor.\n\n";
cout<<"Make your move known 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<< "\nThen take the first move. You will need it.\n";
return X;
}
else
{
cout<<"\nYour bravery will be your undoing... I will go first.\n";
return O;
}
}
char opponent(char piece)
{
if (piece == X)
return O;
else
return X;
}
void displayBoard(const vector<char>& board)
{
cout<<"\n\t" << board[0] << " | " << board[1] << " | " << board[2];
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 that 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 sqaures 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<< "\nThat square is already occupied, foolish human.\n";
move = askNumber("Where will you move?", (board.size() -1));
}
cout<< "Fine...\n";
return move;
}
int computerMove(vector<char> board, char computer)
{
cout<<"I shall take square number ";
//if computer can win on next move, make that move
for(int move = 0; move < board.size(); ++move)
{
if (isLegal(move, board))
{
board[move] = computer;
if (winner(board) == computer)
{
cout<< move << endl;
return move;
}
//done checking this move, undo it
board[move] = EMPTY;
}
}
//if human can win on next move, block that move
char human = opponent(computer);
for(int move = 0; move < board.size(); ++move)
{
if (isLegal(move, board))
{
board[move] = human;
if (winner(board) == human)
{
cout<< move << endl;
return move;
}
//done checking this move,undo it
board[move] = EMPTY;
}
}
//the best moves to make, in order
const int BEST_MOVES[] = {4, 0, 2, 6, 8, 1, 3, 5, 7};
//since no one can win on next move, pick best open square
for (int i = 0; i < board.size(); ++i)
{
int move = BEST_MOVES[i];
if (isLegal(move, board))
{
cout<< move << endl;
return move;
}
}
}
void announceWinner(char winner, char computer, char human)
{
if (winner == computer)
{
cout<< winner << "'s won!\n";
cout<< "As I predicted human, I am triumphant once more -- proof\n";
cout<< " that computers are superior to humans in all regards.\n";
}
else if (winner == human)
{
cout<< winner << " 's won!\n";
cout<< "No, no! It cannot be! Somehow you tricked me, human.\n";
cout<< "But never again I, the computer, so swear it!\n";
}
else
{
cout<< "It's a tie\n";
cout<< "You were most lucky human, and somehow managed to tie me.\n";
cout<< "Celebrate... for this is the best you will ever achieve.\n";
}
}
as u would compile it u guys know its opens the game and u can play it but then as u see its really not finish cause i get these warnings Build [C++ Warning] tictactoe.cpp(192): W8012 Comparing signed and unsigned values [C++ Warning] tictactoe.cpp(211): W8012 Comparing signed and unsigned values [C++ Warning] tictactoe.cpp(229): W8012 Comparing signed and unsigned values [C++ Warning] tictactoe.cpp(238): W8070 Function should return a value as u may know i use borland and i looked at every single word and symbols that the code has and it has the exact code as the book but even though i can play it it wont announce winner that is the only thing that is wrong with the program and its the exact code as the book plz help Last edited by B-Con : August 5th, 2005 at 06:47 PM. Reason: PLEASE remember your ending code tags, just because you open them doesn't mean they get automatically closed |
|
#2
|
||||
|
||||
|
The warnings are because, as they say, you are comparing two integer like values, but one is signed an the other is unsigned, meaning that this may screw you up if you ever start using negative or very large values, which you aren't....
I realize that you've looked over the code comparing it to the book, but has it occured to you that you should try an learn the language for yourself? You should know and understand all the code you post here, you should only have one problem (or a couple) that you need help with, you should not expect us to debug the entire thing for you. LEARN the langauge, understand what's happening and why, then come back and say that you have a specific question in one specific area. Do not just copy a bunch of code and ask us why it doesn't work -- you got the book to learn about the program in the first place, right? The best place to start is NOT copying and running other people's programs, it's learning the HOW's and WHY's of the langauge, then trying to build smaller things yourself. When you succeed, you move on to other ideas, and play with those, and so on. Don't just sit down and think that you're going to learn a language by asking us to correct a bunch of code you don't understand. We're here to answer specific questions, not waste our time doing busy work that you're too lazy to do. Your next thread had better be a specific question, I don't want to see any more copy-n-paste programs..... btw, also, please remember to close your [code] tags after you end your code. Just because you start them doesn't mean they automatically end for you.....
__________________
Officially a member of the Itsacon fan club. Beer blasts are every friday at Viper_SB's house. I bring the chips. ![]() |
| Viewing: Dev Articles Community Forums > Programming > C/C++ Help > tic-tac-toe problem |
| Thread Tools | Search this Thread |
| Display Modes | Rate This Thread |
|
|
|
|