Mari kita mulai dengan menjelajahi kontrak kami untuk game TicTacToe:
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.
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 dikemas dalam fungsi play
. Ia melakukan beberapa pemeriksaan untuk memastikan langkah yang valid:
nextPlayer
.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.
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.
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 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 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.
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.
Mari kita mulai dengan menjelajahi kontrak kami untuk game TicTacToe:
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.
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 dikemas dalam fungsi play
. Ia melakukan beberapa pemeriksaan untuk memastikan langkah yang valid:
nextPlayer
.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.
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.
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 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 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.
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.