print "Solitaire Checker Puzzle by David Ahl" print print "48 checkers are placed on the 2 outside spaces of a" print "standard 64-square checkerboard. The object is to" print "remove as many checkers as possible by diagonal jumps" print "(as in standard checkers). Use the numbered board to" print "indicate the square you wish to jump from and to. On" print "the board printed out on each turn '1' indicates a" print "checker and '0' an empty square. When you have no" print "possible jumps remaining, input a '0' in response to" print "question 'Jump from?'" print input "(Press Return.)" print pad4 = function(n) return (" " + n)[-4:] end function printBoard = function // Idea: This program could be greatly improved by printing the board // as the index numbers (1-64), indicating which of those positions // contain checkers via color or punctuation, e.g. "(42)" vs " 42 ". // This would make it much easier for the user to figure out what // numbers correspond to the positions they have in mind. print for j in range(1, 57, 8) print " " + board[j:j+8].join(" ") end for end function initBoard = function globals.board = [null] + [1] * 64 // treat this as 1-based array for j in range(19, 43, 8) for i in range(j, j+3) board[i] = 0 end for end for end function isLegal = function(from, to) if board[from] == 0 then return false if board[to] == 1 then return false if board[(to+from)/2] == 0 then return false fromRow = floor((from-1) / 8) // row in range 0-7 fromCol = from - fromRow*8 // column in range 1-8 toRow = floor((to-1) / 8) toCol = to - toRow*8 if fromRow > 7 or toRow > 7 or fromCol > 8 or toCol > 8 then return false if abs(fromRow-toRow) != 2 or abs(fromCol-toCol) != 2 then return false return true end function askYesNo = function(prompt) while true answer = input(prompt + "? ").lower if answer and answer[0] == "y" then return "yes" if answer and answer[0] == "n" then return "no" print "Please answer 'yes' or 'no'." end while end function print "Here is the numerical board:" print for j in range(1, 57, 8) print pad4(j) + pad4(j+1) + pad4(j+2) + pad4(j+3) + pad4(j+4) + pad4(j+5) + pad4(j+6) + pad4(j+7) end for while true initBoard print print "And here is the opening position of the checkers." printBoard jumps = 0 while true fromPos = input("Jump from? ").val if fromPos == 0 then break toPos = input("To? ").val print if not isLegal(fromPos, toPos) then print "Illegal move. Try again..." continue end if board[fromPos] = 0 board[toPos] = 1 board[(toPos+fromPos)/2] = 0 jumps += 1 printBoard end while // End game summary sum = board[1:].sum print "You made " + jumps + " jumps and had " + sum + " pieces" print "remaining on the board." print if askYesNo("Try again") == "no" then break end while print print "O.K. Hope you had fun!!"