0% found this document useful (0 votes)
72 views

Source Code

This document contains source code for a Tic-Tac-Toe game written in C++. It includes functions for initializing the game board, marking moves, printing the board, and checking for a victory. The code allows two players to connect - one will be the server and one the client. The server randomly selects which player starts and the players take turns making moves until someone wins or it's a tie. The players can optionally exchange names and either player can quit the game early.

Uploaded by

Akhmal Haziq
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
72 views

Source Code

This document contains source code for a Tic-Tac-Toe game written in C++. It includes functions for initializing the game board, marking moves, printing the board, and checking for a victory. The code allows two players to connect - one will be the server and one the client. The server randomly selects which player starts and the players take turns making moves until someone wins or it's a tie. The players can optionally exchange names and either player can quit the game early.

Uploaded by

Akhmal Haziq
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 13

SOURCE CODE

/*This is a program of Tic-Tac-toe Game


Group Members :
1. Ahmad Faris Bin Harun Iskandar ( Group Leader ) - SN093049
2. Muhamad Akhmal Haziq Bin Abd Halim -SN093931
3. Nur Ain Nadhihah Binti Mohd Yusoff -SN093155
4. Nur Aimi Najihah Binti Kamarrudin SN093052 */
#include
#include
#include
#include
#include

<stdio.h>
<winsock.h>
<iostream>
<cstdlib> //random
<ctime> //random

void initialise_array(char arr[3][3]);


void print_board(char [3][3]);
int check_victory(char [3][3]);
int playersini_move (char, char[3][3]);
int playersana_move (int, char, char[3][3]);
int mark_move(char, int, char [3][3]);
using namespace std;
#define BUFFER_SIZE 100
void InitWSA(void)
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(1, 1);
int nRc = WSAStartup(wVersionRequested, &wsaData);
if (nRc != 0)
{
fprintf(stderr, "Error when calling WSAStartup()\n");
exit(-1);
}

if (LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) {


fprintf(stderr, "Error: Version is not available\n");
exit(-1);
}

