Leçon 3

Phát triển trò chơi TicTacToe trên Tezos

Thế giới trò chơi blockchain đang có rất nhiều cơ hội dành cho các nhà phát triển. Nó cung cấp một cách độc đáo và sáng tạo để tích hợp các cơ chế phi tập trung và minh bạch vào trò chơi. Bằng cách phát triển trò chơi trên blockchain, chúng tôi có thể kết hợp các tính năng như giao dịch an toàn và minh bạch, quyền sở hữu tài sản trong trò chơi, v.v. Trong bài học này, chúng ta sẽ bước vào trò chơi blockchain bằng cách phát triển trò chơi cổ điển TicTacToe trên chuỗi khối Tezos. Mục đích của chúng tôi với bài học này là tìm hiểu động lực của logic trò chơi và quản lý trạng thái trong trò chơi dựa trên blockchain.

Hãy bắt đầu bằng cách khám phá hợp đồng của chúng tôi đối với trò chơi TicTacToe:

Cấu trúc hợp đồng

Python 
 #TicTacToe - Ví dụ chỉ mang tính chất minh họa.

import smartpy as sp 


 @sp.module 
 def main(): 
 class TicTacToe(sp.Contract): 
 def __init__(self): 
 self.data.nbMoves = 0 
 self.data.winner = 0 
 self.data.draw = Sai 
 self.data.deck = { 
 0: {0: 0, 1: 0, 2: 0}, 
 1: {0: 0, 1: 0, 2: 0}, 
 2: {0: 0, 1: 0, 2: 0}, 
 } 
 self.data.nextPlayer = 1 

 @ sp.entrypoint 
 def play(self, params): 
 khẳng định self.data.winner == 0 và không phải self.data.draw 
 khẳng định params.i >= 0 và params.i < 3 
 khẳng định params.j >= 0 và params.j < 3 
 khẳng định params.move == self.data.nextPlayer 
 khẳng định self.data.deck[params.i][params.j] == 0 
 self.data.deck[params.i][params.j] = params.move 
 self.data.nbMoves += 1 
 self.data.nextPlayer = 3 - self.data.nextPlayer 
 self.data.winner = self.checkLine(
                sp.record(winner=self.data.winner, line=self.data.deck[params.i])
            ) 
 self.data.winner = self.checkLine(
                sp.record( 
 người chiến thắng=self.data.winner,
                    line={
                        0: self.data.deck[0][params.j],
                        1: self.data.deck[1][params.j],
                        2: self.data.deck[2][params.j],
                    }, 
 ) 
 ) 
 self.data.winner = self.checkLine(
                sp.record( 
 người chiến thắng=self.data.winner,
                    line={
                        0: self.data.deck[0][0],
                        1: self.data.deck[1][1],
                        2: self.data.deck[2][2],
                    }, 
 ) 
 ) 
 self.data.winner = self.checkLine(
                sp.record( 
 người chiến thắng=self.data.winner,
                    line={
                        0: self.data.deck[0][2],
                        1: self.data.deck[1][1],
                        2: self.data.deck[2][0],
                    }, 
 ) 
 ) 
 if self.data.nbMoves == 9 và self.data.winner == 0: 
 self.data.draw = True 

 @sp.private() 
 def checkLine(self , người chiến thắng, dòng): 
 Winner_ = Winner 
 if line[0] != 0 và line[0] == line[1] và line[0] == line[2]: 
 Winner_ = line[0] 
 return Winner_ 

 # Thêm chức năng đặt lại trò chơi 
 @sp.entrypoint 
 def confirm_and_reset(self): 
 khẳng định self.data.winner != 0 hoặc self.data.draw 
 self.__init__()

