Rock, Paper, Scissors in Ren'Py?

Discuss how to use the Ren'Py engine to create visual novels and story-based games. New releases are announced in this section.
Forum rules
This is the right place for Ren'Py help. Please ask one question per thread, use a descriptive subject like 'NotFound error in option.rpy' , and include all the relevant information - especially any relevant code and traceback messages. Use the code tag to format scripts.
Post Reply
Message
Author
User avatar
BCS
Eileen-Class Veteran
Posts: 1303
Joined: Mon Sep 19, 2005 2:15 am
Location: Florida
Contact:

Rock, Paper, Scissors in Ren'Py?

#1 Post by BCS » Sat Apr 15, 2006 2:31 pm

How would one go about using the random number generator to program a code for a little Rock, Paper, Scissors game without rigging it? (Random every time?)

User avatar
PyTom
Ren'Py Creator
Posts: 15269
Joined: Mon Feb 02, 2004 10:58 am
Completed: Moonlight Walks
Projects: Ren'Py
IRC Nick: renpytom
Github: renpytom
itch: renpytom
Location: Kings Park, NY
Contact:

#2 Post by PyTom » Sat Apr 15, 2006 3:41 pm

Code: Select all

label rps:

    menu:
        "Rock!":
            $ rps_player = "rock"
        "Paper!":
            $ rps_player = "paper"
        "Scissors!":
            $ rps_player = "scissors"
            
    $ rps_npc = renpy.random.choice(["rock", "paper", "scissors"])

    e "I choose %(rps_npc)s!"

    if (rps_player, rps_npc) in rps_beats:

        e "You beat me!"

    elif (rps_npc, rps_player) in rps_beats:

        e "I win!"

    else:

        e "It's a tie! Let's do it again!"
        jump rps

    # ...
An extension to RPS-25 is left as an exercise for the reader.

I should point out that rollback will make an RPS game easy to win, and there's not much to be done about that apart from disabling rollback. (Even if rollback was disabled/blocked, one could still save before the RPS event, and have a 1/2 chance of winning on each playthrough.)

In general, I question whether having random elements in a game is a good idea.
Supporting creators since 2004
(When was the last time you backed up your game?)
"Do good work." - Virgil Ivan "Gus" Grissom
"Silly and fun things are important." - Elon Musk
Software > Drama • https://www.patreon.com/renpytom

User avatar
BCS
Eileen-Class Veteran
Posts: 1303
Joined: Mon Sep 19, 2005 2:15 am
Location: Florida
Contact:

#3 Post by BCS » Sun Apr 16, 2006 2:36 pm

The decision to "cheat" or not to "cheat" - well, the outcome of the rock, paper, scissors in a game may not always to win it ... but it may sometimes be, depending. Things aren't always as clear-cut as they seem ...

If you win, one thing may happen, and you may get a short-term reward for that ... but if you lose or tie, does something else happen later from that which could reveal something else?



Of course, I could just ask you how to temporarily disable rollback or saving at menus, but NOT disable for anytime a menu isn't displayed.

SilverKnight99O
Newbie
Posts: 5
Joined: Thu Feb 08, 2018 3:05 am
Tumblr: uloacs.tumblr.com
Contact:

Re: Rock, Paper, Scissors in Ren'Py?

#4 Post by SilverKnight99O » Sat Mar 31, 2018 11:34 pm

I'm sorry, but how you define renpy_beats.

I mean i just copy the whole coding, but it turns out that renpy_beats is not defined yet. Can anyone solve this?

Code: Select all

I'm sorry, but an uncaught exception occurred.

While running game code:
  File "game/script.rpy", line 27, in script
    if (rps_player, rps_npc) in rps_beats:
  File "game/script.rpy", line 27, in <module>
    if (rps_player, rps_npc) in rps_beats:
NameError: name 'rps_beats' is not defined

-- Full Traceback ------------------------------------------------------------

