Guest User

Bitburner 5x5 go script

a guest
Jul 21st, 2024
1,135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /** @param {NS} ns */
  2. export async function main(ns) {
  3.   let opponent = "Daedalus"
  4.   if (ns.args.length > 0) {
  5.     opponent = ns.args[0]
  6.   }
  7.   //Check if board is orderly generated
  8.   if (JSON.stringify(ns.go.getBoardState()).includes("#")) {
  9.     ns.print("Started with invalid board, regenerating")
  10.     await generate_board(opponent, ns)
  11.   }
  12.  
  13.   while (true) {
  14.     let currentplayer = ns.go.getCurrentPlayer()
  15.     if (currentplayer == "None") {
  16.       ns.print("Finished game, regenerating")
  17.       //Only record won games
  18.       let gamestate = ns.go.getGameState()
  19.       if (gamestate.whiteScore < gamestate.blackScore) {
  20.         logger(ns)
  21.       }
  22.       await generate_board(opponent, ns)
  23.     } else if (currentplayer == "Black") {
  24.       ns.print("Making a move")
  25.       //Make move
  26.       let move_successful = make_move(ns)
  27.       if (!move_successful) {
  28.         ns.tprint("Unknown Go-state, please resolve!")
  29.         let current_board = JSON.stringify(ns.go.getBoardState())
  30.         while (current_board == JSON.stringify(ns.go.getBoardState()) && ns.go.getCurrentPlayer() == "Black") {
  31.           await ns.sleep(1000)
  32.         }
  33.       }
  34.     } else {
  35.       await ns.sleep(100)
  36.     }
  37.   }
  38. }
  39.  
  40. /** @param {NS} ns */
  41. async function generate_board(opponent, ns) {
  42.   while (true) {
  43.     ns.go.resetBoardState(opponent, 5)
  44.     let is_full_board = true
  45.     let board = ns.go.getBoardState()
  46.     for (let row of board) {
  47.       if (row != ".....") {
  48.         is_full_board = false
  49.         break
  50.       }
  51.     }
  52.     if (is_full_board) {
  53.       ns.print("Full board available")
  54.       return
  55.     }
  56.     await ns.sleep(1)
  57.   }
  58. }
  59.  
  60. /** @param {NS} ns */
  61. function logger(ns) {
  62.   let history = ns.go.getMoveHistory()
  63.   history.reverse()
  64.   history.push(ns.go.getBoardState())
  65.  
  66.   let boardstring_end = JSON.stringify(ns.go.getBoardState())
  67.  
  68.   let knowledge = JSON.parse(ns.read("Gostates.txt"))
  69.   let move_by = ""
  70.   for (let boardidx in history) {
  71.     if (boardidx == 0) {
  72.       //non-player move
  73.       continue
  74.     }
  75.     let mademove = [-1, -1] //default to pass
  76.     let boardstring = JSON.stringify(history[boardidx - 1])
  77.     //ns.tprint("boardidx ", boardidx, " board ", history[boardidx])
  78.     for (let rowidx in history[boardidx]) {
  79.       for (let colidx in history[boardidx][rowidx]) {
  80.         if (history[boardidx][rowidx][colidx] != history[boardidx - 1][rowidx][colidx] && history[boardidx][rowidx][colidx] != ".") {
  81.           if (move_by == history[boardidx][rowidx][colidx] && move_by == "O") {
  82.             //This happens if a player has passed!
  83.             record_knowledge(boardstring, knowledge, [-1, -1], ns)
  84.           }
  85.           move_by = history[boardidx][rowidx][colidx]
  86.           mademove = [rowidx, colidx]
  87.         }
  88.       }
  89.     }
  90.     if (move_by == "X") {
  91.       record_knowledge(boardstring, knowledge, mademove, ns)
  92.     }
  93.   }
  94.   //record the final pass
  95.   record_knowledge(boardstring_end, knowledge, [-1, -1], ns)
  96.  
  97.   //ns.tprint(knowledge)
  98.   ns.write("Gostates.txt", JSON.stringify(knowledge), "w")
  99. }
  100.  
  101. /** @param {NS} ns */
  102. function record_knowledge(boardstring, knowledge, mademove, ns, recursivecall = false) {
  103.   let flag_in_knowledge = false
  104.   for (let element of knowledge) {
  105.     if (element[0] == boardstring) {
  106.       flag_in_knowledge = true
  107.       break
  108.     }
  109.   }
  110.   if (!flag_in_knowledge) {
  111.     knowledge.push([boardstring, mademove])
  112.    
  113.     if (!recursivecall) {
  114.       //create transformations and save them as well
  115.       let board = JSON.parse(boardstring)
  116.       let passed = false
  117.       if (mademove[0] == -1) {
  118.         passed = true
  119.       }
  120.       //mirror top-bottom
  121.       board.reverse()
  122.       if (!passed) {
  123.         mademove = [4 - mademove[0], mademove[1]]
  124.       }
  125.       boardstring = JSON.stringify(board)
  126.       record_knowledge(boardstring, knowledge, mademove, ns, true)
  127.       //mirror left-right
  128.       for (let rowidx in board) {
  129.         board[rowidx] = board[rowidx].split("").reverse().join("")
  130.       }
  131.       if (!passed) {
  132.         mademove = [mademove[0], 4 - mademove[1]]
  133.       }
  134.       boardstring = JSON.stringify(board)
  135.       record_knowledge(boardstring, knowledge, mademove, ns, true)
  136.  
  137.       //mirror back top-bottom
  138.       board.reverse()
  139.       if (!passed) {
  140.         mademove = [4 - mademove[0], mademove[1]]
  141.       }
  142.       boardstring = JSON.stringify(board)
  143.       record_knowledge(boardstring, knowledge, mademove, ns, true)
  144.     }
  145.   }
  146. }
  147.  
  148. /** @param {NS} ns */
  149. function make_move(ns) {
  150.   // Returns true if move could be made, false otherwise
  151.   let knowledge = JSON.parse(ns.read("Gostates.txt"))
  152.   let boardstring = JSON.stringify(ns.go.getBoardState())
  153.   for (let element of knowledge) {
  154.     if (element[0] == boardstring) {
  155.       if (element[1][0] == -1) {
  156.         ns.go.passTurn()
  157.       } else {
  158.         ns.go.makeMove(element[1][0], element[1][1])
  159.       }
  160.       return true
  161.     }
  162.   }
  163.   return false
  164. }
Tags: Bitburner
Advertisement
Add Comment
Please, Sign In to add comment