Lesson 3

Mengembangkan Game TicTacToe di Tezos

Dunia game blockchain penuh dengan peluang bagi pengembang. Ini memberikan cara yang unik dan inovatif untuk mengintegrasikan mekanisme yang terdesentralisasi dan transparan ke dalam permainan. Dengan mengembangkan game di blockchain, kami dapat menggabungkan fitur-fitur seperti transaksi yang aman dan transparan, kepemilikan aset dalam game, dan banyak lagi. Dalam pelajaran ini, kita akan memasuki permainan blockchain dengan mengembangkan permainan klasik TicTacToe di blockchain Tezos. Tujuan kami dalam pelajaran ini adalah untuk memahami dinamika logika permainan dan manajemen negara dalam permainan berbasis blockchain.

Mari kita mulai dengan menjelajahi kontrak kami untuk game TicTacToe:

Struktur Kontrak

Python 
 # TicTacToe - Contoh untuk tujuan ilustrasi saja.

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 = Salah 
 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): 
 menegaskan self.data.winner == 0 dan bukan self.data.draw 
 menegaskan params.i >= 0 dan params.i < 3 
 menegaskan params.j >= 0 dan params.j < 3 
 menegaskan params.move == self.data.nextPlayer 
 menegaskan 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, baris=self.data.deck[params.i])
            ) 
 diri.data.pemenang = diri.checkLine(
                sp.record( 
 pemenang=self.data.winner,
                    baris={
                        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( 
 pemenang=self.data.winner,
                    baris={
                        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( 
 pemenang=self.data.winner,
                    baris={
                        0: self.data.deck[0][2],
                        1: self.data.deck[1][1],
                        2: self.data.deck[2][0],
                    }, 
 ) 
 ) 
 jika self.data.nbMoves == 9 dan self.data.winner == 0: 
 self.data.draw = True 

 @sp.private() 
 def checkLine(self , pemenang, baris): 
 pemenang_ = pemenang 
 jika baris[0] != 0 dan baris[0] == baris[1] dan baris[0] == baris[2]: 
 pemenang_ = baris[0] 
 kembalikan pemenang_ 

 # Tambahkan fungsi reset game 
 @sp.entrypoint 
 def konfirmasi_and_reset(self): 
 tegaskan self.data.winner != 0 atau self.data.draw 
 self.__init__()

# Pengujian 
 jika "templat" tidak ada di __name__: 

 @sp.add_test(name="TicTacToe") 
 def test(): 
 skenario = sp.test_scenario(main)
        skenario.h1("Tic-Tac-Toe")
        # tentukan kontrak 
 c1 = main.TicTacToe() 

 # tampilkan representasinya 
 skenario.h2("A urutan interaksi dengan pemenang") 
 skenario += c1 
 skenario.h2("Pesan eksekusi") 
 skenario.h3("A langkah pertama di tengah") 
 c1.play(i=1, j=1, move=1) 
 skenario.h3("A gerakan terlarang") 
 c1.play(i=1, j=1, move=2).run(valid=False)
        skenario.h3("A langkah kedua") 
 c1.play(i=1, j=2, move=2) 
 skenario.h3("Lainnya bergerak") 
 c1.play(i=2, j=1, move=1) 
 c1.play(i=2, j=2, move=2) 
 skenario.verify(c1.data.winner == 0 ) 
 c1.play(i=0, j=1, move=1) 
 skenario.verifikasi(c1.data.winner == 1) 
 skenario.p("Pemain1 telah menang") 
 c1.play(i=0, j=0, move=2).run(valid=False)

        c2 = main.TicTacToe() 
 skenario.h2("A urutan interaksi dengan undian") 
 skenario += c2 
 skenario.h2("Pesan eksekusi") 
 skenario.h3("A langkah pertama di tengah") 
 c2.play(i=1, j=1, move=1) 
 skenario.h3("A gerakan terlarang") 
 c2.play(i=1, j=1, move=2).run(valid=False)
        skenario.h3("A langkah kedua") 
 c2.play(i=1, j=2, move=2) 
 skenario.h3("Lainnya bergerak") 
 c2.play(i=2, j=1, move=1) 
 c2.play(i=2, j=2, move=2) 
 c2.play(i=0, j=0, pindah=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) 

 # Tambahkan tes untuk reset game 
 skenario.h2("Pengujian pengaturan ulang permainan") 
 skenario.p("Pemenang atau seri dikonfirmasi, sekarang atur ulang permainan") 
 c1.confirm_and_reset() 
 skenario.verify(c1.data.nbMoves == 0) 
 skenario.verify(c1.data.winner == 0) 
 skenario.verify(tidak c1.data.draw)

        c2.confirm_and_reset() 
 skenario.verifikasi(c2.data.nbMoves == 0) 
 skenario.verifikasi(c2.data.winner == 0) 
 skenario.verifikasi(tidak c2.data.draw)

Kontrak untuk game TicTacToe kami di Tezos ditulis dalam bahasa SmartPy. Ini terdiri dari dua bagian utama: keadaan kontrak, dan logika permainan.

Keadaan Kontrak

Status kontrak diinisialisasi dalam fungsi **init . Itu termasuk:

  • nbMoves: Ini adalah penghitung jumlah gerakan yang dilakukan dalam permainan. Ini dimulai dari nol.
  • winner: Ini melacak pemenang permainan. Awalnya nol, menunjukkan tidak ada pemenang.
  • draw: Ini adalah bendera yang menunjukkan apakah pertandingan berakhir seri. Awalnya, itu Salah.
  • deck: Ini adalah kotak 3x3 yang mewakili papan TicTacToe. Semua titik di papan awalnya kosong, diwakili oleh angka nol.
  • nextPlayer: Ini menunjukkan giliran siapa yang akan bermain. Permainan dimulai dengan pemain 1, jadi awalnya disetel ke 1.

Logika Permainan

Logika permainan dikemas dalam fungsi play . Ia melakukan beberapa pemeriksaan untuk memastikan langkah yang valid:

  • Ini memeriksa bahwa belum ada pemain yang menang dan permainan tersebut tidak seri.
  • Ini memverifikasi bahwa indeks untuk tempat grid yang dipilih oleh pemain berada dalam batas-batas grid.
  • Ini memastikan bahwa pemain yang melakukan perpindahan cocok dengan nextPlayer.
  • Ini memastikan bahwa tempat yang dipilih pada grid kosong.
    Setelah gerakan dilakukan, logika permainan akan menambah nbMoves, mengganti nextPlayer, dan memeriksa apakah gerakan tersebut menghasilkan kemenangan atau seri.

Kondisi menang diperiksa pada baris dan kolom gerakan terakhir, serta pada dua diagonal.

Jika semua tempat di papan terisi dan tidak ada pemain yang menang (yaitu, nbMoves sama dengan 9 dan winner tetap 0), permainan dinyatakan seri.

Memeriksa Kemenangan

Fungsi checkLine digunakan untuk memeriksa apakah ada pemain yang menang. Ia memeriksa apakah semua titik dalam satu garis (bisa berupa baris, kolom, atau diagonal) diisi oleh pemain yang sama. Jika demikian, pemain tersebut dinyatakan sebagai pemenang.

Berinteraksi dengan Kontrak

Interaksi dengan kontrak direpresentasikan sebagai transaksi. Ketika seorang pemain bergerak dengan memanggil fungsi play , itu menghasilkan transaksi. Transaksi ini dicatat dan dapat dilihat di panel kanan SmartPy IDE:

Perpindahan yang gagal atau tidak valid juga akan menghasilkan transaksi tetapi dengan indikasi kesalahan:

Langkah Kedua dan Selanjutnya

Langkah pertama dalam permainan TicTacToe kami relatif mudah karena papan permainannya kosong. Namun, segalanya menjadi lebih menarik dengan langkah kedua dan langkah selanjutnya. Gerakan ini tidak hanya menambah kepingan pada papan permainan tetapi juga menggunakan logika permainan untuk memeriksa calon pemenang.

Setelah langkah pertama, nilai nextPlayer beralih ke pemain 2. Sekarang, fungsi play memvalidasi langkah pemain 2. Pemeriksaan serupa dilakukan untuk memastikan perpindahan tersebut valid, yaitu titik grid yang dipilih berada dalam batas dan kosong.

Saat setiap pemain bergerak, status permainan berkembang. nbMoves meningkat, nextPlayer berganti, dan deck diperbarui. Selain itu, setelah setiap pergerakan, kontrak akan memeriksa apakah ada pemenang atau seri.

Misalnya, setelah pemain pertama bergerak di tengah papan pada i=1, j=1, pemain kedua dapat bermain di tempat berbeda, katakanlah i=1, j=2. Kedua pergerakan ini akan divalidasi dan dieksekusi dengan sukses, dengan transaksi terkait akan dihasilkan.

Gerakan Lain dan Perkembangan Game

Gerakan selanjutnya berlanjut dengan cara yang sama. Setiap pemain bergiliran bermain, memilih tempat kosong di papan. Setelah setiap pergerakan, kontrak memeriksa kondisi kemenangan apa pun. Jika seorang pemain mengisi seluruh baris, kolom, atau diagonal dengan simbolnya, permainan berakhir dan pemain tersebut dinyatakan sebagai pemenang. Variabel winner dalam status kontrak akan diperbarui.

Penting untuk dicatat bahwa setelah seorang pemain menang, tidak ada langkah selanjutnya yang valid. Segala upaya untuk melakukan pergerakan setelah permainan berakhir akan dianggap tidak sah dan transaksi terkait akan gagal.

Skenario Pengundian

Dalam beberapa permainan, mungkin saja tidak ada pemain yang mencapai kondisi menang bahkan setelah seluruh papan permainan terisi. Hal ini menghasilkan hasil imbang. Kontrak telah dirancang untuk menangani situasi ini juga.

Jika semua tempat di papan terisi (nbMoves sama dengan 9) dan tidak ada pemain yang menang (winner tetap 0), permainan dinyatakan seri. Bendera draw di status kontrak disetel ke Benar, yang menunjukkan bahwa pertandingan berakhir seri. Sekali lagi, tidak ada pergerakan lebih lanjut yang valid setelah titik ini. Segala upaya untuk bergerak setelah hasil imbang juga akan gagal.

Bagian kedua dari skenario pengujian kontrak TicTacToe menunjukkan skenario gambar ini. Ini mensimulasikan serangkaian gerakan yang menghasilkan hasil imbang dan memverifikasi bahwa kontrak menanganinya dengan benar.

Disclaimer
* Crypto investment involves significant risks. Please proceed with caution. The course is not intended as investment advice.
* The course is created by the author who has joined Gate Learn. Any opinion shared by the author does not represent Gate Learn.
Catalog
Lesson 3

Mengembangkan Game TicTacToe di Tezos

Dunia game blockchain penuh dengan peluang bagi pengembang. Ini memberikan cara yang unik dan inovatif untuk mengintegrasikan mekanisme yang terdesentralisasi dan transparan ke dalam permainan. Dengan mengembangkan game di blockchain, kami dapat menggabungkan fitur-fitur seperti transaksi yang aman dan transparan, kepemilikan aset dalam game, dan banyak lagi. Dalam pelajaran ini, kita akan memasuki permainan blockchain dengan mengembangkan permainan klasik TicTacToe di blockchain Tezos. Tujuan kami dalam pelajaran ini adalah untuk memahami dinamika logika permainan dan manajemen negara dalam permainan berbasis blockchain.

Mari kita mulai dengan menjelajahi kontrak kami untuk game TicTacToe:

Struktur Kontrak

Python 
 # TicTacToe - Contoh untuk tujuan ilustrasi saja.

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 = Salah 
 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): 
 menegaskan self.data.winner == 0 dan bukan self.data.draw 
 menegaskan params.i >= 0 dan params.i < 3 
 menegaskan params.j >= 0 dan params.j < 3 
 menegaskan params.move == self.data.nextPlayer 
 menegaskan 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, baris=self.data.deck[params.i])
            ) 
 diri.data.pemenang = diri.checkLine(
                sp.record( 
 pemenang=self.data.winner,
                    baris={
                        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( 
 pemenang=self.data.winner,
                    baris={
                        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( 
 pemenang=self.data.winner,
                    baris={
                        0: self.data.deck[0][2],
                        1: self.data.deck[1][1],
                        2: self.data.deck[2][0],
                    }, 
 ) 
 ) 
 jika self.data.nbMoves == 9 dan self.data.winner == 0: 
 self.data.draw = True 

 @sp.private() 
 def checkLine(self , pemenang, baris): 
 pemenang_ = pemenang 
 jika baris[0] != 0 dan baris[0] == baris[1] dan baris[0] == baris[2]: 
 pemenang_ = baris[0] 
 kembalikan pemenang_ 

 # Tambahkan fungsi reset game 
 @sp.entrypoint 
 def konfirmasi_and_reset(self): 
 tegaskan self.data.winner != 0 atau self.data.draw 
 self.__init__()

# Pengujian 
 jika "templat" tidak ada di __name__: 

 @sp.add_test(name="TicTacToe") 
 def test(): 
 skenario = sp.test_scenario(main)
        skenario.h1("Tic-Tac-Toe")
        # tentukan kontrak 
 c1 = main.TicTacToe() 

 # tampilkan representasinya 
 skenario.h2("A urutan interaksi dengan pemenang") 
 skenario += c1 
 skenario.h2("Pesan eksekusi") 
 skenario.h3("A langkah pertama di tengah") 
 c1.play(i=1, j=1, move=1) 
 skenario.h3("A gerakan terlarang") 
 c1.play(i=1, j=1, move=2).run(valid=False)
        skenario.h3("A langkah kedua") 
 c1.play(i=1, j=2, move=2) 
 skenario.h3("Lainnya bergerak") 
 c1.play(i=2, j=1, move=1) 
 c1.play(i=2, j=2, move=2) 
 skenario.verify(c1.data.winner == 0 ) 
 c1.play(i=0, j=1, move=1) 
 skenario.verifikasi(c1.data.winner == 1) 
 skenario.p("Pemain1 telah menang") 
 c1.play(i=0, j=0, move=2).run(valid=False)

        c2 = main.TicTacToe() 
 skenario.h2("A urutan interaksi dengan undian") 
 skenario += c2 
 skenario.h2("Pesan eksekusi") 
 skenario.h3("A langkah pertama di tengah") 
 c2.play(i=1, j=1, move=1) 
 skenario.h3("A gerakan terlarang") 
 c2.play(i=1, j=1, move=2).run(valid=False)
        skenario.h3("A langkah kedua") 
 c2.play(i=1, j=2, move=2) 
 skenario.h3("Lainnya bergerak") 
 c2.play(i=2, j=1, move=1) 
 c2.play(i=2, j=2, move=2) 
 c2.play(i=0, j=0, pindah=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) 

 # Tambahkan tes untuk reset game 
 skenario.h2("Pengujian pengaturan ulang permainan") 
 skenario.p("Pemenang atau seri dikonfirmasi, sekarang atur ulang permainan") 
 c1.confirm_and_reset() 
 skenario.verify(c1.data.nbMoves == 0) 
 skenario.verify(c1.data.winner == 0) 
 skenario.verify(tidak c1.data.draw)

        c2.confirm_and_reset() 
 skenario.verifikasi(c2.data.nbMoves == 0) 
 skenario.verifikasi(c2.data.winner == 0) 
 skenario.verifikasi(tidak c2.data.draw)

Kontrak untuk game TicTacToe kami di Tezos ditulis dalam bahasa SmartPy. Ini terdiri dari dua bagian utama: keadaan kontrak, dan logika permainan.

Keadaan Kontrak

Status kontrak diinisialisasi dalam fungsi **init . Itu termasuk:

  • nbMoves: Ini adalah penghitung jumlah gerakan yang dilakukan dalam permainan. Ini dimulai dari nol.
  • winner: Ini melacak pemenang permainan. Awalnya nol, menunjukkan tidak ada pemenang.
  • draw: Ini adalah bendera yang menunjukkan apakah pertandingan berakhir seri. Awalnya, itu Salah.
  • deck: Ini adalah kotak 3x3 yang mewakili papan TicTacToe. Semua titik di papan awalnya kosong, diwakili oleh angka nol.
  • nextPlayer: Ini menunjukkan giliran siapa yang akan bermain. Permainan dimulai dengan pemain 1, jadi awalnya disetel ke 1.

Logika Permainan

Logika permainan dikemas dalam fungsi play . Ia melakukan beberapa pemeriksaan untuk memastikan langkah yang valid:

  • Ini memeriksa bahwa belum ada pemain yang menang dan permainan tersebut tidak seri.
  • Ini memverifikasi bahwa indeks untuk tempat grid yang dipilih oleh pemain berada dalam batas-batas grid.
  • Ini memastikan bahwa pemain yang melakukan perpindahan cocok dengan nextPlayer.
  • Ini memastikan bahwa tempat yang dipilih pada grid kosong.
    Setelah gerakan dilakukan, logika permainan akan menambah nbMoves, mengganti nextPlayer, dan memeriksa apakah gerakan tersebut menghasilkan kemenangan atau seri.

Kondisi menang diperiksa pada baris dan kolom gerakan terakhir, serta pada dua diagonal.

Jika semua tempat di papan terisi dan tidak ada pemain yang menang (yaitu, nbMoves sama dengan 9 dan winner tetap 0), permainan dinyatakan seri.

Memeriksa Kemenangan

Fungsi checkLine digunakan untuk memeriksa apakah ada pemain yang menang. Ia memeriksa apakah semua titik dalam satu garis (bisa berupa baris, kolom, atau diagonal) diisi oleh pemain yang sama. Jika demikian, pemain tersebut dinyatakan sebagai pemenang.

Berinteraksi dengan Kontrak

Interaksi dengan kontrak direpresentasikan sebagai transaksi. Ketika seorang pemain bergerak dengan memanggil fungsi play , itu menghasilkan transaksi. Transaksi ini dicatat dan dapat dilihat di panel kanan SmartPy IDE:

Perpindahan yang gagal atau tidak valid juga akan menghasilkan transaksi tetapi dengan indikasi kesalahan:

Langkah Kedua dan Selanjutnya

Langkah pertama dalam permainan TicTacToe kami relatif mudah karena papan permainannya kosong. Namun, segalanya menjadi lebih menarik dengan langkah kedua dan langkah selanjutnya. Gerakan ini tidak hanya menambah kepingan pada papan permainan tetapi juga menggunakan logika permainan untuk memeriksa calon pemenang.

Setelah langkah pertama, nilai nextPlayer beralih ke pemain 2. Sekarang, fungsi play memvalidasi langkah pemain 2. Pemeriksaan serupa dilakukan untuk memastikan perpindahan tersebut valid, yaitu titik grid yang dipilih berada dalam batas dan kosong.

Saat setiap pemain bergerak, status permainan berkembang. nbMoves meningkat, nextPlayer berganti, dan deck diperbarui. Selain itu, setelah setiap pergerakan, kontrak akan memeriksa apakah ada pemenang atau seri.

Misalnya, setelah pemain pertama bergerak di tengah papan pada i=1, j=1, pemain kedua dapat bermain di tempat berbeda, katakanlah i=1, j=2. Kedua pergerakan ini akan divalidasi dan dieksekusi dengan sukses, dengan transaksi terkait akan dihasilkan.

Gerakan Lain dan Perkembangan Game

Gerakan selanjutnya berlanjut dengan cara yang sama. Setiap pemain bergiliran bermain, memilih tempat kosong di papan. Setelah setiap pergerakan, kontrak memeriksa kondisi kemenangan apa pun. Jika seorang pemain mengisi seluruh baris, kolom, atau diagonal dengan simbolnya, permainan berakhir dan pemain tersebut dinyatakan sebagai pemenang. Variabel winner dalam status kontrak akan diperbarui.

Penting untuk dicatat bahwa setelah seorang pemain menang, tidak ada langkah selanjutnya yang valid. Segala upaya untuk melakukan pergerakan setelah permainan berakhir akan dianggap tidak sah dan transaksi terkait akan gagal.

Skenario Pengundian

Dalam beberapa permainan, mungkin saja tidak ada pemain yang mencapai kondisi menang bahkan setelah seluruh papan permainan terisi. Hal ini menghasilkan hasil imbang. Kontrak telah dirancang untuk menangani situasi ini juga.

Jika semua tempat di papan terisi (nbMoves sama dengan 9) dan tidak ada pemain yang menang (winner tetap 0), permainan dinyatakan seri. Bendera draw di status kontrak disetel ke Benar, yang menunjukkan bahwa pertandingan berakhir seri. Sekali lagi, tidak ada pergerakan lebih lanjut yang valid setelah titik ini. Segala upaya untuk bergerak setelah hasil imbang juga akan gagal.

Bagian kedua dari skenario pengujian kontrak TicTacToe menunjukkan skenario gambar ini. Ini mensimulasikan serangkaian gerakan yang menghasilkan hasil imbang dan memverifikasi bahwa kontrak menanganinya dengan benar.

Disclaimer
* Crypto investment involves significant risks. Please proceed with caution. The course is not intended as investment advice.
* The course is created by the author who has joined Gate Learn. Any opinion shared by the author does not represent Gate Learn.