void main(void)
{
//Declaration
int sock, newsock, addrlen, status, first;
struct sockaddr_in server, sender;
char buffer[BUFFER_SIZE];
InitWSA();
//---------------------------------------------------------------------

//Create a socket
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1) {
printf("Error in socket(). Error code: %d\n", WSAGetLastError());
exit(-1);
}
//-------------------------------------------------------------------//Define
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
//Your're the server(S) or the client(C)? [Question no 1]
char cos;
cout << "Your're the server(S) or the client(C)?";
cin >> cos;
if (cos == 'S' || cos == 's')
{
//----------------------------------------------------------------------//If this is server, this section will activate.
//----------------------------------------------------------------------//Create port 9999 for server [Question no 2]
server.sin_port = htons(9999);
//Binding
status = bind(sock, (struct sockaddr *)&server, sizeof(struct sockaddr));
if (status == -1) {
printf("Error in bind(). Error code: %d\n", WSAGetLastError());
exit(-1);
}
//---------------------------------------------------------------------// Listening for connection
printf("Listening...\n");
status = listen(sock, 1); //only 1 can connect
if (status == -1) {
printf("Error in listen(). Error code: %d\n", WSAGetLastError());
exit(-1);
}
addrlen = sizeof(sender);
// Accepting incoming connection
newsock = accept(sock, (struct sockaddr *) &sender, &addrlen);
if (newsock == -1) {
printf("Error in accept(). Error code: %d\n", WSAGetLastError());
printf("Accepting next connection...\n\n");
}
printf("A connection from %s has been accepted\n", inet_ntoa(sender.sin_addr));

//---------------------------------------------------------------------mark no 4]

//Server will randomly choose who are going to move first [Question 4 and bonus
srand((unsigned)time(0));
first = (rand() % 2) + 1;
if (first == 1){
strcpy(buffer, "m1");
send(newsock, buffer, strlen(buffer), 0);
first = first - 1;
}
else{
strcpy(buffer, "m2");
send(newsock, buffer, strlen(buffer), 0);
first = first - 1;
}

//---------------------------------------------------------------------

else
{
//--------------------------------------------------------------------//If this is the client, then this section will activate
//--------------------------------------------------------------------//Create own port
server.sin_port = htons(7000);
//Binding
status = bind(sock, (struct sockaddr *)&server, sizeof(struct sockaddr));
if (status == -1) {
printf("Error in bind(). Error code: %d\n", WSAGetLastError());
exit(-1);
}
//--------------------------------------------------------------------//Asking server IP [Question no 3]
char ip[15];
cout << "Enter server IP address:";
cin >> ip;
cout << "Connecting to the server...\n";
//Define which Server to be connected
sender.sin_family = AF_INET;
sender.sin_port = htons(9999);
sender.sin_addr.s_addr = inet_addr(ip);
//Connecting....

status = connect(sock, (struct sockaddr *)&sender, sizeof(struct sockaddr));


newsock = sock;
printf("Connected\n");
if (status == -1) {
printf("Error in connect(). Error code: %d\n", WSAGetLastError());
exit(-1);
}
//Waiting for the server to choose who are going to move first.(Randomly)
[Continue bonus mark 4]
status = recv(sock, buffer, BUFFER_SIZE, 0);
buffer[status] = '\0';
if (strcmp("m1", buffer) == 0)
first = 1;
else
first = 0;
//---------------------------------------------------------------------}

//-------------------------------------------------------------------------//The game begin here....


//-------------------------------------------------------------------------cout << "-------------------------------------------\n";
cout << "----------------TicTacToe------------------\n";
cout << "-------------------------------------------\n";
int i, stat = 0, reply = 1;
char board[3][3];
do {
//Prepare the game
initialise_array(board);
print_board(board);
stat = 0;
//---------------------------------------------------//Exchange players name [Bonus mark 3]
char name[10];
cout << "Enter your name:" ;
cin >> name;
strcpy(buffer, name);
send(newsock, buffer, strlen(buffer), 0);
status = recv(newsock, buffer, BUFFER_SIZE, 0);
buffer[status] = '\0';
strcpy(name, buffer);

cout << "Your opponent:" << name;


//---------------------------------------------------cout << "\nServer randomly choose who will move first.";
//The game begin!
for (i = first; i < 9; i++) {
if (i % 2 == 0) //This side move
{
cout << "\nIt is your turn.\n";
int x = playersini_move('x', board);
if (x == 1)
strcpy(buffer, "a1");
else if (x == 2)
strcpy(buffer, "a2");
else if (x == 3)
strcpy(buffer, "a3");
else if (x == 4)
strcpy(buffer, "a4");
else if (x == 5)
strcpy(buffer, "a5");
else if (x == 6)
strcpy(buffer, "a6");
else if (x == 7)
strcpy(buffer, "a7");
else if (x == 8)
strcpy(buffer, "a8");
else if (x == 9)
strcpy(buffer, "a9");
else if (x == -1) //if the user want to quit [Bonus mark 1]
{
strcpy(buffer, "qq");
send(newsock, buffer, strlen(buffer), 0);
break;
}
send(newsock, buffer, strlen(buffer), 0);
print_board(board);
stat = check_victory(board);
if (stat == 1) {
cout << "Congratulation!! You win!\n";
break;
}
}
//Other side move
else
{
cout << endl << name << " turn.\n";
//receive data from other side
status = recv(newsock, buffer, BUFFER_SIZE, 0);
buffer[status] = '\0';

//compare and convert


if (strcmp("a1", buffer) == 0)
playersana_move(1, 'o', board);
else if (strcmp("a2", buffer) == 0)
playersana_move(2, 'o', board);
else if (strcmp("a3", buffer) == 0)
playersana_move(3, 'o', board);
else if (strcmp("a4", buffer) == 0)
playersana_move(4, 'o', board);
else if (strcmp("a5", buffer) == 0)
playersana_move(5, 'o', board);
else if (strcmp("a6", buffer) == 0)
playersana_move(6, 'o', board);
else if (strcmp("a7", buffer) == 0)
playersana_move(7, 'o', board);
else if (strcmp("a8", buffer) == 0)
playersana_move(8, 'o', board);
else if (strcmp("a9", buffer) == 0)
playersana_move(9, 'o', board);
else if (strcmp("qq", buffer) == 0)//if the user want to quit
[Continue bonus mark 1]

{
cout << name << " quit.";
break;
}
print_board(board);
stat = check_victory(board);
if (stat == 1) {
cout << "\nYou Lose!\n";
break;
}

}
}//End for loop.
//If not win, then the game is tie [Question no 5]
if (stat != 1)
cout << "\nThe game is tie.\n";
//Play again? [Question 6]
cout << "Play again? (1 to play, 0 to stop): ";
cin >> reply;

} while (reply == 1);


closesocket(newsock); //if no, the socket will close [continue question 6]

//----------------Tictactoe function-----------------//----------------------------------------------------

// This function initializes the tic-tac-toe game board by putting the number 1 to 9 on each
square.
void initialise_array(char arr[3][3])
{
int i, j, k = 49;

for ( i = 0; i < 3; i++) {


for (j = 0; j < 3; j++) {
arr[i][j] = k;
k++;
}
}

// This function takes the move entered by user and put the user's mark on the selected spot.
// If the move is not valid, this function returns a 0. Otherwise, it returns a 1.
int mark_move(char y, int move, char array[3][3])
{
if (move == 1) {
if (array[0][0] == 'x' || array[0][0] == 'o') return 0;
array[0][0] = y;
return 1;
}
else if (move == 2) {
if (array[0][1] == 'x' || array[0][1] == 'o') return 0;
array[0][1] = y;
return 1;
}
else if (move == 3) {
if (array[0][2] == 'x' || array[0][2] == 'o') return 0;
array[0][2] = y;
return 1;
}
else if (move == 4) {
if (array[1][0] == 'x' || array[1][0] == 'o') return 0;
array[1][0] = y;
return 1;
}
else if(move == 5) {
if (array[1][1] == 'x' || array[1][1] == 'o') return 0;
array[1][1] = y;
return 1;
}
else if (move == 6) {
if (array[1][2] == 'x' || array[1][2] == 'o') return 0;
array[1][2] = y;
return 1;
}

else if (move == 7) {
if (array[2][0] == 'x' || array[2][0] == 'o') return 0;
array[2][0] = y;
return 1;
}
else if (move == 8) {
if (array[2][1] == 'x' || array[2][1] == 'o') return 0;
array[2][1] = y;
return 1;
}
else if (move == 9) {
if (array[2][2] == 'x' || array[2][2] == 'o') return 0;
array[2][2] = y;
return 1;
}
else if (move == -1) {
return 1;
}
}

else return 0;

// This function will ask the user to enter his/her move.


// The function will loop until the user enters a valid move.
// This function returns the move entered by the user.
int playersini_move (char y, char array[3][3])
{
int reply, flag = 0;
do{
quit)\n";

cout << "\nPlease enter the number of the space( 1 to 9) you wish to mark.(-1 to
cout << "Your move ==> ";
cin >> reply;
flag = mark_move(y, reply, array);
if (flag == 0) {
cout << "Invalid move. Please try again.\n";
}

}while(flag == 0);
return reply;
}
int playersana_move (int m, char y, char array[3][3])
{
int reply, flag = 0;
do{
reply = m;
flag = mark_move(y, reply, array);

}while(flag == 0);
return reply;
}
// This function prints the tic-tac-toe board
void print_board(char array[3][3])
{
int i,j;
cout << endl;
for(i = 0; i < 3;i++) {
for(j = 0; j < 3; j++) {

cout << array[i][j] << " ";


}
cout << endl;

}
// Thus function checks whether there is any 3-in-a-row squares that have the same mark. If there
is, then somebody wins.
// The function returns a 1 if a winner is found. Otherwise it returns 0.
int check_victory(char array[3][3])
{
int status; //status = 1 means win
if (array[0][0] == array[0][1] && array[0][1] == array[0][2])
status = 1;
else if (array[1][0] == array[1][1] && array[1][1] == array[1][2])
status = 1;
else if (array[2][0] == array[2][1] && array[2][1] == array[2][2])
status = 1;
else if (array[0][0] == array[1][0] && array[1][0] == array[2][0])
status = 1;
else if (array[0][1] == array[1][1] && array[1][1] == array[2][1])
status = 1;
else if (array[0][2] == array[1][2] && array[1][2] == array[2][2])
status = 1;
else if (array[0][0] == array[1][1] && array[1][1] == array[2][2])
status = 1;
else if (array[2][0] == array[1][1] && array[1][1] == array[0][2])
status = 1;
else status = 0;
return status;
}

Screenshots of Client

ScreenshotS of Server

You might also like