Tạo trò chơi Tic-Tac-Toe trong C++

Tao Tro Choi Tic Tac Toe Trong C



Tic-tac-toe là một trò chơi thú vị, cổ điển và thú vị đã làm hài lòng nhiều thế hệ. Trong trò chơi tic-tac-toe, hai người chơi cạnh tranh trên một lưới 9 ô vuông được đánh dấu bằng mẫu băm. Mỗi người chơi lần lượt đặt biểu tượng (O hoặc X) vào một trong các ô trống. Trong bài viết này, chúng ta sẽ khám phá cách tạo trò chơi tic-tac-toe bằng ngôn ngữ lập trình C++. Ví dụ sau đây sẽ hướng dẫn bạn xây dựng một trò chơi tic-tac-toe đơn giản nhưng hấp dẫn, bao gồm các khái niệm thiết yếu, phân tích mã và những cân nhắc để tạo trải nghiệm chơi trò chơi tương tác.

Tạo trò chơi Tic-Tac-Toe trong C++

Ví dụ sau đây cung cấp thông tin cơ bản về cách tạo trò chơi tic-tac-toe tương tác dành cho hai người chơi này. Nó giới thiệu một cách tiếp cận đơn giản và dễ dàng để lập trình bằng C++ và cung cấp mã nguồn được ghi chép đầy đủ để hồi tưởng lại những thử thách thời thơ ấu đó với bạn bè ở định dạng kỹ thuật số mới. Chúng ta hãy xem đoạn mã sau.

Ví dụ: Tic-Tac-Toe cơ bản dựa trên bảng điều khiển mà không cần sử dụng mảng 2D

Trong ví dụ này, chúng ta sẽ sử dụng mảng 2D, các hàm và điều kiện if-else để tạo trò chơi tic-tac-toe trong C++. Trong trò chơi này, hai người chơi được phép thay phiên nhau nhập nước đi của mình và nó sẽ xác định trạng thái trò chơi bằng cách kiểm tra xem người chiến thắng hay hòa. Xem đoạn mã đã cho sau:







#include

sử dụng không gian tên std ;

trống rỗng bảng vẽ ( ký tự Cái bảng [ 3 ] [ 3 ] ) ;

bool isMoveValid ( ký tự Cái bảng [ 3 ] [ 3 ] , int hàng ngang , int col ) ;

bool isBoardFull ( ký tự Cái bảng [ 3 ] [ 3 ] ) ;

ký tự kiểm traNgười chiến thắng ( ký tự Cái bảng [ 3 ] [ 3 ] ) ;

int chủ yếu ( ) {

ký tự Cái bảng [ 3 ] [ 3 ] = { { '' , '' , '' } , { '' , '' , '' } , { '' , '' , '' } } ;

int hàng ngang , col ;

ký tự người chơi hiện tại = 'X' ;

trong khi ( ĐÚNG VẬY ) {

bảng vẽ ( Cái bảng ) ;

cout << 'Người chơi ' << người chơi hiện tại << 'đến lượt. Nhập hàng (1-3) và cột (1-3): ' ;

Ăn >> hàng ngang >> col ;

hàng ngang --;

col --;

nếu như ( isMoveValid ( Cái bảng , hàng ngang , col ) ) {

Cái bảng [ hàng ngang ] [ col ] = người chơi hiện tại ;

ký tự người chiến thắng = kiểm traNgười chiến thắng ( Cái bảng ) ;

nếu như ( người chiến thắng != '' ) {

bảng vẽ ( Cái bảng ) ;

cout << 'Người chơi ' << người chiến thắng << 'là người chiến thắng! \N ' ;

phá vỡ ;

}

nếu như ( isBoardĐầy đủ ( Cái bảng ) ) {

bảng vẽ ( Cái bảng ) ;

cout << 'Đó là một chiếc cà vạt! \N ' ;

phá vỡ ;

}

người chơi hiện tại = ( người chơi hiện tại == 'X' ) ? 'Ồ' : 'X' ;

} khác {

cout << 'Di chuyển không hợp lệ. Hãy chọn ô khác. \N ' ;

} }

trở lại 0 ;

}

trống rỗng bảng vẽ ( ký tự Cái bảng [ 3 ] [ 3 ] ) {

cout << 'b| \t 1 \t | \t 2 \t | \t 3 \t | \N ' ;

cout << ' ______________________ \N ' ;

( int tôi = 0 ; tôi < 3 ; tôi ++ ) {

cout << tôi + 1 << '| ' ;

( int t = 0 ; t < 3 ; t ++ ) {

cout << '' << Cái bảng [ tôi ] [ t ] ;

nếu như ( t < 2 ) cout << ' \t | \t ' ;

}

cout << ' \t | \N ' ;

nếu như ( tôi < 2 ) cout << ' ______________________ \N ' ;

}

cout << ' \N ' ; }

bool isMoveValid ( ký tự Cái bảng [ 3 ] [ 3 ] , int hàng ngang , int col ) {

trở lại ( hàng ngang >= 0 && hàng ngang < 3 && col >= 0 && col < 3 && Cái bảng [ hàng ngang ] [ col ] == '' ) ;

}