# Kiểm tra 
 nếu "templates" không có trong __name__: 

 @sp.add_test(name="TicTacToe") 
 def test(): 
 script = sp.test_scenario(main)
        script.h1("Tic-Tac-Toe")
        # xác định một hợp đồng 
 c1 = main.TicTacToe() 

 # hiển thị cách trình bày của nó 
 kịch bản.h2("A chuỗi tương tác với người chiến thắng") 
 kịch bản += c1 
 script.h2("Tin nhắn thực thi") 
 kịch bản.h3("A nước đi đầu tiên ở giữa") 
 c1.play(i=1, j=1, move=1) 
 script.h3("A nước đi bị cấm") 
 c1.play(i=1, j=1, move=2).run(valid=False)
        kịch bản.h3("A nước đi thứ hai") 
 c1.play(i=1, j=2, move=2) 
 script.h3("Khác di chuyển") 
 c1.play(i=2, j=1, move=1) 
 c1.play(i=2, j=2, move=2) 
 script.verify(c1.data.winner == 0 ) 
 c1.play(i=0, j=1, move=1) 
 script.verify(c1.data.winner == 1) 
 script.p("Player1 đã thắng") 
 c1.play(i=0, j=0, move=2).run(valid=False)

        c2 = main.TicTacToe() 
 kịch bản.h2("A trình tự tương tác với kết quả hòa") 
 kịch bản += c2 
 script.h2("Tin nhắn thực thi") 
 kịch bản.h3("A nước đi đầu tiên ở giữa") 
 c2.play(i=1, j=1, move=1) 
 script.h3("A nước đi bị cấm") 
 c2.play(i=1, j=1, move=2).run(valid=False)
        kịch bản.h3("A nước đi thứ hai") 
 c2.play(i=1, j=2, move=2) 
 script.h3("Khác di chuyển") 
 c2.play(i=2, j=1, move=1) 
 c2.play(i=2, j=2, move=2) 
 c2.play(i=0, j=0, move=1) 
 c2.play(i=0, j=1, move=2) 
 c2.play(i=0, j=2, move=1) 
 c2.play(i=2, j=0 , move=2) 
 c2.play(i=1, j=0, move=1) 

 # Thêm bài kiểm tra để thiết lập lại trò chơi 
 script.h2("Thử nghiệm thiết lập lại trò chơi") 
 kịch bản.p("Người chiến thắng hoặc rút thăm đã được xác nhận, hiện đang đặt lại trò chơi") 
 c1.confirm_and_reset() 
 script.verify(c1.data.nbMoves == 0) 
 script.verify(c1.data.winner == 0) 
 script.verify(not c1.data.draw)

        c2.confirm_and_reset() 
 kịch bản.verify(c2.data.nbMoves == 0) 
 kịch bản.verify(c2.data.winner == 0) 
 kịch bản.verify(không c2.data.draw)

Hợp đồng cho trò chơi TicTacToe của chúng tôi trên Tezos được viết bằng ngôn ngữ SmartPy. Nó bao gồm hai phần chính: trạng thái của hợp đồng và logic của trò chơi.

Trạng thái của hợp đồng

Trạng thái của hợp đồng được khởi tạo trong hàm **init . Nó bao gồm:

  • nbMoves: Đây là bộ đếm số nước đi được thực hiện trong trò chơi. Nó bắt đầu từ số không.
  • winner: Điều này theo dõi người chiến thắng trong trò chơi. Ban đầu, nó bằng 0, nghĩa là không có người chiến thắng.
  • draw: Đây là lá cờ cho biết trận đấu đã kết thúc với tỷ số hòa hay chưa. Ban đầu, nó là Sai.
  • deck: Đây là lưới 3x3 đại diện cho bảng TicTacToe. Tất cả các điểm trên bảng ban đầu đều trống, được biểu thị bằng số 0.
  • nextPlayer: Điều này cho biết đến lượt ai chơi. Trò chơi bắt đầu với người chơi 1, vì vậy ban đầu nó được đặt thành 1.

Trò chơi logic

