Search…

Game TicTacToe với C++ Console

21/06/20226 min read
Game TicTacToe là game chơi trên bàn cờ có 9 ô - 3x3. Hai người chơi lần lượt sử dụng kí hiệu X - O để đánh dấu vị trí của người chơi đó vào các ô trên bàn cờ. Người thắng cuộc là người tạo ra được một hàng ngang - dọc - chéo gồm 3 ký tự giống nhau

Chuẩn bị

  • Visual Studio 2019.
  • Loại project: console C++.
  • Ngôn ngữ lập trình: C++.

Thành phẩm

Code đầy đủ

#include <iostream>
using namespace std;

#define SIZE 3
char board[SIZE][SIZE] = { {' ', ' ', ' '}, {' ', ' ', ' '}, {' ', ' ', ' '} };
int player = 1;
bool isGameOver = false;
bool isTie = false;

void printBoard()
{
	cout << "-------------" << endl;
	for (unsigned int i = 0; i < SIZE; i++)
	{
		for (unsigned int j = 0; j < SIZE; j++)
		{
			cout << "| " << board[i][j] << " ";
		}
		cout << "|" << endl;
		cout << "-------------" << endl;
	}
}

void update()
{
	char mark;
	player = (player % 2) ? 1 : 2;
	mark = (player == 1) ? 'X' : 'O';

	int x, y;
	do 
	{
		cout << "Player " << player << ", please input position you choice: ";
		cin >> x >> y;
	} while (x > 2 || y > 2 || board[x][y] != ' ');
	
	if (board[x][y] == ' ')
		board[x][y] = mark;
	player++;
}

bool checkBoard()
{
	if (board[0][0] != ' ' && board[0][0] == board[0][1] && board[0][1] == board[0][2])
		return true;
	else if (board[1][0] != ' ' && board[1][0] == board[1][1] && board[1][1] == board[1][2])
		return true;
	else if (board[2][0] != ' ' && board[2][0] == board[2][1] && board[2][1] == board[2][2])
		return true;
	else if (board[0][0] != ' ' && board[0][0] == board[1][0] && board[1][0] == board[2][0])
		return true;
	else if (board[0][1] != ' ' && board[0][1] == board[1][1] && board[1][1] == board[2][1])
		return true;
	else if (board[0][2] != ' ' && board[0][2] == board[1][2] && board[1][2] == board[2][2])
		return true;
	else if (board[0][0] != ' ' && board[0][0] == board[1][1] && board[1][1] == board[2][2])
		return true;
	else if (board[0][2] != ' ' && board[0][2] == board[1][1] && board[1][1] == board[2][0])
		return true;
	else if (board[0][0] != ' ' && board[0][1] != ' ' && board[0][2] != ' ' &&
		board[1][0] != ' ' && board[1][1] != ' ' && board[1][2] != ' ' &&
		board[2][0] != ' ' && board[2][1] != ' ' && board[2][2] != ' ')
	{
		isTie = true;
		return true;
	}
	return false;
}

int main()
{
	cout << "\tGAME TICTACTOE C++" << endl;
	cout << "PLAYER 1 - [X] \t PLAYER 2 = [O]\n" << endl;

	while (!isGameOver)
	{
		update();
		printBoard();
		isGameOver = checkBoard();

		if (isGameOver)
		{
			if (isTie)
				cout << "-----Both players are tie-----";
			else
				cout << "-----Player " << -- player << " is winner-----" << endl;
		}
	}
}

Giải thích

#include <iostream>
using namespace std;

Khai báo thư viện nhập - xuất trên cửa sổ Console 

#define SIZE 3
char board[SIZE][SIZE] = { {' ', ' ', ' '}, {' ', ' ', ' '}, {' ', ' ', ' '} };
int player = 1;
bool isGameOver = false;
bool isTie = false;

Khai báo bàn cờ với kích thước 3x3, và các biến liên quan đến game

