tx · 9UJfb1FGi8q23ZuKnmBA2AjutZKFwjbYqEngQTy5djbu

3Mr1J95HgTFuj93Uh61WS1PBrxc5hSx5uE5:  -0.05000000 Waves

2024.07.28 12:39 [3213762] smart account 3Mr1J95HgTFuj93Uh61WS1PBrxc5hSx5uE5 > SELF 0.00000000 Waves

{ "type": 13, "id": "9UJfb1FGi8q23ZuKnmBA2AjutZKFwjbYqEngQTy5djbu", "fee": 5000000, "feeAssetId": null, "timestamp": 1722159535914, "version": 2, "chainId": 84, "sender": "3Mr1J95HgTFuj93Uh61WS1PBrxc5hSx5uE5", "senderPublicKey": "DhKSnv34wE65np8uDd8E6ygEbNsn6fHx9p7q4hJTcgRw", "proofs": [ "2xUnrZGhN9tY1qaZUqmBJg5WgR28jeTTZydXjpiVbeFsb8JKggP219udYidyNRQmkRGW5dz8z1RzEmng5gton2DX" ], "script": "base64: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AAAAAgUAAAAMY3VycmVudEJvYXJkAAAAAAAAAAAGBgkAAAAAAAACCQEAAAAGY2hhckF0AAAAAgUAAAAMY3VycmVudEJvYXJkAAAAAAAAAAAGAgAAAAEwBgcEAAAAFWVpZ2h0aFBvc2l0aW9uQ29ycmVjdAMDCQAAAAAAAAIJAQAAAAZjaGFyQXQAAAACBQAAAAVib2FyZAAAAAAAAAAABwkBAAAABmNoYXJBdAAAAAIFAAAADGN1cnJlbnRCb2FyZAAAAAAAAAAABwYJAAAAAAAAAgkBAAAABmNoYXJBdAAAAAIFAAAADGN1cnJlbnRCb2FyZAAAAAAAAAAABwIAAAABMAYHBAAAABRuaW50aFBvc2l0aW9uQ29ycmVjdAMDCQAAAAAAAAIJAQAAAAZjaGFyQXQAAAACBQAAAAVib2FyZAAAAAAAAAAACAkBAAAABmNoYXJBdAAAAAIFAAAADGN1cnJlbnRCb2FyZAAAAAAAAAAACAYJAAAAAAAAAgkBAAAABmNoYXJBdAAAAAIFAAAADGN1cnJlbnRCb2FyZAAAAAAAAAAACAIAAAABMAYHBAAAABhub09sZFBvc2l0aW9uT3ZlcndyaXR0ZW4DAwMDAwMDAwUAAAAUZmlyc3RQb3NpdGlvbkNvcnJlY3QFAAAAFXNlY29uZFBvc2l0aW9uQ29ycmVjdAcFAAAAFHRoaXJkUG9zaXRpb25Db3JyZWN0BwUAAAAVZm91cnRoUG9zaXRpb25Db3JyZWN0BwUAAAAUZmlmdGhQb3NpdGlvbkNvcnJlY3QHBQAAABRzaXh0aFBvc2l0aW9uQ29ycmVjdAcFAAAAFnNldmVudGhQb3NpdGlvbkNvcnJlY3QHBQAAABVlaWdodGhQb3NpdGlvbkNvcnJlY3QHBQAAABRuaW50aFBvc2l0aW9uQ29ycmVjdAcEAAAACmNvdW50TW92ZXMJAABkAAAAAgkAAGQAAAACCQAAZAAAAAIJAABkAAAAAgkAAGQAAAACCQAAZAAAAAIJAABkAAAAAgkAAGQAAAACBQAAAA1maXJzdFNlbGVjdGVkBQAAAA5zZWNvbmRTZWxlY3RlZAUAAAANdGhpcmRTZWxlY3RlZAUAAAAOZm91cnRoU2VsZWN0ZWQFAAAADWZpZnRoU2VsZWN0ZWQFAAAADXNpeHRoU2VsZWN0ZWQFAAAA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BQAAAAlpbml0aWF0b3IJAAACAAAAAQIAAAAoT25seSBpbml0aWF0b3IgaXMgYWxsb3dlZCB0byBtYWtlIG1vdmVzIQQAAAATbW92ZU9mUGxheWVySXNWYWxpZAkBAAAAEmNoZWNrSWZNb3ZlSXNWYWxpZAAAAAIFAAAABmdhbWVJZAUAAAAFYm9hcmQDCQEAAAABIQAAAAEFAAAAE21vdmVPZlBsYXllcklzVmFsaWQJAAACAAAAAQIAAAANSWxsZWdhbCBtb3ZlIQQAAAAMcGxheWVySGFzV29uCQEAAAATY2hlY2tJZlBsYXllckhhc1dvbgAAAAMFAAAABmdhbWVJZAUAAAAFYm9hcmQFAAAABlBMQVlFUgQAAAAVbnVtYmVyT2ZQb3NzaWJsZU1vdmVzCQEAAAAVZ2V0UG9zc2libGVNb3Zlc0NvdW50AAAAAQUAAAAFYm9hcmQDBQAAAAxwbGF5ZXJIYXNXb24JAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkAASwAAAACAgAAAA1jdXJyZW50Qm9hcmRfBQAAAAZnYW1lSWQFAAAABWJvYXJkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAAEsAAAAAgIAAAAHd2lubmVyXwUAAAAGZ2FtZUlkAgAAAAZwbGF5ZXIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAGc2VuZGVyBQAAAA5XSU5OSU5HX0FNT1VOVAUAAAAMQkFJX0FTU0VUX0lEBQAAAANuaWwDCQAAAAAAAAIFAAAAFW51bWJlck9mUG9zc2libGVNb3ZlcwAAAAAAAAAAAAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQABLAAAAAICAAAADWN1cnJlbnRCb2FyZF8FAAAABmdhbWVJZAUAAAAFYm9hcmQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkAASwAAAACAgAAAAd3aW5uZXJfBQAAAAZnYW1lSWQCAAAABGRyYXcFAAAAA25pbAQAAAAIbmV4dE1vdmUJAAP8AAAABAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEFAAAADEJBSV9DT05UUkFDVAIAAAAUcmVnaXN0ZXJUYXNrQ2FsbGJhY2sJAARMAAAAAgkAASwAAAACCQABLAAAAAIFAAAABmdhbWVJZAIAAAABXwUAAAAFYm9hcmQJAARMAAAAAgIAAAAJdGljdGFjdG9lCQAETAAAAAICAAAACGNhbGxiYWNrBQAAAANuaWwJAARMAAAAAgkBAAAAD0F0dGFjaGVkUGF5bWVudAAAAAIFAAAADEJBSV9BU1NFVF9JRAAAAAAAAJiWgAUAAAADbmlsAwkAAAAAAAACBQAAAAhuZXh0TW92ZQUAAAAIbmV4dE1vdmUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkAASwAAAACAgAAAA1jdXJyZW50Qm9hcmRfBQAAAAZnYW1lSWQFAAAABWJvYXJkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAAEsAAAAAgIAAAAKaW5pdGlhdG9yXwUAAAAGZ2FtZUlkCQAEJQAAAAEFAAAABnNlbmRlcgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQABLAAAAAICAAAADG5leHRfcGxheWVyXwUAAAAGZ2FtZUlkBQAAAAJBSQUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V53AYHQg==", "height": 3213762, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BKyNJQfPSFqqGiw9KhkiitbSi5SuPDLAxkaBA1NhnXbL Next: GcQaDNHmT1syezTKm3oevMiBGiNkXnrPsF41So8rqWyd Diff:
OldNewDifferences
188188 }
189189
190190
191+func getPossibleMovesCount (board) = {
192+ let firstMovePossible = if ((charAt(board, 0) == "0"))
193+ then 1
194+ else 0
195+ let secondMovePossible = if ((charAt(board, 1) == "0"))
196+ then 1
197+ else 0
198+ let thirdMovePossible = if ((charAt(board, 2) == "0"))
199+ then 1
200+ else 0
201+ let fourthMovePossible = if ((charAt(board, 3) == "0"))
202+ then 1
203+ else 0
204+ let fifthMovePossible = if ((charAt(board, 4) == "0"))
205+ then 1
206+ else 0
207+ let sixthMovePossible = if ((charAt(board, 5) == "0"))
208+ then 1
209+ else 0
210+ let seventhMovePossible = if ((charAt(board, 6) == "0"))
211+ then 1
212+ else 0
213+ let eigthMovePossible = if ((charAt(board, 7) == "0"))
214+ then 1
215+ else 0
216+ let ninthMovePossible = if ((charAt(board, 8) == "0"))
217+ then 1
218+ else 0
219+ ((((((((firstMovePossible + secondMovePossible) + thirdMovePossible) + fourthMovePossible) + fifthMovePossible) + sixthMovePossible) + seventhMovePossible) + eigthMovePossible) + ninthMovePossible)
220+ }
221+
222+
191223 @Callable(i)
192224 func callback (gameIdAndBoard) = {
193225 let parts = split(gameIdAndBoard, "_")
194226 let gameId = parts[0]
195227 let board = parts[1]
228+ let nextPlayer = match getString(("next_player_" + gameId)) {
229+ case s: String =>
230+ s
231+ case _ =>
232+ ""
233+ }
196234 let moveOfAIIsValid = checkIfMoveIsValid(gameId, board)
197235 if (!(moveOfAIIsValid))
198236 then throw("Illegal move!")
199- else {
200- let aiHasWon = checkIfPlayerHasWon(gameId, board, AI)
201- if (aiHasWon)
202- then [StringEntry(("currentBoard_" + gameId), board), StringEntry(("winner_" + gameId), "ai")]
203- else [StringEntry(("currentBoard_" + gameId), board)]
204- }
237+ else if ((nextPlayer != AI))
238+ then throw("Player has to move first!")
239+ else {
240+ let aiHasWon = checkIfPlayerHasWon(gameId, board, AI)
241+ if (aiHasWon)
242+ then [StringEntry(("currentBoard_" + gameId), board), StringEntry(("winner_" + gameId), "ai")]
243+ else [StringEntry(("currentBoard_" + gameId), board), StringEntry(("next_player_" + gameId), PLAYER)]
244+ }
205245 }
206246
207247
230270 let gameId = if ((size(game) == 0))
231271 then toBase58String(i.transactionId)
232272 else game
233- let currentBoard = match getString(("currentBoard_" + gameId)) {
273+ let nextPlayer = match getString(("next_player_" + gameId)) {
234274 case s: String =>
235275 s
236276 case _ =>
237- board
277+ PLAYER
238278 }
239- let initiator = match getString(("initiator_" + gameId)) {
240- case s: String =>
241- s
242- case _ =>
243- toString(sender)
244- }
245- if ((toString(sender) != initiator))
246- then throw("Only initiator is allowed to make moves!")
279+ if ((nextPlayer != PLAYER))
280+ then throw("AI hast to move first!")
247281 else {
248- let moveOfPlayerIsValid = checkIfMoveIsValid(gameId, board)
249- if (!(moveOfPlayerIsValid))
250- then throw("Illegal move!")
282+ let currentBoard = match getString(("currentBoard_" + gameId)) {
283+ case s: String =>
284+ s
285+ case _ =>
286+ board
287+ }
288+ let initiator = match getString(("initiator_" + gameId)) {
289+ case s: String =>
290+ s
291+ case _ =>
292+ toString(sender)
293+ }
294+ if ((toString(sender) != initiator))
295+ then throw("Only initiator is allowed to make moves!")
251296 else {
252- let playerHasWon = checkIfPlayerHasWon(gameId, board, PLAYER)
253- if (playerHasWon)
254- then [StringEntry(("currentBoard_" + gameId), board), StringEntry(("winner_" + gameId), "player"), ScriptTransfer(sender, WINNING_AMOUNT, BAI_ASSET_ID)]
297+ let moveOfPlayerIsValid = checkIfMoveIsValid(gameId, board)
298+ if (!(moveOfPlayerIsValid))
299+ then throw("Illegal move!")
255300 else {
256- let nextMove = invoke(Address(fromBase58String(BAI_CONTRACT)), "registerTaskCallback", [((gameId + "_") + board), "tictactoe", "callback"], [AttachedPayment(BAI_ASSET_ID, 10000000)])
257- if ((nextMove == nextMove))
258- then [StringEntry(("currentBoard_" + gameId), board), StringEntry(("initiator_" + gameId), toString(sender))]
259- else throw("Strict value is not equal to itself.")
301+ let playerHasWon = checkIfPlayerHasWon(gameId, board, PLAYER)
302+ let numberOfPossibleMoves = getPossibleMovesCount(board)
303+ if (playerHasWon)
304+ then [StringEntry(("currentBoard_" + gameId), board), StringEntry(("winner_" + gameId), "player"), ScriptTransfer(sender, WINNING_AMOUNT, BAI_ASSET_ID)]
305+ else if ((numberOfPossibleMoves == 0))
306+ then [StringEntry(("currentBoard_" + gameId), board), StringEntry(("winner_" + gameId), "draw")]
307+ else {
308+ let nextMove = invoke(Address(fromBase58String(BAI_CONTRACT)), "registerTaskCallback", [((gameId + "_") + board), "tictactoe", "callback"], [AttachedPayment(BAI_ASSET_ID, 10000000)])
309+ if ((nextMove == nextMove))
310+ then [StringEntry(("currentBoard_" + gameId), board), StringEntry(("initiator_" + gameId), toString(sender)), StringEntry(("next_player_" + gameId), AI)]
311+ else throw("Strict value is not equal to itself.")
312+ }
260313 }
261314 }
262315 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let BAI_CONTRACT = "3N9tKixzqTYWnEXQxrDQ5pBTGvQd6sFsvmV"
55
66 let BAI_ASSET_ID = base58'AxGKQRxKo4F2EbhrRq6N2tdLsxtMnpzQsS4QemV6V1W1'
77
88 let PLAYER = "1"
99
1010 let AI = "2"
1111
1212 let WINNING_AMOUNT = 100000000
1313
1414 func charAt (str,i) = split(str, "")[i]
1515
1616
1717 func checkIfMoveIsValid (gameId,board) = {
1818 let currentBoard = match getString(("currentBoard_" + gameId)) {
1919 case s: String =>
2020 s
2121 case _ =>
2222 "000000000"
2323 }
2424 let firstSelected = if ((charAt(board, 0) != charAt(currentBoard, 0)))
2525 then 1
2626 else 0
2727 let secondSelected = if ((charAt(board, 1) != charAt(currentBoard, 1)))
2828 then 1
2929 else 0
3030 let thirdSelected = if ((charAt(board, 2) != charAt(currentBoard, 2)))
3131 then 1
3232 else 0
3333 let fourthSelected = if ((charAt(board, 3) != charAt(currentBoard, 3)))
3434 then 1
3535 else 0
3636 let fifthSelected = if ((charAt(board, 4) != charAt(currentBoard, 4)))
3737 then 1
3838 else 0
3939 let sixthSelected = if ((charAt(board, 5) != charAt(currentBoard, 5)))
4040 then 1
4141 else 0
4242 let seventhSelected = if ((charAt(board, 6) != charAt(currentBoard, 6)))
4343 then 1
4444 else 0
4545 let eighthSelected = if ((charAt(board, 7) != charAt(currentBoard, 7)))
4646 then 1
4747 else 0
4848 let ninthSelected = if ((charAt(board, 8) != charAt(currentBoard, 8)))
4949 then 1
5050 else 0
5151 let firstPositionCorrect = if (if ((charAt(board, 0) == charAt(currentBoard, 0)))
5252 then true
5353 else (charAt(currentBoard, 0) == "0"))
5454 then true
5555 else false
5656 let secondPositionCorrect = if (if ((charAt(board, 1) == charAt(currentBoard, 1)))
5757 then true
5858 else (charAt(currentBoard, 1) == "0"))
5959 then true
6060 else false
6161 let thirdPositionCorrect = if (if ((charAt(board, 2) == charAt(currentBoard, 2)))
6262 then true
6363 else (charAt(currentBoard, 2) == "0"))
6464 then true
6565 else false
6666 let fourthPositionCorrect = if (if ((charAt(board, 3) == charAt(currentBoard, 3)))
6767 then true
6868 else (charAt(currentBoard, 3) == "0"))
6969 then true
7070 else false
7171 let fifthPositionCorrect = if (if ((charAt(board, 4) == charAt(currentBoard, 4)))
7272 then true
7373 else (charAt(currentBoard, 4) == "0"))
7474 then true
7575 else false
7676 let sixthPositionCorrect = if (if ((charAt(board, 5) == charAt(currentBoard, 5)))
7777 then true
7878 else (charAt(currentBoard, 5) == "0"))
7979 then true
8080 else false
8181 let seventhPositionCorrect = if (if ((charAt(board, 6) == charAt(currentBoard, 6)))
8282 then true
8383 else (charAt(currentBoard, 6) == "0"))
8484 then true
8585 else false
8686 let eighthPositionCorrect = if (if ((charAt(board, 7) == charAt(currentBoard, 7)))
8787 then true
8888 else (charAt(currentBoard, 7) == "0"))
8989 then true
9090 else false
9191 let ninthPositionCorrect = if (if ((charAt(board, 8) == charAt(currentBoard, 8)))
9292 then true
9393 else (charAt(currentBoard, 8) == "0"))
9494 then true
9595 else false
9696 let noOldPositionOverwritten = if (if (if (if (if (if (if (if (firstPositionCorrect)
9797 then secondPositionCorrect
9898 else false)
9999 then thirdPositionCorrect
100100 else false)
101101 then fourthPositionCorrect
102102 else false)
103103 then fifthPositionCorrect
104104 else false)
105105 then sixthPositionCorrect
106106 else false)
107107 then seventhPositionCorrect
108108 else false)
109109 then eighthPositionCorrect
110110 else false)
111111 then ninthPositionCorrect
112112 else false
113113 let countMoves = ((((((((firstSelected + secondSelected) + thirdSelected) + fourthSelected) + fifthSelected) + sixthSelected) + seventhSelected) + eighthSelected) + ninthSelected)
114114 let onlyOneMove = (1 >= countMoves)
115115 if ((countMoves > 1))
116116 then throw("More than move made!")
117117 else if (!(noOldPositionOverwritten))
118118 then throw("Former position overwritten!")
119119 else if (noOldPositionOverwritten)
120120 then onlyOneMove
121121 else false
122122 }
123123
124124
125125 func checkIfPlayerHasWon (gameId,board,player) = {
126126 let currentBoard = match getString(("currentBoard_" + gameId)) {
127127 case s: String =>
128128 s
129129 case _ =>
130130 "000000000"
131131 }
132132 let winningCombinations = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6]]
133133 let topRow = if (if ((charAt(currentBoard, winningCombinations[0][0]) == player))
134134 then (charAt(currentBoard, winningCombinations[0][1]) == player)
135135 else false)
136136 then (charAt(currentBoard, winningCombinations[0][2]) == player)
137137 else false
138138 let middleRow = if (if ((charAt(currentBoard, winningCombinations[1][0]) == player))
139139 then (charAt(currentBoard, winningCombinations[1][1]) == player)
140140 else false)
141141 then (charAt(currentBoard, winningCombinations[1][2]) == player)
142142 else false
143143 let bottomRow = if (if ((charAt(currentBoard, winningCombinations[2][0]) == player))
144144 then (charAt(currentBoard, winningCombinations[2][1]) == player)
145145 else false)
146146 then (charAt(currentBoard, winningCombinations[2][2]) == player)
147147 else false
148148 let leftColumn = if (if ((charAt(currentBoard, winningCombinations[3][0]) == player))
149149 then (charAt(currentBoard, winningCombinations[3][1]) == player)
150150 else false)
151151 then (charAt(currentBoard, winningCombinations[3][2]) == player)
152152 else false
153153 let middleColumn = if (if ((charAt(currentBoard, winningCombinations[4][0]) == player))
154154 then (charAt(currentBoard, winningCombinations[4][1]) == player)
155155 else false)
156156 then (charAt(currentBoard, winningCombinations[4][2]) == player)
157157 else false
158158 let rightColumn = if (if ((charAt(currentBoard, winningCombinations[5][0]) == player))
159159 then (charAt(currentBoard, winningCombinations[5][1]) == player)
160160 else false)
161161 then (charAt(currentBoard, winningCombinations[5][2]) == player)
162162 else false
163163 let diagonalOne = if (if ((charAt(currentBoard, winningCombinations[6][0]) == player))
164164 then (charAt(currentBoard, winningCombinations[6][1]) == player)
165165 else false)
166166 then (charAt(currentBoard, winningCombinations[6][2]) == player)
167167 else false
168168 let diagonalTwo = if (if ((charAt(currentBoard, winningCombinations[7][0]) == player))
169169 then (charAt(currentBoard, winningCombinations[7][1]) == player)
170170 else false)
171171 then (charAt(currentBoard, winningCombinations[7][2]) == player)
172172 else false
173173 if (if (if (if (if (if (if (topRow)
174174 then true
175175 else middleRow)
176176 then true
177177 else bottomRow)
178178 then true
179179 else leftColumn)
180180 then true
181181 else middleRow)
182182 then true
183183 else rightColumn)
184184 then true
185185 else diagonalOne)
186186 then true
187187 else diagonalTwo
188188 }
189189
190190
191+func getPossibleMovesCount (board) = {
192+ let firstMovePossible = if ((charAt(board, 0) == "0"))
193+ then 1
194+ else 0
195+ let secondMovePossible = if ((charAt(board, 1) == "0"))
196+ then 1
197+ else 0
198+ let thirdMovePossible = if ((charAt(board, 2) == "0"))
199+ then 1
200+ else 0
201+ let fourthMovePossible = if ((charAt(board, 3) == "0"))
202+ then 1
203+ else 0
204+ let fifthMovePossible = if ((charAt(board, 4) == "0"))
205+ then 1
206+ else 0
207+ let sixthMovePossible = if ((charAt(board, 5) == "0"))
208+ then 1
209+ else 0
210+ let seventhMovePossible = if ((charAt(board, 6) == "0"))
211+ then 1
212+ else 0
213+ let eigthMovePossible = if ((charAt(board, 7) == "0"))
214+ then 1
215+ else 0
216+ let ninthMovePossible = if ((charAt(board, 8) == "0"))
217+ then 1
218+ else 0
219+ ((((((((firstMovePossible + secondMovePossible) + thirdMovePossible) + fourthMovePossible) + fifthMovePossible) + sixthMovePossible) + seventhMovePossible) + eigthMovePossible) + ninthMovePossible)
220+ }
221+
222+
191223 @Callable(i)
192224 func callback (gameIdAndBoard) = {
193225 let parts = split(gameIdAndBoard, "_")
194226 let gameId = parts[0]
195227 let board = parts[1]
228+ let nextPlayer = match getString(("next_player_" + gameId)) {
229+ case s: String =>
230+ s
231+ case _ =>
232+ ""
233+ }
196234 let moveOfAIIsValid = checkIfMoveIsValid(gameId, board)
197235 if (!(moveOfAIIsValid))
198236 then throw("Illegal move!")
199- else {
200- let aiHasWon = checkIfPlayerHasWon(gameId, board, AI)
201- if (aiHasWon)
202- then [StringEntry(("currentBoard_" + gameId), board), StringEntry(("winner_" + gameId), "ai")]
203- else [StringEntry(("currentBoard_" + gameId), board)]
204- }
237+ else if ((nextPlayer != AI))
238+ then throw("Player has to move first!")
239+ else {
240+ let aiHasWon = checkIfPlayerHasWon(gameId, board, AI)
241+ if (aiHasWon)
242+ then [StringEntry(("currentBoard_" + gameId), board), StringEntry(("winner_" + gameId), "ai")]
243+ else [StringEntry(("currentBoard_" + gameId), board), StringEntry(("next_player_" + gameId), PLAYER)]
244+ }
205245 }
206246
207247
208248
209249 @Callable(i)
210250 func playTTT (game,board) = {
211251 let numberOfPayments = size(i.payments)
212252 if ((numberOfPayments != 1))
213253 then throw("Payment necessary!")
214254 else {
215255 let payment = i.payments[0]
216256 let fee = payment.amount
217257 let feeAssetId = payment.assetId
218258 let minFee = match getInteger(Address(fromBase58String(BAI_CONTRACT)), "price_tictactoe") {
219259 case n: Int =>
220260 n
221261 case _ =>
222262 0
223263 }
224264 if (if ((feeAssetId != BAI_ASSET_ID))
225265 then true
226266 else (minFee > fee))
227267 then throw("Payment of the minimal BAI amount necessary!")
228268 else {
229269 let sender = i.caller
230270 let gameId = if ((size(game) == 0))
231271 then toBase58String(i.transactionId)
232272 else game
233- let currentBoard = match getString(("currentBoard_" + gameId)) {
273+ let nextPlayer = match getString(("next_player_" + gameId)) {
234274 case s: String =>
235275 s
236276 case _ =>
237- board
277+ PLAYER
238278 }
239- let initiator = match getString(("initiator_" + gameId)) {
240- case s: String =>
241- s
242- case _ =>
243- toString(sender)
244- }
245- if ((toString(sender) != initiator))
246- then throw("Only initiator is allowed to make moves!")
279+ if ((nextPlayer != PLAYER))
280+ then throw("AI hast to move first!")
247281 else {
248- let moveOfPlayerIsValid = checkIfMoveIsValid(gameId, board)
249- if (!(moveOfPlayerIsValid))
250- then throw("Illegal move!")
282+ let currentBoard = match getString(("currentBoard_" + gameId)) {
283+ case s: String =>
284+ s
285+ case _ =>
286+ board
287+ }
288+ let initiator = match getString(("initiator_" + gameId)) {
289+ case s: String =>
290+ s
291+ case _ =>
292+ toString(sender)
293+ }
294+ if ((toString(sender) != initiator))
295+ then throw("Only initiator is allowed to make moves!")
251296 else {
252- let playerHasWon = checkIfPlayerHasWon(gameId, board, PLAYER)
253- if (playerHasWon)
254- then [StringEntry(("currentBoard_" + gameId), board), StringEntry(("winner_" + gameId), "player"), ScriptTransfer(sender, WINNING_AMOUNT, BAI_ASSET_ID)]
297+ let moveOfPlayerIsValid = checkIfMoveIsValid(gameId, board)
298+ if (!(moveOfPlayerIsValid))
299+ then throw("Illegal move!")
255300 else {
256- let nextMove = invoke(Address(fromBase58String(BAI_CONTRACT)), "registerTaskCallback", [((gameId + "_") + board), "tictactoe", "callback"], [AttachedPayment(BAI_ASSET_ID, 10000000)])
257- if ((nextMove == nextMove))
258- then [StringEntry(("currentBoard_" + gameId), board), StringEntry(("initiator_" + gameId), toString(sender))]
259- else throw("Strict value is not equal to itself.")
301+ let playerHasWon = checkIfPlayerHasWon(gameId, board, PLAYER)
302+ let numberOfPossibleMoves = getPossibleMovesCount(board)
303+ if (playerHasWon)
304+ then [StringEntry(("currentBoard_" + gameId), board), StringEntry(("winner_" + gameId), "player"), ScriptTransfer(sender, WINNING_AMOUNT, BAI_ASSET_ID)]
305+ else if ((numberOfPossibleMoves == 0))
306+ then [StringEntry(("currentBoard_" + gameId), board), StringEntry(("winner_" + gameId), "draw")]
307+ else {
308+ let nextMove = invoke(Address(fromBase58String(BAI_CONTRACT)), "registerTaskCallback", [((gameId + "_") + board), "tictactoe", "callback"], [AttachedPayment(BAI_ASSET_ID, 10000000)])
309+ if ((nextMove == nextMove))
310+ then [StringEntry(("currentBoard_" + gameId), board), StringEntry(("initiator_" + gameId), toString(sender)), StringEntry(("next_player_" + gameId), AI)]
311+ else throw("Strict value is not equal to itself.")
312+ }
260313 }
261314 }
262315 }
263316 }
264317 }
265318 }
266319
267320
268321 @Verifier(tx)
269322 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
270323

github/deemru/w8io/169f3d6 
49.52 ms