Logic trò chơi được gói gọn trong chức năng play . Nó thực hiện một số kiểm tra để đảm bảo một nước đi hợp lệ:

  • Nó kiểm tra rằng chưa có người chơi nào thắng và trò chơi không hòa.
  • Nó xác minh rằng các chỉ số cho vị trí lưới được người chơi chọn có nằm trong ranh giới của lưới hay không.
  • Nó đảm bảo rằng người chơi thực hiện nước đi phù hợp với nextPlayer.
  • Nó đảm bảo rằng vị trí được chọn trên lưới trống.
    Khi một nước đi được thực hiện, logic trò chơi sẽ tăng nbMoves, chuyển đổi nextPlayer và kiểm tra xem nước đi đó dẫn đến thắng hay hòa.

Điều kiện thắng được kiểm tra trên hàng và cột của nước đi mới nhất, cũng như hai đường chéo.

Nếu tất cả các ô trên bảng đã được lấp đầy và không có người chơi nào thắng (tức là nbMoves bằng 9 và winner vẫn là 0), trò chơi được tuyên bố là hòa.

Kiểm tra một chiến thắng

Hàm checkLine được sử dụng để kiểm tra xem có người chơi nào thắng hay không. Nó kiểm tra xem tất cả các vị trí trên một dòng (có thể là một hàng, một cột hoặc một đường chéo) có được lấp đầy bởi cùng một người chơi hay không. Nếu vậy, người chơi đó được tuyên bố là người chiến thắng.

Tương tác với Hợp đồng

Các tương tác với hợp đồng được thể hiện dưới dạng giao dịch. Khi người chơi thực hiện một nước đi bằng cách gọi hàm play , nó sẽ tạo ra một giao dịch. Giao dịch này được ghi lại và có thể được nhìn thấy trong bảng bên phải của SmartPy IDE:

Một bước di chuyển không thành công hoặc không hợp lệ cũng sẽ tạo ra một giao dịch nhưng có dấu hiệu lỗi:

Bước đi thứ hai và hơn thế nữa

Bước đầu tiên trong trò chơi TicTacToe của chúng tôi tương đối đơn giản vì bảng trò chơi trống. Tuy nhiên, mọi thứ trở nên thú vị hơn với nước đi thứ hai và những nước đi tiếp theo. Những động tác này không chỉ bổ sung thêm các quân cờ vào bảng trò chơi mà còn gợi lên tính logic của trò chơi để kiểm tra xem người chiến thắng có tiềm năng hay không.

Sau nước đi đầu tiên, giá trị nextPlayer chuyển sang người chơi 2. Bây giờ, hàm play xác nhận nước đi của người chơi 2. Các kiểm tra tương tự được thực hiện để đảm bảo việc di chuyển là hợp lệ, tức là vị trí lưới đã chọn nằm trong ranh giới và trống.

Khi mỗi người chơi thực hiện một nước đi, trạng thái của trò chơi sẽ tiến triển. nbMoves tăng lên, nextPlayer chuyển đổi và deck được cập nhật. Ngoài ra, sau mỗi nước đi, hợp đồng sẽ kiểm tra xem có người thắng hay hòa.

Ví dụ: sau khi người chơi đầu tiên thực hiện nước đi ở giữa bàn cờ tại i=1, j=1, người chơi thứ hai có thể chơi ở một vị trí khác, chẳng hạn như i=1, j=2. Cả hai động thái này sẽ được xác thực và thực hiện thành công, với các giao dịch tương ứng sẽ được tạo.

Các bước di chuyển khác và tiến trình trò chơi

Các bước di chuyển tiếp theo tiếp tục theo cách tương tự. Mỗi người chơi lần lượt chơi, chọn một ô trống trên bàn cờ. Sau mỗi lần di chuyển, hợp đồng sẽ kiểm tra mọi điều kiện chiến thắng. Nếu một người chơi điền vào toàn bộ hàng, cột hoặc đường chéo bằng biểu tượng của họ, trò chơi sẽ kết thúc và người chơi đó được tuyên bố là người chiến thắng. Biến winner trong trạng thái của hợp đồng sẽ được cập nhật tương ứng.

