Search code examples
pythonarraysrandom

How to roll 3 random strings out an array and check them


I am a student programmer at college and I've only recently started coding in my own time. I have some basic knowledge on how to program but arrays are out of my knowledge and I am trying to learn them. I got challenged to make a fruit roll gambling machine. I need to roll 3 strings out of a possible 6 and check for certain conditions.

I have figured out how to take 3 of those out and print them but I need to check for winners etc. For 3 bells you win the jackpot, for 2 dupes + another you win a regular prize, if you roll the skull you get a deduction.

I think I can figure out how to check which ones are rolled by just using if and else if statements (not sure if it works) but it will be a lot of else if's to make sure each and every combination is considered for.

Is there a quicker way to check for duplicates? Or is just using lots of elif statements the only way to do it. I can elaborate further if required.

I've pasted the full code below, forgive me if its not well written I'm still only like beginner level, I was also told to try use functions which is why there is so many. My main problem is as I described before but any other tips for the entirety of the code will be well appreciated too. Thanks in advance.

import random
fruit = ["Cherry", "Bell", "Lemon", "Star", "Orange", "Skull"]


def fruit_machine():
  credits = 10
  credit = True
  while credits > 0:
    turn = str(input("Would you like to roll for 20p? Y/N: "))
    if turn.lower() == "y":
      credits = credits - 2
      credits_print(credits)
    elif turn.lower() == "n":
      print("You have chosen not to roll.")
      credit = False
    else:
      print("Please enter a valid option.")
  return credits
  return credit


def credits_print(credits):
  print("You have", credits, "credits remaining")
  fruit_roll()
  if credits == 0:
    print("--------------------------------------\nYou have no more credits remaining")
    end()
    
  

def fruit_roll(credits):
  roll = random.choices(fruit, k = 3)
  if roll == ["Bell, Bell, Bell"]:
    print("Jackpot!!!\n+5 credits")
    credits = credits + 5
  
  

def end():
  print(" ")




fruit_machine()

I had made the end() as I couldn't figure out how to stop it looping back to the fruit_machine function after reaching 0 credits, it would just go back and go into negatives.


Solution

  • There are more streamlined ways to check for duplicates and other conditions in a list rather than using a bunch of if elif statements. The logic is going to change based on the requirements and combinations of roll results. For example, is it just 3 Bells that hit the jackpot or is it 3 of any roll except skull?

    An example fruit_roll function based on the requirements in your question would be something like this:

    def fruit_roll(credits):
     roll = random.choices(fruit, k=3)
     print("Rolled: ", roll)
     if roll.count("Bell") == 3:
        print("Jackpot!!! +5 credits")
        credits += 5
     elif any(roll.count(f) == 2 for f in fruit) and "Skull" not in roll:
        print("Regular prize! +2 credits")
        credits += 2
     if "Skull" in roll:
        print("Skull rolled! -1 credit")
        credits -= 1
     return credits
    

    There were some other issues with your code that I found when going through it.

    1. In fruit_roll() you are comparing roll to a string ("Bell, Bell, Bell" in your code). This won't work because roll is a list and not a string.
    2. In fruit_machine() you call fruit_roll() without passing in the credits variable.
    3. You have two return statements for fruit_machine(). The second return statement will never run since the first return statement will cause the function to exit.

    The tweaked code with the roll evaluation logic is below.

    import random
    
    fruit = ["Cherry", "Bell", "Lemon", "Star", "Orange", "Skull"]
    
    def fruit_machine():
        credits = 10
        while credits > 0:
            turn = str(input("Would you like to roll for 20p? Y/N: "))
            if turn.lower() == "y":
                credits -= 2  # Deduct 20p
                credits = fruit_roll(credits)  # Roll fruits and update credits
                credits_print(credits)
            elif turn.lower() == "n":
                print("You have chosen not to roll.")
                break
            else:
                print("Please enter a valid option.")
        print("--------------------------------------\nYou have no more credits remaining")
        end()
    
    def credits_print(credits):
        print("You have", credits, "credits remaining")
    
    def fruit_roll(credits):
        roll = random.choices(fruit, k=3)
        print("Rolled: ", roll)
        if roll.count("Bell") == 3:
            print("Jackpot!!! +5 credits")
            credits += 5
        elif any(roll.count(f) == 2 for f in fruit) and "Skull" not in roll:
            print("Regular prize! +2 credits")
            credits += 2
        if "Skull" in roll:
            print("Skull rolled! -1 credit")
            credits -= 1
        return credits
    
    def end():
        print("Game Over.")
    
    fruit_machine()