const rps = %w(r p s) const msg = [ "Rock breaks scissors", "Paper covers rock", "Scissors cut paper", ] say <<"EOT" \n>> Rock Paper Scissors <<\n ** Enter 'r', 'p', or 's' as your play. ** Enter 'q' to exit the game. ** Running score shown as : EOT var plays = 0 var aScore = 0 var pScore = 0 var pcf = [0,0,0] # pcf = player choice frequency var aChoice = pick(0..2) # ai choice for first play is completely random loop { var pi = Sys.scanln("Play: ") pi == 'q' && break var pChoice = rps.index(pi) if (pChoice == -1) { STDERR.print("Invalid input!\n") next } ++pcf[pChoice] ++plays # show result of play ">> My play: %-8s".printf(rps[aChoice]) given ((aChoice - pChoice + 3) % 3) { when (0) { say "Tie." } when (1) { "%-*s %s".printlnf(30, msg[aChoice], 'My point'); aScore++ } when (2) { "%-*s %s".printlnf(30, msg[pChoice], 'Your point'); pScore++ } } # show score "%-6s".printf("%d:%d" % (pScore, aScore)) # compute ai choice for next play given (plays.rand.int) { |rn| case (rn < pcf[0]) { aChoice = 1 } case (pcf[0]+pcf[1] > rn) { aChoice = 2 } default { aChoice = 0 } } }