Điều quan trọng cần lưu ý là khi người chơi đã thắng thì nước đi tiếp theo sẽ không có hiệu lực. Mọi nỗ lực thực hiện nước đi sau khi trò chơi kết thúc sẽ bị coi là không hợp lệ và giao dịch tương ứng sẽ không thành công.

Kịch bản rút thăm

Trong một số trò chơi, có thể không có người chơi nào đạt được điều kiện chiến thắng ngay cả khi toàn bộ bảng trò chơi đã được lấp đầy. Điều này dẫn đến một trận hòa. Hợp đồng cũng được thiết kế để giải quyết tình huống này.

Nếu tất cả các vị trí trên bảng được lấp đầy (nbMoves bằng 9) và không có người chơi nào thắng (winner vẫn là 0), trò chơi được tuyên bố là hòa. Cờ draw ở trạng thái của hợp đồng được đặt thành True, cho biết trận đấu đã kết thúc với tỷ số hòa. Một lần nữa, không có động thái nào có hiệu lực sau thời điểm này. Mọi nỗ lực đi tiếp sau khi hòa cũng sẽ thất bại.

Phần thứ hai của kịch bản thử nghiệm hợp đồng TicTacToe thể hiện kịch bản vẽ này. Nó mô phỏng một loạt các nước đi dẫn đến kết quả hòa và xác minh rằng hợp đồng xử lý chính xác.

Clause de non-responsabilité
* Les investissements en cryptomonnaies comportent des risques importants. Veuillez faire preuve de prudence. Le cours n'est pas destiné à fournir des conseils en investissement.
* Ce cours a été créé par l'auteur qui a rejoint Gate Learn. Toute opinion partagée par l'auteur ne représente pas Gate Learn.
Catalogue
Leçon 3

Phát triển trò chơi TicTacToe trên Tezos

Thế giới trò chơi blockchain đang có rất nhiều cơ hội dành cho các nhà phát triển. Nó cung cấp một cách độc đáo và sáng tạo để tích hợp các cơ chế phi tập trung và minh bạch vào trò chơi. Bằng cách phát triển trò chơi trên blockchain, chúng tôi có thể kết hợp các tính năng như giao dịch an toàn và minh bạch, quyền sở hữu tài sản trong trò chơi, v.v. Trong bài học này, chúng ta sẽ bước vào trò chơi blockchain bằng cách phát triển trò chơi cổ điển TicTacToe trên chuỗi khối Tezos. Mục đích của chúng tôi với bài học này là tìm hiểu động lực của logic trò chơi và quản lý trạng thái trong trò chơi dựa trên blockchain.

Hãy bắt đầu bằng cách khám phá hợp đồng của chúng tôi đối với trò chơi TicTacToe:

Cấu trúc hợp đồng

Python 
 #TicTacToe - Ví dụ chỉ mang tính chất minh họa.