bool isBoardFull ( ký tự Cái bảng [ 3 ] [ 3 ] ) {

( int tôi = 0 ; tôi < 3 ; tôi ++ ) {

( int t = 0 ; t < 3 ; t ++ ) {

nếu như ( Cái bảng [ tôi ] [ t ] == '' ) {

trở lại SAI ;

} } }

trở lại ĐÚNG VẬY ; }

ký tự kiểm traNgười chiến thắng ( ký tự Cái bảng [ 3 ] [ 3 ] ) {

( int tôi = 0 ; tôi < 3 ; tôi ++ ) {

nếu như ( Cái bảng [ tôi ] [ 0 ] == Cái bảng [ tôi ] [ 1 ] && Cái bảng [ tôi ] [ 1 ] == Cái bảng [ tôi ] [ 2 ] && Cái bảng [ tôi ] [ 0 ] != '' ) {

trở lại Cái bảng [ tôi ] [ 0 ] ;

}

nếu như ( Cái bảng [ 0 ] [ tôi ] == Cái bảng [ 1 ] [ tôi ] && Cái bảng [ 1 ] [ tôi ] == Cái bảng [ 2 ] [ tôi ] && Cái bảng [ 0 ] [ tôi ] != '' ) {

trở lại Cái bảng [ 0 ] [ tôi ] ;

} }

nếu như ( Cái bảng [ 0 ] [ 0 ] == Cái bảng [ 1 ] [ 1 ] && Cái bảng [ 1 ] [ 1 ] == Cái bảng [ 2 ] [ 2 ] && Cái bảng [ 0 ] [ 0 ] != '' ) {

trở lại Cái bảng [ 0 ] [ 0 ] ;

}

nếu như ( Cái bảng [ 0 ] [ 2 ] == Cái bảng [ 1 ] [ 1 ] && Cái bảng [ 1 ] [ 1 ] == Cái bảng [ 2 ] [ 0 ] && Cái bảng [ 0 ] [ 2 ] != '' ) {

trở lại Cái bảng [ 0 ] [ 2 ] ;

}

trở lại '' ;

}

Đây là bảng phân tích chức năng của nó:



“#include ” là một lệnh tiền xử lý bao gồm thư viện luồng I/O cho các hoạt động đầu vào/đầu ra. Việc sử dụng “không gian tên std” cho phép sử dụng trực tiếp các hàm cout, cin, v.v. trong chương trình C++ mà không yêu cầu tiền tố “std::”.



Có bốn nguyên mẫu hàm trong chương trình này – chúng là drawBoard(), isMoveValid(), isBoardFull() và checkWinner(). Việc khai báo hàm được gọi là nguyên mẫu hàm. Mặc dù nó xuất hiện sau chức năng chính trong chương trình nhưng nó sẽ được sử dụng. Chức năng chính chứa vòng lặp trò chơi và logic để quản lý lượt và nước đi của người chơi. Trong chức năng chính, bảng trò chơi được khởi tạo bằng dấu cách.





ký tự Cái bảng [ 3 ] [ 3 ] = { { '' , '' , '' } , { '' , '' , '' } , { '' , '' , '' } } ;

Sau đó, hai biến row và col được xác định để lưu trữ đầu vào nước đi của người chơi. “char currentPlayer = ‘X’;” xác định rằng người chơi “X” đi đầu tiên.

Bây giờ, vòng lặp trò chơi while (true) bắt đầu và nó diễn ra cho đến khi có người chiến thắng hoặc hòa. Vòng lặp “while” này gọi “drawBoard();” để hiển thị bảng. Sau khi hiển thị bảng trên bảng điều khiển, người dùng được yêu cầu chọn một ô để đánh dấu trong câu lệnh mã sau:



cout << 'Người chơi ' << người chơi hiện tại << 'đến lượt. Nhập hàng và cột (1-3): ' ;

Người chơi nhập nước đi của mình vào “cin >> row >> col;”.

Khi chọn một ô để đánh dấu, trước tiên chương trình sẽ xác minh tính hợp lệ của dữ liệu đầu vào, đảm bảo rằng ô đó chưa được điền bằng cách gọi hàm isMoveValid().

Cái bảng [ hàng ngang ] [ col ] = người chơi hiện tại ;

Tuyên bố này đặt dấu của người chơi lên bảng.

ký tự người chiến thắng = kiểm traNgười chiến thắng ( Cái bảng ) ;

