Guest User

cutil

a guest
Sep 23rd, 2014
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 11.43 KB | None | 0 0
  1. if not os.loadAPI("button") then
  2.     error("Checkers util API requires the button API by minecraftwarlock to run")
  3. end
  4.  
  5. mon = peripheral.wrap("left")
  6.  
  7. button.default()
  8.  
  9. xSize,ySize = mon.getSize()
  10.  
  11. turn = "white"
  12. opponent = "black"
  13. piecesInit = false
  14. turnNum = 1
  15. winner = false
  16.  
  17. function getKeys(tbl)
  18.     local out = {}
  19.     for k,v in pairs(tbl) do
  20.         table.insert(out,k)
  21.     end
  22.     return out
  23. end
  24.  
  25. function toggleTurn()
  26.     if turn == "white" then
  27.         turn = "black"
  28.         opponent = "white"
  29.     else
  30.         turn = "white"
  31.         opponent = "black"
  32.     end
  33. end
  34.  
  35. function isPresent(i,tbl)
  36.     for k,v in ipairs(tbl) do
  37.         if v == i then
  38.             return true
  39.         end
  40.     end
  41.     return false
  42. end
  43.  
  44. function offset(x,coord)
  45.     if string.lower(coord) == "x" then
  46.         return math.floor(xSize / 2) + x
  47.     elseif string.lower(coord) == "y" then
  48.         return math.floor(ySize / 2) + x
  49.     end
  50. end
  51.  
  52. function onBoard(X,Y)
  53.     if X < 1 or X > 8 or Y < 1 or Y > 8 then
  54.         return false
  55.     end
  56.     return true
  57. end
  58.  
  59. function getLength(tbl)
  60.     local out = 0
  61.     for i in ipairs(tbl) do
  62.         out = out + 1
  63.     end
  64. end
  65.  
  66. boardX = offset(-3,"x")
  67. boardY = offset(-3,"y")
  68.  
  69. pieces = {
  70.     ["white"] = {
  71.         ["piece1"] = {x = 7,y = 7,moves = 0,taken = 0,alive = true,king = false,color = colors.white},
  72.         ["piece2"] = {x = 7,y = 5,moves = 0,taken = 0,alive = true,king = false,color = colors.white},
  73.         ["piece3"] = {x = 7,y = 3,moves = 0,taken = 0,alive = true,king = false,color = colors.white},
  74.         ["piece4"] = {x = 5,y = 3,moves = 0,taken = 0,alive = true,king = false,color = colors.white},
  75.         ["piece5"] = {x = 5,y = 5,moves = 0,taken = 0,alive = true,king = false,color = colors.white},
  76.         ["piece6"] = {x = 5,y = 7,moves = 0,taken = 0,alive = true,king = false,color = colors.white},
  77.         ["piece7"] = {x = 3,y = 7,moves = 0,taken = 0,alive = true,king = false,color = colors.white},
  78.         ["piece8"] = {x = 3,y = 5,moves = 0,taken = 0,alive = true,king = false,color = colors.white},
  79.         ["piece9"] = {x = 3,y = 3,moves = 0,taken = 0,alive = true,king = false,color = colors.white},
  80.         ["piece10"] = {x = 5,y = 3,moves = 0,taken = 0,alive = false,king = false,color = colors.white},
  81.         ["piece11"] = {x = 3,y = 5,moves = 0,taken = 0,alive = false,king = false,color = colors.white},
  82.         ["piece12"] = {x = 3,y = 7,moves = 0,taken = 0,alive = false,king = false,color = colors.white}
  83.     },
  84.     ["black"] = {
  85.         ["piece13"] = {x = 6,y = 2,moves = 0,taken = 0,alive = false,king = false,color = colors.black},
  86.         ["piece14"] = {x = 6,y = 4,moves = 0,taken = 0,alive = false,king = false,color = colors.black},
  87.         ["piece15"] = {x = 6,y = 6,moves = 0,taken = 0,alive = false,king = false,color = colors.black},
  88.         ["piece16"] = {x = 6,y = 8,moves = 0,taken = 0,alive = false,king = false,color = colors.black},
  89.         ["piece17"] = {x = 7,y = 1,moves = 0,taken = 0,alive = false,king = false,color = colors.black},
  90.         ["piece18"] = {x = 7,y = 3,moves = 0,taken = 0,alive = false,king = false,color = colors.black},
  91.         ["piece19"] = {x = 7,y = 5,moves = 0,taken = 0,alive = false,king = false,color = colors.black},
  92.         ["piece20"] = {x = 7,y = 7,moves = 0,taken = 0,alive = false,king = false,color = colors.black},
  93.         ["piece21"] = {x = 8,y = 2,moves = 0,taken = 0,alive = false,king = false,color = colors.black},
  94.         ["piece22"] = {x = 8,y = 4,moves = 0,taken = 0,alive = false,king = false,color = colors.black},
  95.         ["piece23"] = {x = 8,y = 6,moves = 0,taken = 0,alive = false,king = false,color = colors.black},
  96.         ["piece24"] = {x = 8,y = 8,moves = 0,taken = 0,alive = true,king = true,color = colors.black}
  97.     }
  98. }
  99.  
  100. alive = {["white"] = {},["black"] = {}}
  101. dead = {["white"] = {},["black"] = {}}
  102.  
  103. function getAlive()
  104.     for i in pairs(pieces) do
  105.         for k,v in pairs(pieces[i]) do
  106.             if v.alive and not isPresent(k,alive[i]) then
  107.                 table.insert(alive[i],k)
  108.             elseif not v.alive then
  109.                 table.insert(dead[i],k)
  110.                 pieces[i][k].alive = "false"
  111.             end
  112.         end
  113.     end
  114. end
  115.  
  116. function getRealCoords(x,y)
  117.     return boardX + x - 1,boardY + y - 1
  118. end
  119.  
  120. function getBoardCoords(x,y)
  121.     return x - boardX + 1,y - boardY + 1
  122. end
  123.  
  124. function cntrdTxt(txt,x,y)
  125.     mon.setBackgroundColor(colors.black)
  126.     mon.setTextColor(colors.white)
  127.     mon.setCursorPos(offset(-1 * (math.floor(string.len(txt) / 2 + x ) - 1),"x"),1 + x)
  128.     mon.write(txt)
  129. end
  130.  
  131. mods = {}
  132.  
  133. function drawRow(side,x,y,ln)
  134.     mon.setCursorPos(x,y)
  135.     for i=1,math.floor(ln / 2) do
  136.         if side == 1 then
  137.             mon.setBackgroundColor(colors.red)
  138.             mon.write(" ")
  139.             mon.setBackgroundColor(colors.black)
  140.             mon.write(" ")
  141.         elseif side == 2 then
  142.             mon.setBackgroundColor(colors.black)
  143.             mon.write(" ")
  144.             mon.setBackgroundColor(colors.red)
  145.             mon.write(" ")
  146.         end
  147.     end
  148. end
  149.  
  150. function board(wdth,hgt)
  151.     button.bg(boardX - 1,boardY - 1,10,10,colors.gray)
  152.     local y = boardY
  153.     for i=1,math.floor(hgt / 2) do
  154.         drawRow(1,boardX,y,wdth)
  155.         y = y + 1
  156.         drawRow(2,boardX,y,wdth)
  157.         y = y + 1
  158.     end
  159. end
  160.  
  161. function mainMenu()
  162.     cntrdTxt("Checkers",0,0)
  163.     button.define("lcl","Local",offset(-6,"x"),offset(-1,"y"),colors.white,colors.red,true)
  164.     button.define("glbl","Globlal",offset(2,"x"),offset(-1,"y"),colors.lightGray,colors.gray,true)
  165.     button.draw("all")
  166.     button.deactivate("glbl")
  167.     local pressed = button.click()
  168.     button.deactivate("all")
  169.     button.erase("all")
  170.     return pressed
  171. end
  172.  
  173. function findPlayer()
  174.     local id = rednet.lookup("cg","cg")
  175.     if type(x) == number then
  176.         os.queueEvent("found_player",id)
  177.     end
  178. end
  179. print("Checkers util API (by minecraftwarlock) loaded")
  180.  
  181. function definePieces()
  182.     for k,v in pairs(pieces) do
  183.         if not piecesInit then 
  184.             for key,value in pairs(pieces[k]) do
  185.                 local x1,y1 = getRealCoords(value.x,value.y)
  186.                 if not value.king then
  187.                     button.define(key,"o",x1,y1,value.color,colors.red,false)
  188.                 else
  189.                     button.define(key,"K",x1,y1,value.color,colors.red,false)
  190.                 end
  191.             end
  192.         else
  193.             for key,value in ipairs(dead[k]) do
  194.                 button.delete(value)
  195.             end
  196.         end
  197.     end
  198.     dead = {white = {},black = {}}
  199. end
  200.  
  201. function occupied(X,Y)
  202.     for i in pairs(alive) do
  203.         for k,v in ipairs(alive[i]) do
  204.             if X == pieces[i][v].x and Y == pieces[i][v].y then
  205.                 return true,i,v
  206.             end
  207.         end
  208.     end
  209.     return false
  210. end
  211.  
  212. function isJump(piece,x1,y1)
  213.     local jumps = {}
  214.     local X = pieces[turn][piece].x
  215.     local Y = pieces[turn][piece].y
  216.     if type(x1) == "number" and type(y1) == "number" then
  217.         X,Y = x1,y1
  218.     end
  219.     local val,color,p = occupied(X - 1,Y + 1)
  220.     local val2 = occupied(X - 2,Y + 2)
  221.     if val and color == opponent and not val2 and onBoard(X - 2,Y + 2) then
  222.         table.insert(jumps,{-2,2,p})
  223.     end
  224.     val,color,p = occupied(X - 1,Y - 1)
  225.     val2 = occupied(X - 2,Y - 2)
  226.     if val and color == opponent and not val2 and onBoard(X - 2,Y - 2) then
  227.         table.insert(jumps,{-2,-2,p})
  228.     end
  229.     if pieces[turn][piece].king then
  230.         val,color,p = occupied(X + 1,Y + 1)
  231.         val2 = occupied(X + 2,Y + 2)
  232.         if val and color == opponent and not val2 and onBoard(X + 2,Y + 2) then
  233.             table.insert(jumps,{2,2,p})
  234.         end
  235.         val,color,p = occupied(X + 1,Y - 1)
  236.         val2 = occupied(X + 2,Y - 2)
  237.         if val and color == opponent and not val2 and onBoard(X + 2,Y - 2) then
  238.             table.insert(jumps,{2,-2,p})
  239.         end
  240.     end
  241.     return jumps
  242. end
  243.  
  244. function getMoves(piece)
  245.     local moves = {}
  246.     local X = pieces[turn][piece].x
  247.     local Y = pieces[turn][piece].y
  248.     local val,color,p = occupied(X - 1,Y + 1)
  249.    
  250.     local x2,y2 = X,Y
  251.     local jumps = isJump(piece)
  252.     for k2,v2 in ipairs(jumps) do
  253.         local x2,y2 = X + v2[1],Y + v2[2]
  254.         local jumps2 = isJump(piece,x2,y2)
  255.         table.insert(moves,{x2,y2,"jump",{v2[3]}})
  256.         for k3,v3 in ipairs(jumps2) do
  257.             local x3,y3 = x2 + v3[1],y2 + v3[2]
  258.             local jumps3 = isJump(piece,x3,y3)
  259.             table.insert(moves,{x3,y3,"jump",{v2[3],v3[3]}})
  260.             for k4,v4 in ipairs(jumps3) do
  261.                 local x4,y4 = x3 + v4[1],y3 + v4[2]
  262.                 local jumps4 = isJump(piece,x4,y4)
  263.                 table.insert(moves,{x4,y4,"jump",{v2[3],v3[3],v4[3]}})
  264.                 for k5,v5 in ipairs(jumps4) do
  265.                     local x5,y5 = x4 + v5[1],y4 + v5[2]
  266.                     local jumps5 = isJump(piece,x5,y5)
  267.                     table.insert(moves,{x5,y5,"jump",{v2[3],v3[3],v4[3],v5[3]}})
  268.                     for k6,v6 in ipairs(jumps5) do
  269.                         local x6,y6 = x5 + v6[1],y5 + v6[2]
  270.                         local jumps6 = isJump(piece,x6,y6)
  271.                         table.insert(moves,{x6,y6,"jump",{v2[3],v3[3],v4[3],v5[3],v6[3]}})
  272.                         for k7,v7 in ipairs(jumps6) do
  273.                             local x7,y7 = x6 + v7[1],y6 + v7[2]
  274.                             local jumps7 = isJump(piece,x7,y7)
  275.                             table.insert(moves,{x7,y7,"jump",{v2[3],v3[3],v4[3],v5[3],v6[3],v7[3]}})
  276.                             for k8,v8 in ipairs(jumps7) do
  277.                                 local x8,y8 = x7 + v8[1],y7 + v8[2]
  278.                                 local jumps8 = isJump(piece,x8,y8)
  279.                                 table.insert(moves,{x8,y8,"jump",{v2[3],v3[3],v4[3],v5[3],v6[3],v7[3],v8[3]}})
  280.                                 for k9,v9 in ipairs(jumps8) do
  281.                                     local x9,y9 = x8 + v9[1],y8 + v9[2]
  282.                                     local jumps9 = isJump(piece,x9,y9)
  283.                                     table.insert(moves,{x9,y9,"jump",{v2[3],v3[3],v4[3],v5[3],v6[3],v7[3],v8[3],v9[3]}})
  284.                                     for k10,v10 in ipairs(jumps9) do
  285.                                         local x10,y10 = x9 + v10[1],y9 + v10[2]
  286.                                         table.insert(moves,{x10,y10,"jump",{v2[3],v3[3],v4[3],v5[3],v6[3],v7[3],v8[3],v9[3],v10[3]}})
  287.                                     end
  288.                                 end
  289.                             end
  290.                         end
  291.                     end
  292.                 end
  293.             end
  294.         end
  295.     end
  296.    
  297.     if not val and onBoard(X - 1,Y + 1) then
  298.         table.insert(moves,{X - 1,Y + 1,"move",{}})
  299.     end
  300.     val,color,p = occupied(X - 1,Y - 1)
  301.     if not val and onBoard(X - 1,Y - 1) then
  302.         table.insert(moves,{X - 1,Y - 1,"move",{}})    
  303.     end
  304.     if pieces[turn][piece].king then
  305.         val,color,p = occupied(X + 1,Y + 1)
  306.         if not val and onBoard(X + 1,Y + 1) then
  307.             table.insert(moves,{X + 1,Y + 1,"move",{}})
  308.         end
  309.         val,color,p = occupied(X + 1,Y - 1)
  310.         if not val and onBoard(X + 1,Y - 1) then
  311.             table.insert(moves,{X + 1,Y - 1,"move",{}})
  312.         end
  313.     end
  314.     local hasJump = false
  315.     for key,val in ipairs(moves) do
  316.         if val[3] == "jump" then
  317.             hasJump = true
  318.         end
  319.     end
  320.     local newMoves = moves
  321.     if hasJump then
  322.         for key,val in ipairs(moves) do
  323.             if val[3] == "move" then
  324.                 table.remove(newMoves,key)
  325.             end
  326.         end
  327.     end
  328.     return newMoves
  329. end
  330.  
  331. function displayMoves(piece)
  332.     button.color(piece,pieces[turn][piece].color,colors.lime)
  333.     for k,v in ipairs(getMoves(piece)) do
  334.         local X,Y = getRealCoords(v[1],v[2])
  335.         button.define("move"..tostring(k)," ",X,Y,colors.white,colors.lime,false)
  336.         button.draw("move"..tostring(k))
  337.     end
  338. end
  339.  
  340. function doMove()
  341.     local going = true
  342.     while going do
  343.         local piece = button.click()
  344.         local moves = getMoves(piece)
  345.         displayMoves(piece)
  346.         button.deactivate("all")
  347.         button.activate(piece)
  348.         local move = button.click()
  349.         print("move initialized as "..move)
  350.         if move == piece then
  351.             print("move = piece")
  352.             button.color(piece,colors.white,colors.red)
  353.             mon.setBackgroundColor(colors.red)
  354.             for key,value in ipairs(moves) do
  355.                 button.delete("move"..tostring(key))
  356.             end
  357.         else
  358.             print("move = "..move)
  359.             for k,v in ipairs(moves[move][4]) do
  360.                 pieces[opponent][v].alive = false
  361.                 pieces[turn][piece].taken = pieces[turn][piece].taken + 1
  362.             end
  363.             for key,value in ipairs(moves) do
  364.                 button.delete("move"..tostring(key))
  365.             end
  366.             local x,y = getRealCoords(moves[move][1],moves[move][2])
  367.             button.move(piece,x,y)
  368.             pieces[turn][piece].x = moves[move][1]
  369.             pieces[turn][piece].y = moves[move][2]
  370.             going = false
  371.         end
  372.     end
  373. end
  374.  
  375. function nextTurn()
  376.     toggleTurn()
  377.     getAlive()
  378.     definePieces()
  379.     button.draw(alive[turn])
  380.     button.draw(alive[opponent])
  381.     button.deactivate(alive[opponent])
  382.     doMove()
  383.     turnNum = turnNum + 1
  384. end
  385.  
  386. function noWinner()
  387.     for k,v in pairs(alive) do
  388.         if getLength(v) == 0 then
  389.             winner = k
  390.             return false
  391.         end
  392.     end
  393.     return true
  394. end
Advertisement
Add Comment
Please, Sign In to add comment