void printBoard()
{
	cout << "-------------" << endl;
	for (unsigned int i = 0; i < SIZE; i++)
	{
		for (unsigned int j = 0; j < SIZE; j++)
		{
			cout << "| " << board[i][j] << " ";
		}
		cout << "|" << endl;
		cout << "-------------" << endl;
	}
}

Hàm printBoard() dùng để in bàn cờ ra cửa sổ Console của game

void update()
{
	char mark;
	player = (player % 2) ? 1 : 2;
	mark = (player == 1) ? 'X' : 'O';

	int x, y;
	do 
	{
		cout << "Player " << player << ", please input position you choice: ";
		cin >> x >> y;
	} while (x > 2 || y > 2 || board[x][y] != ' ');
	
	if (board[x][y] == ' ')
		board[x][y] = mark;
	player++;
}

Hàm update() dùng để cập nhật thông tin thứ tự người chơi, cập nhật vị trí người chơi đã đi trên bàn cờ. 

Đoạn code do-while dùng để kiểm tra xem người chơi có nhập vị trí ngoài khu vực bàn cờ hay nhập trùng vị trí đã đi rồi trên bàn cờ hay ko, nếu có thì người chơi phải nhập lại vị trí

bool checkBoard()
{
	if (board[0][0] != ' ' && board[0][0] == board[0][1] && board[0][1] == board[0][2])
		return true; // Kiểm tra hàng ngang thứ 1 trên bàn cờ
	else if (board[1][0] != ' ' && board[1][0] == board[1][1] && board[1][1] == board[1][2])
		return true ;// Kiểm tra hàng ngang thứ 2 trên bàn cờ
	else if (board[2][0] != ' ' && board[2][0] == board[2][1] && board[2][1] == board[2][2])
		return true; // Kiểm tra hàng ngang thứ 3 trên bàn cờ
	else if (board[0][0] != ' ' && board[0][0] == board[1][0] && board[1][0] == board[2][0])
		return true; // Kiểm tra hàng dọc thứ 1 trên bàn cờ
	else if (board[0][1] != ' ' && board[0][1] == board[1][1] && board[1][1] == board[2][1])
		return true; // Kiểm tra hàng dọc thứ 2 trên bàn cờ
	else if (board[0][2] != ' ' && board[0][2] == board[1][2] && board[1][2] == board[2][2])
		return true; // Kiểm tra hàng dọc thứ 3 trên bàn cờ
	else if (board[0][0] != ' ' && board[0][0] == board[1][1] && board[1][1] == board[2][2])
		return true; // Kiểm tra hàng chéo thứ 1 trên bàn cờ
	else if (board[0][2] != ' ' && board[0][2] == board[1][1] && board[1][1] == board[2][0])
		return true; // Kiểm tra hàng chéo thứ 2 trên bàn cờ
	else if (board[0][0] != ' ' && board[0][1] != ' ' && board[0][2] != ' ' &&
		board[1][0] != ' ' && board[1][1] != ' ' && board[1][2] != ' ' &&
		board[2][0] != ' ' && board[2][1] != ' ' && board[2][2] != ' ')
		{ // Trường hợp hai người chơi hòa nhau
			isTie = true;
			return true;
		}
	return false;
}

Hàm checkBoard() dùng để kiểm tra xem có trường hợp nào thắng cuộc hay không. Hàm được gọi sau khi bất kỳ người chơi nào nhập vị trí muốn đi vào bàn cờ.

int main()
{
	cout << "\tGAME TICTACTOE C++" << endl;
	cout << "PLAYER 1 - [X] \t PLAYER 2 = [O]\n" << endl;

	while (!isGameOver)
	{
		update();
		printBoard();
		isGameOver = checkBoard();

		if (isGameOver)
		{
			if (isTie)
				cout << "-----Both players are tie-----";
			else
				cout << "-----Player " << -- player << " is winner-----" << endl;
		}
	}
	return 0;
}

Hàm này là hàm chính của chương trình. Đoạn code trong vòng lặp while sẽ được lặp cho tới khi trò chơi kết thúc tìm ra kết quả hòa hoặc người chơi thắng cuộc.

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024