import smartpy as sp 


 @sp.module 
 def main(): 
 class TicTacToe(sp.Contract): 
 def __init__(self): 
 self.data.nbMoves = 0 
 self.data.winner = 0 
 self.data.draw = Sai 
 self.data.deck = { 
 0: {0: 0, 1: 0, 2: 0}, 
 1: {0: 0, 1: 0, 2: 0}, 
 2: {0: 0, 1: 0, 2: 0}, 
 } 
 self.data.nextPlayer = 1 

 @ sp.entrypoint 
 def play(self, params): 
 khẳng định self.data.winner == 0 và không phải self.data.draw 
 khẳng định params.i >= 0 và params.i < 3 
 khẳng định params.j >= 0 và params.j < 3 
 khẳng định params.move == self.data.nextPlayer 
 khẳng định self.data.deck[params.i][params.j] == 0 
 self.data.deck[params.i][params.j] = params.move 
 self.data.nbMoves += 1 
 self.data.nextPlayer = 3 - self.data.nextPlayer 
 self.data.winner = self.checkLine(
                sp.record(winner=self.data.winner, line=self.data.deck[params.i])
            ) 
 self.data.winner = self.checkLine(
                sp.record( 
 người chiến thắng=self.data.winner,
                    line={
                        0: self.data.deck[0][params.j],
                        1: self.data.deck[1][params.j],
                        2: self.data.deck[2][params.j],
                    }, 
 ) 
 ) 
 self.data.winner = self.checkLine(
                sp.record( 
 người chiến thắng=self.data.winner,
                    line={
                        0: self.data.deck[0][0],
                        1: self.data.deck[1][1],
                        2: self.data.deck[2][2],
                    }, 
 ) 
 ) 
 self.data.winner = self.checkLine(
                sp.record( 
 người chiến thắng=self.data.winner,
                    line={
                        0: self.data.deck[0][2],
                        1: self.data.deck[1][1],
                        2: self.data.deck[2][0],
                    }, 
 ) 
 ) 
 if self.data.nbMoves == 9 và self.data.winner == 0: 
 self.data.draw = True 

 @sp.private() 
 def checkLine(self , người chiến thắng, dòng): 
 Winner_ = Winner 
 if line[0] != 0 và line[0] == line[1] và line[0] == line[2]: 
 Winner_ = line[0] 
 return Winner_ 

 # Thêm chức năng đặt lại trò chơi 
 @sp.entrypoint 
 def confirm_and_reset(self): 
 khẳng định self.data.winner != 0 hoặc self.data.draw 
 self.__init__()

# Kiểm tra 
 nếu "templates" không có trong __name__: 

 @sp.add_test(name="TicTacToe") 
 def test(): 
 script = sp.test_scenario(main)
        script.h1("Tic-Tac-Toe")
        # xác định một hợp đồng 
 c1 = main.TicTacToe() 

 # hiển thị cách trình bày của nó 
 kịch bản.h2("A chuỗi tương tác với người chiến thắng") 
 kịch bản += c1 
 script.h2("Tin nhắn thực thi") 
 kịch bản.h3("A nước đi đầu tiên ở giữa") 
 c1.play(i=1, j=1, move=1) 
 script.h3("A nước đi bị cấm") 
 c1.play(i=1, j=1, move=2).run(valid=False)
        kịch bản.h3("A nước đi thứ hai") 
 c1.play(i=1, j=2, move=2) 
 script.h3("Khác di chuyển") 
 c1.play(i=2, j=1, move=1) 
 c1.play(i=2, j=2, move=2) 
 script.verify(c1.data.winner == 0 ) 
 c1.play(i=0, j=1, move=1) 
 script.verify(c1.data.winner == 1) 
 script.p("Player1 đã thắng") 
 c1.play(i=0, j=0, move=2).run(valid=False)

        c2 = main.TicTacToe() 
 kịch bản.h2("A trình tự tương tác với kết quả hòa") 
 kịch bản += c2 
 script.h2("Tin nhắn thực thi") 
 kịch bản.h3("A nước đi đầu tiên ở giữa") 
 c2.play(i=1, j=1, move=1) 
 script.h3("A nước đi bị cấm") 
 c2.play(i=1, j=1, move=2).run(valid=False)
        kịch bản.h3("A nước đi thứ hai") 
 c2.play(i=1, j=2, move=2) 
 script.h3("Khác di chuyển") 
 c2.play(i=2, j=1, move=1) 
 c2.play(i=2, j=2, move=2) 
 c2.play(i=0, j=0, move=1) 
 c2.play(i=0, j=1, move=2) 
 c2.play(i=0, j=2, move=1) 
 c2.play(i=2, j=0 , move=2) 
 c2.play(i=1, j=0, move=1) 

 # Thêm bài kiểm tra để thiết lập lại trò chơi 
 script.h2("Thử nghiệm thiết lập lại trò chơi") 
 kịch bản.p("Người chiến thắng hoặc rút thăm đã được xác nhận, hiện đang đặt lại trò chơi") 
 c1.confirm_and_reset() 
 script.verify(c1.data.nbMoves == 0) 
 script.verify(c1.data.winner == 0) 
 script.verify(not c1.data.draw)

        c2.confirm_and_reset() 
 kịch bản.verify(c2.data.nbMoves == 0) 
 kịch bản.verify(c2.data.winner == 0) 
 kịch bản.verify(không c2.data.draw)