nếu như ( người chiến thắng != '' ) {

bảng vẽ ( Cái bảng ) ;

cout << 'Người chơi ' << người chiến thắng << 'thắng! \N ' ;

Những câu lệnh này kiểm tra người chiến thắng mỗi khi người chơi đánh dấu một mục trên bảng. Tên người chiến thắng sẽ được công bố nếu có người chiến thắng và chương trình sẽ thoát khỏi vòng lặp trò chơi.

nếu như ( isBoardĐầy đủ ( Cái bảng ) ) {

Tuyên bố này kiểm tra sự hòa hợp. Tình trạng hòa xảy ra trong trường hợp bàn cờ đầy người và không có người thắng cuộc. Trong trường hợp này, “Đó là một trận hòa!” được in trên màn hình.

người chơi hiện tại = ( người chơi hiện tại == 'X' ) ? 'Ồ' : 'X' ;

Tuyên bố này chuyển đổi người chơi để cho mọi người chơi có cơ hội chơi lượt của mình.

cout << 'Di chuyển không hợp lệ. Hãy chọn ô khác. \N ' ;

Nếu việc di chuyển không hợp lệ, người dùng sẽ được nhắc nhập lại và chọn bất kỳ ô nào khác.

Sau hàm “main”, việc định nghĩa hàm cho nguyên mẫu hàm được khai báo trước đó sẽ bắt đầu. Hàm đầu tiên được xác định ở đây là drawBoard() được sử dụng để vẽ bảng tic-tac-toe vào bảng điều khiển. Hàm drawBoard() in ra trạng thái hiện tại của bảng, bao gồm cả các đường lưới.

Hàm tiếp theo được xác định ở đây là isMoveValid(). Hàm này được sử dụng để xác định xem có được phép di chuyển cả bên trong bảng và trên ô trống hay không. Hàm isBoardFull() được sử dụng để kiểm tra xem bảng đã đầy chưa. Đây là điều kiện cho tình huống hòa khi không có người thắng cuộc. IsBoardFull() kiểm tra xem tất cả các vị trí trên bảng đã được lấp đầy hay chưa, điều này cho thấy tỷ số hòa nếu không có người chiến thắng. Nếu có người chiến thắng, có thể xác định chắc chắn bằng hàm checkWinner(). checkWinner() kiểm tra tất cả các dòng chiến thắng tiềm năng để tìm dấu hiệu của cùng một người chơi (“X” hoặc “O”) và trả về dấu hiệu của người chơi chiến thắng nếu tìm thấy hoặc ký tự khoảng trắng “ “ nếu chưa có người chiến thắng. Sau đây là đầu ra của chương trình. Nó hiển thị mọi lượt chơi của mỗi người chơi.

Đầu tiên, bảng rõ ràng; người chơi “X” được nhắc chọn ô cần đánh dấu. Ở đây, người chơi “X” nhập số 2 và số 2. Các ô của hàng 2 và cột 2 được đánh dấu. Tham khảo bảng được đánh dấu sau đây:

Bây giờ đến lượt người chơi O. Người chơi được nhắc chọn một ô để đánh dấu. Người chơi “O” chọn 1 cho hàng và 1 cho cột. Ô đã chọn được đánh dấu cho người chơi “O” như được hiển thị trong đoạn mã đầu ra sau:

Tất cả các lượt của mỗi người chơi sẽ theo cùng một khuôn mẫu. Đến lượt người chơi X, người chơi chọn 1 cho hàng và 2 cho cột. Tham khảo ảnh chụp nhanh đầu ra được cung cấp sau đây:

Bây giờ đến lượt người chơi “O”. Người chơi chọn 1 cho hàng và 3 cho cột.

Lượt tiếp theo lại thuộc về người chơi “X”. Người chơi chọn 3 cho hàng và 1 cho cột.

Người chơi “O” chọn 3 cho hàng và 2 cho cột.

Người chơi “X” chọn hàng thứ hai và cột thứ ba.

Người chơi “O” bây giờ chọn hàng thứ hai và cột đầu tiên.

Người chơi “X” lần này chọn hàng thứ ba và cột thứ ba.

Không người chơi nào có thể tạo bất kỳ đường nào theo chiều ngang, chiều dọc hoặc đường chéo, vì vậy đó là một đường hòa. Không có người chiến thắng cho mảng đầu vào đã chọn.

Nhìn chung, mã này bao gồm một vòng lặp trò chơi chính chịu trách nhiệm xử lý trạng thái trò chơi và thông tin đầu vào của người dùng, cùng với một số chức năng tiện ích được sử dụng để vẽ bàn cờ, xác thực các nước đi, kiểm tra một bàn đầy đủ và xác định xem có người chiến thắng hay không. .

Phần kết luận

Phát triển trò chơi tic-tac-toe bằng C++ là một bài tập thực tế tuyệt vời để củng cố kỹ năng lập trình của bạn. Bài viết giải thích chính xác cách tạo tic-tac-toe trong C++. Hướng dẫn từng bước được cung cấp trong bài viết này bao gồm mảng 2D, các hàm và các điều kiện if-else để người đọc hiểu cơ chế trò chơi, tương tác của người dùng và cấu trúc mã hiệu quả. Hướng dẫn chi tiết về mã và giải thích các chức năng quan trọng đối với lối chơi cốt lõi sẽ trang bị cho người đọc những hiểu biết vô giá về cả thực tiễn lập trình C++ cũng như sự phức tạp của quá trình phát triển trò chơi đơn giản.