Code:
/*This source code copyrighted by Lazy Foo' Productions (2004-2007) and may not be redestributed without written permission.*/
//The headers
#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include "SDL/SDL_ttf.h"
#include <string>
#include <sstream>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
using namespace std;
const char empty = ' ';
const char tie = 't';
const char no_one = 'n';
const char x = 'x';
const char o = 'o';
//original tic tac toe functions
void instructions();
char askyesno ();
int asknumber ();
char humanpiece ();
char opponent (char piece);
void displayboard (const vector<char>& board);
char winner (const vector<char>& board);
bool islegal (int move, const vector<char>& board);
int humanmove (vector<char>& board, char human);
int computermove (vector<char> board, char computer);
void announcewinner (char winner, char human, char computer);
std::stringstream word;
//Screen attributes
const int SCREEN_WIDTH = 150;
const int SCREEN_HEIGHT = 150;
const int SCREEN_BPP = 32;
//The frames per second
const int FRAMES_PER_SECOND = 10;
//The surfaces
SDL_Surface *space = NULL;
SDL_Surface *message = NULL;
SDL_Surface *board = NULL;
SDL_Surface *background = NULL;
SDL_Surface *screen = NULL;
//The event structure
SDL_Event event;
//The font that's going to be used
TTF_Font *font = NULL;
//The color of the font
SDL_Color textColor = { 0,0,0 };
//The areas of the sprite sheet
SDL_Rect pieces[ 3 ];
//clip board pieces
void clip();
void clip()
{
//piece x
pieces[0].x = 0;
pieces[0].y = 0;
pieces[0].w = 50;
pieces[0].h = 50;
//pieces o
pieces[1].x = 50;
pieces[1].y = 0;
pieces[1].w = 50;
pieces[1].h = 50;
//pieces empty
pieces[2].x = 100;
pieces[2].y = 0;
pieces[2].w = 50;
pieces[2].h = 50;
}
//The timer
class Timer
{
private:
//The clock time when the timer started
int startTicks;
//The ticks stored when the timer was paused
int pausedTicks;
//The timer status
bool paused;
bool started;
public:
//Initializes variables
Timer();
//The various clock actions
void start();
void stop();
void pause();
void unpause();
//Gets the timer's time
int get_ticks();
//Checks the status of the timer
bool is_started();
bool is_paused();
};
SDL_Surface *load_image( std::string filename )
{
//The image that's loaded
SDL_Surface* loadedImage = NULL;
//The optimized surface that will be used
SDL_Surface* optimizedImage = NULL;
//Load the image
loadedImage = IMG_Load( filename.c_str() );
//If the image loaded
if( loadedImage != NULL )
{
//Create an optimized surface
optimizedImage = SDL_DisplayFormat( loadedImage );
//Free the old surface
SDL_FreeSurface( loadedImage );
//If the surface was optimized
if( optimizedImage != NULL )
{
//Color key surface
SDL_SetColorKey( optimizedImage, SDL_RLEACCEL | SDL_SRCCOLORKEY, SDL_MapRGB( optimizedImage->format, 0, 0, 0xFF ) );
}
}
//Return the optimized surface
return optimizedImage;
}
void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip = NULL )
{
//Holds offsets
SDL_Rect offset;
//Get offsets
offset.x = x;
offset.y = y;
//Blit
SDL_BlitSurface( source, clip, destination, &offset );
}
bool init()
{
//Initialize all SDL subsystems
if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
{
return false;
}
//Set up the screen
screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );
//If there was in error in setting up the screen
if( screen == NULL )
{
return false;
}
//Initialize SDL_ttf
if( TTF_Init() == -1 )
{
return false;
}
//Set the window caption
SDL_WM_SetCaption( "o's + x's", NULL );
//If everything initialized fine
return true;
}
bool load_files()
{
//Load the sprite sheet
space = load_image( "xox.png" );
background = load_image ( "background.png" );
board = load_image ( "board.png" );
//Open the font
font = TTF_OpenFont( "ballon.ttf", 50 );
//If there was a problem in loading the sprite
//if( foo == NULL )
//{
// return false;
// }
//If there was an error in loading the font
if( font == NULL )
{
return false;
}
//If everything loaded fine
return true;
}
void clean_up()
{
//Free the surface
SDL_FreeSurface( space );
SDL_FreeSurface (background);
SDL_FreeSurface (screen);
SDL_FreeSurface( message );
SDL_FreeSurface( board );
//Close the font that was used
TTF_CloseFont( font );
//Quit SDL_ttf
TTF_Quit();
//Quit SDL
SDL_Quit();
}
Timer::Timer()
{
//Initialize the variables
startTicks = 0;
pausedTicks = 0;
paused = false;
started = false;
}
void Timer::start()
{
//Start the timer
started = true;
//Unpause the timer
paused = false;
//Get the current clock time
startTicks = SDL_GetTicks();
}
void Timer::stop()
{
//Stop the timer
started = false;
//Unpause the timer
paused = false;
}
void Timer::pause()
{
//If the timer is running and isn't already paused
if( ( started == true ) && ( paused == false ) )
{
//Pause the timer
paused = true;
//Calculate the paused ticks
pausedTicks = SDL_GetTicks() - startTicks;
}
}
void Timer::unpause()
{
//If the timer is paused
if( paused == true )
{
//Unpause the timer
paused = false;
//Reset the starting ticks
startTicks = SDL_GetTicks() - pausedTicks;
//Reset the paused ticks
pausedTicks = 0;
}
}
int Timer::get_ticks()
{
//If the timer is running
if( started == true )
{
//If the timer is paused
if( paused == true )
{
//Return the number of ticks when the the timer was paused
return pausedTicks;
}
else
{
//Return the current time minus the start time
return SDL_GetTicks() - startTicks;
}
}
//If the timer isn't running
return 0;
}
bool Timer::is_started()
{
return started;
}
bool Timer::is_paused()
{
return paused;
}
int main( int argc, char* args[] )
{
//load background
//Quit flag
bool quit = false;
//Initialize
if( init() == false )
{
return 1;
}
//Load the files
if( load_files() == false )
{
return 1;
}
//Clip the sprite sheet
clip();
//The frame rate regulator
Timer fps;
//While the user hasn't quit
while( quit == false )
{
//Start the frame timer
fps.start();
//While there's events to handle
while( SDL_PollEvent( &event ) )
{
// //If the user has Xed out the window
if( event.type == SDL_QUIT )
{
// //Quit the program
quit = true;
}
}
//Fill the screen white
// SDL_FillRect( screen, &screen->clip_rect, SDL_MapRGB( screen->format, 0xFF, 0xFF, 0xFF ) );
//load background
//Render the text
// message = TTF_RenderText_Solid( font, word.str().c_str(), textColor );
//SDL_FreeSurface ( message);
//problem from here
int move;
int num_squares =9;
vector<char> board (num_squares, empty);
for( ;;)
{
instructions ();
char human = humanpiece();
char computer = opponent(human);
char turn = x;
displayboard (board);
board[0]= empty;
board[1]= empty;
board[2]= empty;
board[3]= empty;
board[4]= empty;
board[5]= empty;
board[6]= empty;
board[7]= empty;
board[8]= empty;
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);
// apply_surface(0,0,background,screen);
//apply_surface( (SCREEN_WIDTH - message->w ) / 2, 100, message, screen );
//system("pause");
if( SDL_Flip( screen ) == -1 )
{
return 1;
}
//Cap the frame rate
while( fps.get_ticks() < 1000 / FRAMES_PER_SECOND )
{
//wait...
}
//Clean up
clean_up();
return 0;
}}}
//instructions
void instructions ()
{
word <<"welcome to o's and x's";
SDL_Flip( screen );
}
// ask if wanna go first
char askyesno ()
{
char response;
while( SDL_PollEvent( &event ) )
{
if( event.type == SDLK_y)
{
response = 'y';
}
else if( event.type == SDLK_n)
{
response = 'n';
}
}
return response;
}
int asknumber ()
{
int high = 8;
int low = 0;
int number;
do
{
word<<"pick a number "<<"("<<low<<"-"<<high<<");";
while( SDL_PollEvent( &event ) )
{
if( event.type == SDLK_0)
{
number = 0;
}
else if( event.type == SDLK_1)
{
number = 1;
}
else if( event.type == SDLK_2)
{
number = 2;
}
else if( event.type == SDLK_3)
{
number = 3;
}
else if( event.type == SDLK_4)
{
number = 4;
}
else if( event.type == SDLK_5)
{
number = 5;
}
else if( event.type == SDLK_6)
{
number = 6;
}
else if( event.type == SDLK_7)
{
number = 7;
}
else if( event.type == SDLK_8)
{
number = 8;
}
else number = 9;
}
}
while (number > high || number < low);
return number;
}
char humanpiece ()
{
char go_first = askyesno ();
if (go_first == 'y')
{
word<<"\n then take the first move u will need it.\n";
return 'x';
}
else
{
word<<"\n your 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)
{
if (board[0] == 'x')
{apply_surface(0,0,space,screen,&pieces[0]);}
else if (board[0] == 'o')
{apply_surface(0,0,space,screen,&pieces[1]);}
else if (board[0] == ' ')
{apply_surface(0,0,space,screen,&pieces[2]);}
if (board[1] == 'x')
{apply_surface(50,0,space,screen,&pieces[0]);}
else if (board[1] == 'o')
{apply_surface(50,0,space,screen,&pieces[1]);}
else if (board[1] == ' ')
{apply_surface(50,0,space,screen,&pieces[2]);}
if (board[2] == 'x')
{apply_surface(100,0,space,screen,&pieces[0]);}
else if (board[2] == 'o')
{apply_surface(100,0,space,screen,&pieces[1]);}
else if (board[2] == ' ')
{apply_surface(100,0,space,screen,&pieces[2]);}
if (board[3] == 'x')
{apply_surface(0,50,space,screen,&pieces[0]);}
else if (board[3] == 'o')
{apply_surface(0,50,space,screen,&pieces[1]);}
else if (board[3] == ' ')
{apply_surface(0,50,space,screen,&pieces[2]);}
if (board[4] == 'x')
{apply_surface(50,50,space,screen,&pieces[0]);}
else if (board[4] == 'o')
{apply_surface(50,50,space,screen,&pieces[1]);}
else if (board[4] == ' ')
{apply_surface(50,50,space,screen,&pieces[2]);}
if (board[5] == 'x')
{apply_surface(100,50,space,screen,&pieces[0]);}
else if (board[5] == 'o')
{apply_surface(100,50,space,screen,&pieces[1]);}
else if (board[5] == ' ')
{apply_surface(100,50,space,screen,&pieces[2]);}
if (board[6] == 'x')
{apply_surface(0,100,space,screen,&pieces[0]);}
else if (board[6] == 'o')
{apply_surface(0,100,space,screen,&pieces[1]);}
else if (board[6] == ' ')
{apply_surface(0,100,space,screen,&pieces[2]);}
if (board[7] == 'x')
{apply_surface(50,100,space,screen,&pieces[0]);}
else if (board[7] == 'o')
{apply_surface(50,100,space,screen,&pieces[1]);}
else if (board[7] == ' ')
{apply_surface(50,100,space,screen,&pieces[2]);}
if (board[8] == 'x')
{apply_surface(100,100,space,screen,&pieces[0]);}
else if (board[8] == 'o')
{apply_surface(100,100,space,screen,&pieces[1]);}
else if (board[8] == ' ')
{apply_surface(100,100,space,screen,&pieces[2]);}
SDL_Flip(screen);
}
char winner (const vector<char>& board)
{
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;
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]];
}
}
if (count(board.begin(), board.end(), empty) == 0)
{return tie;}
return no_one;
}
bool islegal(int move, const vector<char>& board)
{
return(board[move] == empty);
}
int humanmove (vector<char>& board, char human)
{
int move = asknumber();
while (!islegal(move, board))
{
word<<"you cant move there\n";
move = asknumber();
}
word<<"fine...\n";
return move;
}
int computermove (vector<char> board, char computer)
{
word<<"i will take square number ";
for (int move = 0; move < board.size (); ++move)
{
if (islegal(move, board))
{
board[move] = computer;
if (winner(board) == computer)
{
cout<< move << endl;
return move;
}
board[move] = empty;
}
}
char human = opponent(computer);
for (int move = 0; move < board.size(); ++move)
{
if (islegal(move, board))
{
board[move] = human;
if (winner(board) == human)
{
word<< move << endl;
return move;
}
board[move] = empty;
}
}
const int best_move [] = {4, 0, 2, 6, 8, 1, 3, 5, 7};
for (int n = 0; n < board.size();)
{
int move = best_move[n];
if (!islegal(move, board))
{n++;
//cout<< move<< endl;
// return move;
}
else
{word<< move<< endl;
return move;
}
}
}
void announcewinner (char winner, char human, char computer)
{
if (winner == human)
{
word<<"ha ha ha i won";
}
else if (winner == computer)
{
word<<"nooooo!! how did you win";
}
else
{
word<<"we are evanly matched or you was lucky...";
}
}