Full traceback:
  File "game/script.rpy", line 27, in script
    if (rps_player, rps_npc) in rps_beats:
  File "D:\Game\Renpy 6.99\renpy\ast.py", line 1681, in execute
    if renpy.python.py_eval(condition):
  File "D:\Game\Renpy 6.99\renpy\python.py", line 1794, in py_eval
    return py_eval_bytecode(code, globals, locals)
  File "D:\Game\Renpy 6.99\renpy\python.py", line 1788, in py_eval_bytecode
    return eval(bytecode, globals, locals)
  File "game/script.rpy", line 27, in <module>
    if (rps_player, rps_npc) in rps_beats:
NameError: name 'rps_beats' is not defined

Windows-8-6.2.9200
Ren'Py 6.99.13.2919
Zehaha 1.0
- SilverKnight99O, Somebody that tries to make games with friends. :D :D :D

User avatar
IrinaLazareva
Veteran
Posts: 273
Joined: Wed Jun 08, 2016 1:49 pm
Projects: Legacy, Эра Тёмных Небес
Organization: IKG
Location: St.Petersburg, Russia
Contact:

Re: Rock, Paper, Scissors in Ren'Py?

#5 Post by IrinaLazareva » Sun Apr 01, 2018 2:22 am

Code: Select all

default rps_beats = [('rock', 'scissors'), ('scissors', 'paper'), ('paper', 'rock')]
That is the conditions for a win.
There is a light at the end of the tunnel, just pray it's not a train.
___
TODO: unresolved/нерешённое

User avatar
Imperf3kt
Eileen-Class Veteran
Posts: 1951
Joined: Mon Dec 14, 2015 5:05 am
Location: Your monitor
Contact:

Re: Rock, Paper, Scissors in Ren'Py?

#6 Post by Imperf3kt » Sun Apr 01, 2018 4:39 am

I actually made my own RPS game a couple of months ago because I didn't like the already available options that much.

Here's a copy of the whole thing, if you prefer this. With this, the stats reset each time you start a new game:

Code: Select all

define d = Character("Developer")

default result = "none"
default selection = "none"
default score = 0
default computer = 0
default ties = 0

default persistent.cheating = 0
   
label start:
    

    scene rps
# The above statement expects a file called rps (jpg or png) inside the images folder.
    show screen stats


label rps_select:
    
    if not persistent.cheating:
        menu:
            
            "Rock":
                $selection = "rock"
                $result = renpy.random.choice(['rock', 'paper', 'scissors'])
            "Paper":
                $selection = "paper"
                $result = renpy.random.choice(['rock', 'paper', 'scissors'])
            "Scissors":
                $selection = "scissors"
                $result = renpy.random.choice(['rock', 'paper', 'scissors'])
            "End":
                return
    else:
        menu:
            
            "Rock":
                $selection = "rock"
                $result = "scissors"
            "Paper":
                $selection = "paper"
                $result = "rock"
            "Scissors":
                $selection = "scissors"
                $result = "paper"
            "End":
                return
    
label results:

####rock####

    if result == "rock":
        if selection == "rock":
            jump tie
        elif selection == "paper":
            jump win
        elif selection == "scissors":
            jump lose

####paper####

    elif result == "paper":
        if selection == "rock":
            jump lose
        elif selection == "paper":
            jump tie
        elif selection == "scissors":
            jump win

####scissors####

    elif result == "scissors":
        if selection == "rock":
            jump win
        elif selection == "paper":
            jump lose
        elif selection == "scissors":
            jump tie

label tie:
    
    d "We tied with [result]!"
    $ ties += 1
    jump rps_select
    
label win:
    
    d "[selection] beats [result], you win!"
    $ score += 1
    jump rps_select
    
label lose:
    
    d "[result] beats [selection], you lost!"
    $ computer += 1
    jump rps_select
And the related screens:

Code: Select all

screen stats():
    
    modal False
    zorder 100
    vbox:
        xalign 0.5
        ypos 0.01
        text "{color=#000}Computer: [computer] You: [score] Ties: [ties]{/color}"


screen cheats():

    tag menu

    use game_menu(_("Cheats"), scroll="viewport"):

        style_prefix "cheats"
        

        hbox:
            vbox:
                label "Never Lose"
            
                textbutton _("On") action SetField(persistent, "cheating", 1)
                textbutton _("Off") action SetField(persistent, "cheating", 0)
                    

