Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /** @param {NS} ns */
- export async function main(ns) {
- let opponent = "Daedalus"
- if (ns.args.length > 0) {
- opponent = ns.args[0]
- }
- //Check if board is orderly generated
- if (JSON.stringify(ns.go.getBoardState()).includes("#")) {
- ns.print("Started with invalid board, regenerating")
- await generate_board(opponent, ns)
- }
- while (true) {
- let currentplayer = ns.go.getCurrentPlayer()
- if (currentplayer == "None") {
- ns.print("Finished game, regenerating")
- //Only record won games
- let gamestate = ns.go.getGameState()
- if (gamestate.whiteScore < gamestate.blackScore) {
- logger(ns)
- }
- await generate_board(opponent, ns)
- } else if (currentplayer == "Black") {
- ns.print("Making a move")
- //Make move
- let move_successful = make_move(ns)
- if (!move_successful) {
- ns.tprint("Unknown Go-state, please resolve!")
- let current_board = JSON.stringify(ns.go.getBoardState())
- while (current_board == JSON.stringify(ns.go.getBoardState()) && ns.go.getCurrentPlayer() == "Black") {
- await ns.sleep(1000)
- }
- }
- } else {
- await ns.sleep(100)
- }
- }
- }
- /** @param {NS} ns */
- async function generate_board(opponent, ns) {
- while (true) {
- ns.go.resetBoardState(opponent, 5)
- let is_full_board = true
- let board = ns.go.getBoardState()
- for (let row of board) {
- if (row != ".....") {
- is_full_board = false
- break
- }
- }
- if (is_full_board) {
- ns.print("Full board available")
- return
- }
- await ns.sleep(1)
- }
- }
- /** @param {NS} ns */
- function logger(ns) {
- let history = ns.go.getMoveHistory()
- history.reverse()
- history.push(ns.go.getBoardState())
- let boardstring_end = JSON.stringify(ns.go.getBoardState())
- let knowledge = JSON.parse(ns.read("Gostates.txt"))
- let move_by = ""
- for (let boardidx in history) {
- if (boardidx == 0) {
- //non-player move
- continue
- }
- let mademove = [-1, -1] //default to pass
- let boardstring = JSON.stringify(history[boardidx - 1])
- //ns.tprint("boardidx ", boardidx, " board ", history[boardidx])
- for (let rowidx in history[boardidx]) {
- for (let colidx in history[boardidx][rowidx]) {
- if (history[boardidx][rowidx][colidx] != history[boardidx - 1][rowidx][colidx] && history[boardidx][rowidx][colidx] != ".") {
- if (move_by == history[boardidx][rowidx][colidx] && move_by == "O") {
- //This happens if a player has passed!
- record_knowledge(boardstring, knowledge, [-1, -1], ns)
- }
- move_by = history[boardidx][rowidx][colidx]
- mademove = [rowidx, colidx]
- }
- }
- }
- if (move_by == "X") {
- record_knowledge(boardstring, knowledge, mademove, ns)
- }
- }
- //record the final pass
- record_knowledge(boardstring_end, knowledge, [-1, -1], ns)
- //ns.tprint(knowledge)
- ns.write("Gostates.txt", JSON.stringify(knowledge), "w")
- }
- /** @param {NS} ns */
- function record_knowledge(boardstring, knowledge, mademove, ns, recursivecall = false) {
- let flag_in_knowledge = false
- for (let element of knowledge) {
- if (element[0] == boardstring) {
- flag_in_knowledge = true
- break
- }
- }
- if (!flag_in_knowledge) {
- knowledge.push([boardstring, mademove])
- if (!recursivecall) {
- //create transformations and save them as well
- let board = JSON.parse(boardstring)
- let passed = false
- if (mademove[0] == -1) {
- passed = true
- }
- //mirror top-bottom
- board.reverse()
- if (!passed) {
- mademove = [4 - mademove[0], mademove[1]]
- }
- boardstring = JSON.stringify(board)
- record_knowledge(boardstring, knowledge, mademove, ns, true)
- //mirror left-right
- for (let rowidx in board) {
- board[rowidx] = board[rowidx].split("").reverse().join("")
- }
- if (!passed) {
- mademove = [mademove[0], 4 - mademove[1]]
- }
- boardstring = JSON.stringify(board)
- record_knowledge(boardstring, knowledge, mademove, ns, true)
- //mirror back top-bottom
- board.reverse()
- if (!passed) {
- mademove = [4 - mademove[0], mademove[1]]
- }
- boardstring = JSON.stringify(board)
- record_knowledge(boardstring, knowledge, mademove, ns, true)
- }
- }
- }
- /** @param {NS} ns */
- function make_move(ns) {
- // Returns true if move could be made, false otherwise
- let knowledge = JSON.parse(ns.read("Gostates.txt"))
- let boardstring = JSON.stringify(ns.go.getBoardState())
- for (let element of knowledge) {
- if (element[0] == boardstring) {
- if (element[1][0] == -1) {
- ns.go.passTurn()
- } else {
- ns.go.makeMove(element[1][0], element[1][1])
- }
- return true
- }
- }
- return false
- }
Advertisement
Add Comment
Please, Sign In to add comment