repeat
set player to display dialog "Rock, Paper, Scissors?" buttons {"Rock", "Paper", "Scissors"}
set player_choice to (button returned of the result) as string
set cpu to {"Rock", "Paper", "Scissors"}
set the list_count to the count of cpu
set pick to random number from 1 to list_count
set the_result to item pick of cpu as string
display dialog "You picked " & player_choice & "."
display dialog "The computer picked " & the_result & "."
if player_choice is equal to "Rock" and the_result is equal to "Rock" then
display dialog "Tie Game!"
else if player_choice is equal to "Rock" and the_result is equal to "Paper" then
display dialog "You lose!"
else if player_choice is equal to "Rock" and the_result is equal to "Scissors" then
display dialog "You win!"
else if player_choice is equal to "Paper" and the_result is equal to "Paper" then
display dialog "Tie Game!"
else if player_choice is equal to "Paper" and the_result is equal to "Scissors" then
display dialog "You lose!"
else if player_choice is equal to "Paper" and the_result is equal to "Rock" then
display dialog "You win!"
else if player_choice is equal to "Scissors" and the_result is equal to "Scissors" then
display dialog "Tie Game!"
else if player_choice is equal to "Scissors" and the_result is equal to "Rock" then
display dialog "You lose!"
else if player_choice is equal to "Scissors" and the_result is equal to "Paper" then
display dialog "You win!"
end if
set again_dialog to display dialog "Play Again?" buttons {"Yes", "No"} default button 1
set play_again to the button returned of again_dialog
if play_again is not equal to "Yes" then
exit repeat
end if
end repeat
I haven’t fully tested it, but this may work:
set choiceList to {"Rock", "Paper", "Scissors"}
tell choiceList to set choiceText to beginning & ", " & middle item & ", or " & end & "?"
repeat
set playerChoice to button returned of (display dialog choiceText buttons choiceList)
tell playerChoice to if it is beginning of choiceList then
set playerIndex to 1
else if it is middle item of choiceList then
set playerIndex to 2
else
set playerIndex to 3
end if
set computerChoice to random number from 1 to 3
set resultText to item ((playerIndex - computerChoice + 3) mod 3 + 1) of {"You Tie!", "You Win!", "You Lose!"}
display dialog "Player: " & playerChoice & return & "Computer: " & item computerChoice of choiceList & return & return & resultText
if button returned of (display dialog "Play Again?" buttons {"Yes", "No"}) is "No" then error number -128
end repeat
How about:
property modeNames : {"rock", "paper", "scissors"}
set myChoice to button returned of (display dialog "Throw down." buttons modeNames)
set cpuChoice to item (random number from 1 to 3) of modeNames
if myChoice = cpuChoice then
display dialog "It's a draw!"
else
set i to 1
repeat with i from 1 to (count of modeNames)
if myChoice = (item i of modeNames) then
if i = 3 then
set ind to 0
else
set ind to i
end if
set i to 1
exit repeat
else
set i to (i + 1)
end if
end repeat
repeat with i from 1 to (count of modeNames)
if cpuChoice = (item i of modeNames) then
if i = (ind + 1) then
set winner to "The computer wins!"
else
set winner to "You beat the computer!"
end if
display dialog winner
exit repeat
end if
set i to (i + 1)
end repeat
end if
Or perhaps this form using mod:
repeat
set Picks to {"Paper", "Scissors", "Rock", 1, 2, 3}
set You to button returned of (display dialog "Please choose from Paper, Scissors or Rock?" buttons items 1 thru 3 of Picks)
repeat with k from 1 to 3
if You is item k of Picks then set Yn to item (k + 3) of Picks <-- Looking back, the error pointed out in kai's post below is that the 3 here should be a 4!
end repeat
set Cn to some item of {1, 2, 3}
set Comp to item Cn of Picks
if Cn = Yn then
display dialog "Tie - you both picked " & You
else if (Yn mod 3) < (Cn mod 3) then -- this is a ring: paper < scissors < rock < paper, etc.
display dialog "You lose, " & Comp & " beats " & You
else
display dialog "You win, " & You & " beats " & Comp
end if
if button returned of (display dialog "Again?" buttons {"No", "Yes"} default button 2) is "No" then exit repeat
end repeat
My first thought was to use some “previous position” math that I picked up (here) a while ago.
set choiceList to {"Rock", "Paper", "Scissors"}
set choiceCount to count result
repeat
display dialog "Rock, Paper, Scissors?" buttons choiceList
set playerChoice to button returned of result
random number from 1 to choiceCount
set cpuChoice to item (result) of choiceList
if playerChoice = cpuChoice then
set resultMsg to "Tie game."
else
-- Get position of playerChoice in choiceList
repeat with playerIndex from 1 to choiceCount
if choiceList's item playerIndex is playerChoice then exit repeat
end repeat
-- Get "previous" position in choiceList
get (playerIndex + choiceCount - 2) mod choiceCount + 1
if (item (result) of choiceList) = cpuChoice then
set resultMsg to "You win!"
else
set resultMsg to "You lose!"
end if
end if
display dialog "You: " & playerChoice & return & "CPU: " & cpuChoice & return & return & resultMsg buttons {"Cancel", "Play Again"} default button 2
end repeat
I borrowed Bruce’s script (just because it’s the last one) to make the game more familiar.
set choiceList to {"Rock", "Paper", "Scissors"}
set choiceCount to count result
repeat
display dialog "One.." buttons choiceList giving up after 1
display dialog "Two.." buttons choiceList giving up after 1
display dialog "Three.." buttons choiceList giving up after 1
display dialog "SHOOT!" buttons choiceList
set playerChoice to button returned of result
random number from 1 to choiceCount
set cpuChoice to item (result) of choiceList
if playerChoice = cpuChoice then
set resultMsg to "Tie game."
else
-- Get position of playerChoice in choiceList
repeat with playerIndex from 1 to choiceCount
if choiceList's item playerIndex is playerChoice then exit repeat
end repeat
-- Get "previous" position in choiceList
get (playerIndex + choiceCount - 2) mod choiceCount + 1
if (item (result) of choiceList) = cpuChoice then
set resultMsg to "You win!"
else
set resultMsg to "You lose!"
end if
end if
display dialog "You: " & playerChoice & return & "CPU: " & cpuChoice & return & return & resultMsg buttons {"Cancel", "Play Again"} default button 2
end repeat
EDIT: My wife says the above should start like so…
set choiceList to {"Rock", "Paper", "Scissors"}
display dialog return buttons {"One.."} with icon 1 giving up after 1
display dialog return buttons {"Two.."} with icon 1 giving up after 1
display dialog return buttons {"Three.."} with icon 1 giving up after 1
display dialog "SHOOT!" buttons choiceList with icon 2
…but she says the following is also acceptable.
Or maybe it should start like this:
set choiceList to {"Rock", "Paper", "Scissors"}
say "Wontoothree Shoot!" using "Junior"
display dialog "" buttons choiceList
lol! it’s the official list of different ways to make such a simple game!
Indeed. Some interesting variations on a theme there, guys.
Just a minor observation, but I’m not sure that works quite as intended, Adam. (Hint for bad losers: always choose “Scissors” in this game.)
However, the mod function can be used to good effect in this type of situation. (And, having knocked up the following example independently, I now see that it has some similarities to the approach suggested earlier by Qwerty - but I’ll throw it into the pot, anyway…)
set l to {"Paper", "Scissors", "Rock"}
repeat
say "1 2 3 shoot!" using "Junior"
set {y, m} to {button returned of (display dialog "Choose your weapon:" buttons l), some item of {1, 2, 3}}
repeat with i from 1 to 3
if l's item i is y then exit repeat
end repeat
display dialog "You chose: " & y & return & "Mac chose: " & l's item m & return & return & "You " & {"draw", "win", "lose"}'s ¬
item ((i - m + 3) mod 3 + 1) & "!" buttons {"Play Later", "Play Again"} cancel button 1 default button 2
end repeat
i’ll add to the mix. anyone want to keep score?
set choiceList to {"Rock", "Paper", "Scissors"}
set choiceCount to count result
set yourWins to 0
set cpuWins to 0
repeat
display dialog "One.." buttons choiceList giving up after 1
display dialog "Two.." buttons choiceList giving up after 1
display dialog "Three.." buttons choiceList giving up after 1
display dialog "SHOOT!" buttons choiceList
set playerChoice to button returned of result
random number from 1 to choiceCount
set cpuChoice to item (result) of choiceList
if playerChoice = cpuChoice then
set resultMsg to "Tie game."
else
-- Get position of playerChoice in choiceList
repeat with playerIndex from 1 to choiceCount
if choiceList's item playerIndex is playerChoice then exit repeat
end repeat
-- Get "previous" position in choiceList
get (playerIndex + choiceCount - 2) mod choiceCount + 1
if (item (result) of choiceList) = cpuChoice then
set resultMsg to "You win!"
set yourWins to (yourWins + 1)
else
set resultMsg to "You lose!"
set cpuWins to (cpuWins + 1)
end if
end if
set theResult to button returned of (display dialog "You: " & playerChoice & return & "CPU: " & cpuChoice & return & return & resultMsg buttons {"Score", "Play Again", "Cancel"} default button 2)
if theResult is "Score" then
if yourWins > cpuWins then
display dialog "Your Wins: " & yourWins & return & "CPU Wins: " & cpuWins & return & return & "You are currently winning!" & return & return & "Would you like to play again?" buttons {"Play Again", "Cancel"} default button 1
say "Huray!" using "Junior"
else if yourWins < cpuWins then
display dialog "Your Wins: " & yourWins & return & "CPU Wins: " & cpuWins & return & return & "You are currently losing!" & return & return & "Would you like to play again?" buttons {"Play Again", "Cancel"} default button 1
say "uh oh!" using "Junior"
else
display dialog "Your Wins: " & yourWins & return & "CPU Wins: " & cpuWins & return & return & "You are currently tied!" & return & return & "Would you like to play again?" buttons {"Play Again", "Cancel"} default button 1
say "Wontoothree Shoot!" using "Junior"
end if
end if
end repeat
ok, one more addition. the game ends at 21. if it ends earlier, a final score is given and a win/loss. and we recursively call the game if the player would like to ‘play again!’:
on run
myGame()
end run
on myGame()
set choiceList to {"Rock", "Paper", "Scissors"}
set choiceCount to count result
set yourWins to 0
set cpuWins to 0
set catchEnd to 0
repeat until (yourWins = 21) or (cpuWins = 21) or (catchEnd = "End")
display dialog "One.." buttons choiceList giving up after 1
display dialog "Two.." buttons choiceList giving up after 1
display dialog "Three.." buttons choiceList giving up after 1
display dialog "SHOOT!" buttons choiceList
set playerChoice to button returned of result
random number from 1 to choiceCount
set cpuChoice to item (result) of choiceList
if playerChoice = cpuChoice then
set resultMsg to "Tie game."
else
-- Get position of playerChoice in choiceList
repeat with playerIndex from 1 to choiceCount
if choiceList's item playerIndex is playerChoice then exit repeat
end repeat
-- Get "previous" position in choiceList
get (playerIndex + choiceCount - 2) mod choiceCount + 1
if (item (result) of choiceList) = cpuChoice then
set resultMsg to "You win!"
set yourWins to (yourWins + 1)
else
set resultMsg to "You lose!"
set cpuWins to (cpuWins + 1)
end if
end if
set theResult to button returned of (display dialog "You: " & playerChoice & return & "CPU: " & cpuChoice & return & return & resultMsg buttons {"Score", "Play Again", "Cancel"} default button 2)
if theResult is "Score" then
if yourWins > cpuWins then
set catchEnd to button returned of (display dialog "Your Wins: " & yourWins & return & "CPU Wins: " & cpuWins & return & return & "You are currently winning!" & return & return & "Would you like to play again?" buttons {"Play Again", "End"} default button 1)
say "Huray!" using "Junior"
else if yourWins < cpuWins then
set catchEnd to button returned of (display dialog "Your Wins: " & yourWins & return & "CPU Wins: " & cpuWins & return & return & "You are currently losing!" & return & return & "Would you like to play again?" buttons {"Play Again", "End"} default button 1)
say "uh oh!" using "Junior"
else
set catchEnd to button returned of (display dialog "Your Wins: " & yourWins & return & "CPU Wins: " & cpuWins & return & return & "You are currently tied!" & return & return & "Would you like to play again?" buttons {"Play Again", "End"} default button 1)
say "Wontoothree Shoot!" using "Junior"
end if
end if
end repeat
if yourWins > cpuWins then
set keepPlay to button returned of (display dialog "FINAL RESULTS:" & return & return & "Your Wins: " & yourWins & return & "CPU Wins: " & cpuWins & return & "You Won!" buttons {"Play Again!", "Cancel"} default button 1)
say "Huray!" using "Junior"
else if yourWins < cpuWins then
set keepPlay to button returned of (display dialog "FINAL RESULTS:" & return & return & "Your Wins: " & yourWins & return & "CPU Wins: " & cpuWins & return & "You Lost!" buttons {"Play Again!", "Cancel"} default button 1)
say "uh, oh!" using "Junior"
else
set keepPlay to button returned of (display dialog "FINAL RESULTS:" & return & return & "Your Wins: " & yourWins & return & "CPU Wins: " & cpuWins & return & "You Tied!" buttons {"Play Again!", "Cancel"} default button 1)
say "goodbye!" using "Junior"
end if
if keepPlay is "Play Again!" then
myGame()
end if
end myGame
lol, actually this is my final code…and thats final!
set user_score to 0
set cpu_score to 0
repeat
set rps_list to {"Rock", "Paper", "Scissors"}
set the list_count to the count of rps_list
set pick to random number from 1 to list_count
set cpu_choice to item pick of rps_list as string
set rps_dialog to display dialog "Rock, Paper, Scissors?" buttons {"Rock", "Paper", "Scissors"}
set user_choice to (button returned of rps_dialog) as string
display dialog "Rock..." giving up after 1
display dialog "Paper..." giving up after 1
display dialog "Scissors!" giving up after 1
if user_choice is equal to "Rock" and cpu_choice is equal to "Rock" then
display dialog "Player chose: " & user_choice & return & "Computer chose: " & cpu_choice & return & return & "Tie Game"
else if user_choice is equal to "Rock" and cpu_choice is equal to "Paper" then
display dialog "Player chose: " & user_choice & return & "Computer chose: " & cpu_choice & return & return & "You lose!"
set cpu_score to cpu_score + 1
else if user_choice is equal to "Rock" and cpu_choice is equal to "Scissors" then
display dialog "Player chose: " & user_choice & return & "Computer chose: " & cpu_choice & return & return & "You win!"
set user_score to user_score + 1
else if user_choice is equal to "Paper" and cpu_choice is equal to "Paper" then
display dialog "Player chose: " & user_choice & return & "Computer chose: " & cpu_choice & return & return & "Tie Game"
else if user_choice is equal to "Paper" and cpu_choice is equal to "Scissors" then
display dialog "Player chose: " & user_choice & return & "Computer chose: " & cpu_choice & return & return & "You lose!"
set cpu_score to cpu_score + 1
else if user_choice is equal to "Paper" and cpu_choice is equal to "Rock" then
display dialog "Player chose: " & user_choice & return & "Computer chose: " & cpu_choice & return & return & "You win!"
set user_score to user_score + 1
else if user_choice is equal to "Scissors" and cpu_choice is equal to "Scissors" then
display dialog "Player chose: " & user_choice & return & "Computer chose: " & cpu_choice & return & return & "Tie Game"
else if user_choice is equal to "Scissors" and cpu_choice is equal to "Rock" then
display dialog "Player chose: " & user_choice & return & "Computer chose: " & cpu_choice & return & return & "You lose!"
set cpu_score to cpu_score + 1
else if user_choice is equal to "Scissors" and cpu_choice is equal to "Paper" then
display dialog "Player chose: " & user_choice & return & "Computer chose: " & cpu_choice & return & return & "You win!"
set user_score to user_score + 1
end if
set play_again to display dialog "Play again?" buttons {"Yes", "No"}
set again_choice to button returned of play_again
if again_choice is not equal to "Yes" then
if user_score is greater than cpu_score then
display dialog "Final Score" & return & "You: " & user_score & return & "Computer: " & cpu_score & return & "You are the winner!"
else if user_score is less than cpu_score then
display dialog "Final Score" & return & "You: " & user_score & return & "Computer: " & cpu_score & return & "You are the loser!"
else if user_score is equal to cpu_score then
display dialog "Final Score" & return & "You: " & user_score & return & "Computer: " & cpu_score & return & "Looks like a tie game!"
exit repeat
end if
end if
end repeat
I like yours Kai, but haven’t sorted why mine has a bias for scissors. You spotted it and I can’t - it’s like trying to sort out mistakes in your own document
Who’s going to make this into an AppleScript Studio project?
lol, I WILL! I have been looking for a new project to start but I never thought of this. Lol, it’s gunna be kinda of funny making an AS Studio app out of this:P Well it definaely won’t be very hard, but thats good for me because I am not that fantasti of a programmer:P
ok,ok i lied last time wasn’t the final version, this is:P, and now I am going to work on the AS Studio version:D
set user_score to 0
set cpu_score to 0
repeat
set rps_list to {"Rock", "Paper", "Scissors"}
set the list_count to the count of rps_list
set pick to random number from 1 to list_count
set cpu_choice to item pick of rps_list as string
set rps_dialog to display dialog "Rock, Paper, Scissors?" buttons {"Rock", "Paper", "Scissors"}
set user_choice to (button returned of rps_dialog) as string
display dialog "Rock..." giving up after 1
display dialog "Paper..." giving up after 1
display dialog "Scissors!" giving up after 1
if user_choice is equal to cpu_choice then
display dialog "Player chose: " & user_choice & return & "Computer chose: " & cpu_choice & return & return & "Tie Game"
else if user_choice is equal to "Rock" and cpu_choice is equal to "Paper" then
display dialog "Player chose: " & user_choice & return & "Computer chose: " & cpu_choice & return & return & "You lose!"
set cpu_score to cpu_score + 1
else if user_choice is equal to "Rock" and cpu_choice is equal to "Scissors" then
display dialog "Player chose: " & user_choice & return & "Computer chose: " & cpu_choice & return & return & "You win!"
set user_score to user_score + 1
else if user_choice is equal to "Paper" and cpu_choice is equal to "Scissors" then
display dialog "Player chose: " & user_choice & return & "Computer chose: " & cpu_choice & return & return & "You lose!"
set cpu_score to cpu_score + 1
else if user_choice is equal to "Paper" and cpu_choice is equal to "Rock" then
display dialog "Player chose: " & user_choice & return & "Computer chose: " & cpu_choice & return & return & "You win!"
set user_score to user_score + 1
else if user_choice is equal to "Scissors" and cpu_choice is equal to "Rock" then
display dialog "Player chose: " & user_choice & return & "Computer chose: " & cpu_choice & return & return & "You lose!"
set cpu_score to cpu_score + 1
else if user_choice is equal to "Scissors" and cpu_choice is equal to "Paper" then
display dialog "Player chose: " & user_choice & return & "Computer chose: " & cpu_choice & return & return & "You win!"
set user_score to user_score + 1
end if
set play_again to display dialog "Play again?" buttons {"Yes", "No"}
set again_choice to button returned of play_again
if again_choice is not equal to "Yes" then
if user_score is greater than cpu_score then
display dialog "Final Score" & return & "You: " & user_score & return & "Computer: " & cpu_score & return & "You are the winner!"
exit repeat
else if user_score is less than cpu_score then
display dialog "Final Score" & return & "You: " & user_score & return & "Computer: " & cpu_score & return & "You are the loser!"
exit repeat
else if user_score is equal to cpu_score then
display dialog "Final Score" & return & "You: " & user_score & return & "Computer: " & cpu_score & return & "Looks like a tie game!"
exit repeat
end if
end if
end repeat