style cheats_label is gui_label
style cheats_label_text is gui_label_text
style cheats_text is gui_text

style cheats_label_text:
    size gui.label_text_size
Remember to add a button to the menu that opens the "cheat" menu. example:

Code: Select all

textbutton _("Cheats") action ShowMenu('cheats') alternate ShowMenu('cheats')
Warning: May contain trace amounts of gratuitous plot.
pro·gram·mer (noun) An organism capable of converting caffeine into code.

User avatar
TsugumiLightning
Newbie
Posts: 20
Joined: Sat Aug 11, 2018 5:28 am
Deviantart: UndyneHeroine99
Contact:

Re: Rock, Paper, Scissors in Ren'Py?

#7 Post by TsugumiLightning » Mon Oct 15, 2018 6:05 am

Imperf3kt wrote:
Sun Apr 01, 2018 4:39 am
I actually made my own RPS game a couple of months ago because I didn't like the already available options that much.

Here's a copy of the whole thing, if you prefer this. With this, the stats reset each time you start a new game:

Code: Select all

define d = Character("Developer")

default result = "none"
default selection = "none"
default score = 0
default computer = 0
default ties = 0

default persistent.cheating = 0
   
label start:
    

    scene rps
# The above statement expects a file called rps (jpg or png) inside the images folder.
    show screen stats


label rps_select:
    
    if not persistent.cheating:
        menu:
            
            "Rock":
                $selection = "rock"
                $result = renpy.random.choice(['rock', 'paper', 'scissors'])
            "Paper":
                $selection = "paper"
                $result = renpy.random.choice(['rock', 'paper', 'scissors'])
            "Scissors":
                $selection = "scissors"
                $result = renpy.random.choice(['rock', 'paper', 'scissors'])
            "End":
                return
    else:
        menu:
            
            "Rock":
                $selection = "rock"
                $result = "scissors"
            "Paper":
                $selection = "paper"
                $result = "rock"
            "Scissors":
                $selection = "scissors"
                $result = "paper"
            "End":
                return
    
label results:

####rock####

    if result == "rock":
        if selection == "rock":
            jump tie
        elif selection == "paper":
            jump win
        elif selection == "scissors":
            jump lose

####paper####

    elif result == "paper":
        if selection == "rock":
            jump lose
        elif selection == "paper":
            jump tie
        elif selection == "scissors":
            jump win

####scissors####

    elif result == "scissors":
        if selection == "rock":
            jump win
        elif selection == "paper":
            jump lose
        elif selection == "scissors":
            jump tie

label tie:
    
    d "We tied with [result]!"
    $ ties += 1
    jump rps_select
    
label win:
    
    d "[selection] beats [result], you win!"
    $ score += 1
    jump rps_select
    
label lose:
    
    d "[result] beats [selection], you lost!"
    $ computer += 1
    jump rps_select
And the related screens:

Code: Select all

screen stats():
    
    modal False
    zorder 100
    vbox:
        xalign 0.5
        ypos 0.01
        text "{color=#000}Computer: [computer] You: [score] Ties: [ties]{/color}"


screen cheats():

    tag menu

    use game_menu(_("Cheats"), scroll="viewport"):

        style_prefix "cheats"
        

        hbox:
            vbox:
                label "Never Lose"
            
                textbutton _("On") action SetField(persistent, "cheating", 1)
                textbutton _("Off") action SetField(persistent, "cheating", 0)
                    

style cheats_label is gui_label
style cheats_label_text is gui_label_text
style cheats_text is gui_text

style cheats_label_text:
    size gui.label_text_size
Remember to add a button to the menu that opens the "cheat" menu. example:

Code: Select all

textbutton _("Cheats") action ShowMenu('cheats') alternate ShowMenu('cheats')
Thanks, this helped me a lot!
Howdy!
I'm Flowey!
Flowey the flower!

XP

Post Reply

Who is online

Users browsing this forum: martingerdes