Hợp đồng cho trò chơi TicTacToe của chúng tôi trên Tezos được viết bằng ngôn ngữ SmartPy. Nó bao gồm hai phần chính: trạng thái của hợp đồng và logic của trò chơi.

Trạng thái của hợp đồng

Trạng thái của hợp đồng được khởi tạo trong hàm **init . Nó bao gồm:

  • nbMoves: Đây là bộ đếm số nước đi được thực hiện trong trò chơi. Nó bắt đầu từ số không.
  • winner: Điều này theo dõi người chiến thắng trong trò chơi. Ban đầu, nó bằng 0, nghĩa là không có người chiến thắng.
  • draw: Đây là lá cờ cho biết trận đấu đã kết thúc với tỷ số hòa hay chưa. Ban đầu, nó là Sai.
  • deck: Đây là lưới 3x3 đại diện cho bảng TicTacToe. Tất cả các điểm trên bảng ban đầu đều trống, được biểu thị bằng số 0.
  • nextPlayer: Điều này cho biết đến lượt ai chơi. Trò chơi bắt đầu với người chơi 1, vì vậy ban đầu nó được đặt thành 1.

Trò chơi logic

Logic trò chơi được gói gọn trong chức năng play . Nó thực hiện một số kiểm tra để đảm bảo một nước đi hợp lệ:

  • Nó kiểm tra rằng chưa có người chơi nào thắng và trò chơi không hòa.
  • Nó xác minh rằng các chỉ số cho vị trí lưới được người chơi chọn có nằm trong ranh giới của lưới hay không.
  • Nó đảm bảo rằng người chơi thực hiện nước đi phù hợp với nextPlayer.
  • Nó đảm bảo rằng vị trí được chọn trên lưới trống.
    Khi một nước đi được thực hiện, logic trò chơi sẽ tăng nbMoves, chuyển đổi nextPlayer và kiểm tra xem nước đi đó dẫn đến thắng hay hòa.

Điều kiện thắng được kiểm tra trên hàng và cột của nước đi mới nhất, cũng như hai đường chéo.

Nếu tất cả các ô trên bảng đã được lấp đầy và không có người chơi nào thắng (tức là nbMoves bằng 9 và winner vẫn là 0), trò chơi được tuyên bố là hòa.

Kiểm tra một chiến thắng

Hàm checkLine được sử dụng để kiểm tra xem có người chơi nào thắng hay không. Nó kiểm tra xem tất cả các vị trí trên một dòng (có thể là một hàng, một cột hoặc một đường chéo) có được lấp đầy bởi cùng một người chơi hay không. Nếu vậy, người chơi đó được tuyên bố là người chiến thắng.

Tương tác với Hợp đồng

Các tương tác với hợp đồng được thể hiện dưới dạng giao dịch. Khi người chơi thực hiện một nước đi bằng cách gọi hàm play , nó sẽ tạo ra một giao dịch. Giao dịch này được ghi lại và có thể được nhìn thấy trong bảng bên phải của SmartPy IDE:

Một bước di chuyển không thành công hoặc không hợp lệ cũng sẽ tạo ra một giao dịch nhưng có dấu hiệu lỗi:

Bước đi thứ hai và hơn thế nữa

Bước đầu tiên trong trò chơi TicTacToe của chúng tôi tương đối đơn giản vì bảng trò chơi trống. Tuy nhiên, mọi thứ trở nên thú vị hơn với nước đi thứ hai và những nước đi tiếp theo. Những động tác này không chỉ bổ sung thêm các quân cờ vào bảng trò chơi mà còn gợi lên tính logic của trò chơi để kiểm tra xem người chiến thắng có tiềm năng hay không.

Sau nước đi đầu tiên, giá trị nextPlayer chuyển sang người chơi 2. Bây giờ, hàm play xác nhận nước đi của người chơi 2. Các kiểm tra tương tự được thực hiện để đảm bảo việc di chuyển là hợp lệ, tức là vị trí lưới đã chọn nằm trong ranh giới và trống.

Khi mỗi người chơi thực hiện một nước đi, trạng thái của trò chơi sẽ tiến triển. nbMoves tăng lên, nextPlayer chuyển đổi và deck được cập nhật. Ngoài ra, sau mỗi nước đi, hợp đồng sẽ kiểm tra xem có người thắng hay hòa.

Ví dụ: sau khi người chơi đầu tiên thực hiện nước đi ở giữa bàn cờ tại i=1, j=1, người chơi thứ hai có thể chơi ở một vị trí khác, chẳng hạn như i=1, j=2. Cả hai động thái này sẽ được xác thực và thực hiện thành công, với các giao dịch tương ứng sẽ được tạo.

Các bước di chuyển khác và tiến trình trò chơi

Các bước di chuyển tiếp theo tiếp tục theo cách tương tự. Mỗi người chơi lần lượt chơi, chọn một ô trống trên bàn cờ. Sau mỗi lần di chuyển, hợp đồng sẽ kiểm tra mọi điều kiện chiến thắng. Nếu một người chơi điền vào toàn bộ hàng, cột hoặc đường chéo bằng biểu tượng của họ, trò chơi sẽ kết thúc và người chơi đó được tuyên bố là người chiến thắng. Biến winner trong trạng thái của hợp đồng sẽ được cập nhật tương ứng.

Điều quan trọng cần lưu ý là khi người chơi đã thắng thì nước đi tiếp theo sẽ không có hiệu lực. Mọi nỗ lực thực hiện nước đi sau khi trò chơi kết thúc sẽ bị coi là không hợp lệ và giao dịch tương ứng sẽ không thành công.

Kịch bản rút thăm

Trong một số trò chơi, có thể không có người chơi nào đạt được điều kiện chiến thắng ngay cả khi toàn bộ bảng trò chơi đã được lấp đầy. Điều này dẫn đến một trận hòa. Hợp đồng cũng được thiết kế để giải quyết tình huống này.

Nếu tất cả các vị trí trên bảng được lấp đầy (nbMoves bằng 9) và không có người chơi nào thắng (winner vẫn là 0), trò chơi được tuyên bố là hòa. Cờ draw ở trạng thái của hợp đồng được đặt thành True, cho biết trận đấu đã kết thúc với tỷ số hòa. Một lần nữa, không có động thái nào có hiệu lực sau thời điểm này. Mọi nỗ lực đi tiếp sau khi hòa cũng sẽ thất bại.

Phần thứ hai của kịch bản thử nghiệm hợp đồng TicTacToe thể hiện kịch bản vẽ này. Nó mô phỏng một loạt các nước đi dẫn đến kết quả hòa và xác minh rằng hợp đồng xử lý chính xác.

Clause de non-responsabilité
* Les investissements en cryptomonnaies comportent des risques importants. Veuillez faire preuve de prudence. Le cours n'est pas destiné à fournir des conseils en investissement.
* Ce cours a été créé par l'auteur qui a rejoint Gate Learn. Toute opinion partagée par l'auteur ne représente pas Gate Learn.