MiniScript versions of Acey Ducey, Amazing, Animal, and Awari.

This commit is contained in:
JoeStrout
2023-07-10 21:24:15 -07:00
parent 2aed1da9ac
commit 5a886283aa
10 changed files with 477 additions and 1 deletions

View File

@@ -0,0 +1,16 @@
Original source downloaded from [Vintage Basic](http://www.vintage-basic.net/games.html).
Conversion to [MiniScript](https://miniscript.org).
Ways to play:
1. Command-Line MiniScript:
Download for your system from https://miniscript.org/cmdline/, install, and then run the program with a command such as:
miniscript awari.ms
2. Mini Micro:
Download Mini Micro from https://miniscript.org/MiniMicro/, launch, and then click the top disk slot and chose "Mount Folder..." Select the folder containing the BASIC program. Then, at the Mini Micro command prompt, enter:
load "awari"
run

View File

@@ -0,0 +1,146 @@
print " "*34 + "Awari"
print " "*15 + "Creative Computing Morristown, New Jersey"
// Keep a list of the opening moves (up to 8) of previously lost or drawn games.
// These will be used to penalize repeating the same moves again.
badGames = []
printQty = function(qty)
print (" " + qty)[-2:], " "
end function
printBoard = function
print; print " ", ""
for i in range(12, 7); printQty board[i]; end for
print; printQty board[13]
print " " * 6, ""; printQty board[6]
print; print " ", ""
for i in range(0, 5); printQty board[i]; end for
print; print
end function
// Redistribute the stones starting at position.
// If the last one ends by itself, opposite some nonzero
// stones on the other side, then capture them into homePos.
// Return true if the last stone ended at homePos, false otherwise.
moveStones = function(board, position, homePos)
p = board[position]; board[position] = 0
while p
position = (position + 1) % 14
board[position] += 1
p -= 1
end while
if board[position] == 1 and position != 6 and position != 13 and board[12-position] then
board[homePos] += board[12-position] + 1
board[position] = 0
board[12-position] = 0
end if
globals.gameOver = board[0:6].sum == 0 or board[7:13].sum == 0
return position == homePos
end function
// Get the player move. Note that the player inputs their move as a number
// from 1-6, but we return it as an actual board position index 0-6.
getPlayerMove = function(prompt="Your move")
while true
pos = input(prompt + "? ").val
if 0 < pos < 7 and board[pos-1] then return pos - 1
print "Illegal move."
end while
end function
getComputerMove = function
// Copy the board for safekeeping
boardCopy = board[:]
bestScore = -99; bestMove = 0
for j in range(7, 12)
if board[j] == 0 then continue // can't move from an empty spot
// suppose we move at position j...
moveStones board, j, 13
// consider each possible response the player could make
bestPlayerScore = 0
for i in range(0, 5)
if board[i] == 0 then continue
landPos = board[i] + i // figure the landing position
score = floor(landPos / 14); landPos %= 14
if board[landPos] == 0 and landPos != 6 and landPos != 13 then
score += board[12 - landPos] // points for capturing stones
end if
if score > bestPlayerScore then bestPlayerScore = score
end for
// figure our own score as our points, minus player points, minus best player score
ourScore = board[13] - board[6] - bestPlayerScore
if gameMoves.len < 8 then
// subtract 2 points if current series of moves is in our bad-games list
proposed = gameMoves + [j]
for badGame in badGames
if badGame[:proposed.len] == proposed then ourScore -= 2
end for
end if
if ourScore > bestScore then
bestScore = ourScore
bestMove = j
end if
// restore the board
globals.board = boardCopy[:]
end for
print char(42+bestMove) // (labels computer spots as 1-6 from right to left)
return bestMove
end function
// The game is over when either side has 0 stones left.
isGameOver = function
return board[0:6].sum == 0 or board[7:13].sum == 0
end function
// Play one game to completion.
playOneGame = function
// The board is represented as a list of 13 numbers.
// Position 6 is the player's home; 13 is the computer's home.
globals.board = [3]*14; board[13] = 0; board[6] = 0
// Also keep a list of the moves in the current game
globals.gameMoves = []
print; print
while true
// Player's turn
printBoard
pos = getPlayerMove
gameMoves.push pos
if moveStones(board, pos, 6) then
if gameOver then break
printBoard
pos = getPlayerMove("Again")
gameMoves.push pos
moveStones board, pos, 6
end if
if gameOver then break
// Computer's turn
printBoard; print "My move is ", ""
pos = getComputerMove
gameMoves.push pos
if moveStones(board, pos, 13) then
if gameOver then break
printBoard; print "...followed by ", ""
pos = getComputerMove
gameMoves.push pos
moveStones board, pos, 13
end if
if gameOver then break
end while
printBoard
print; print "GAME OVER"
delta = board[6] - board[13]
if delta < 0 then
print "I win by " + (-delta) + " points"
return
end if
if delta == 0 then print "Drawn game" else print "You win by " + delta + " points"
if gameMoves.len > 8 then gameMoves = gameMoves[:8]
if badGames.indexOf(gameMoves) == null then badGames.push gameMoves
end function
// Main loop
while true
playOneGame
print; print
end while