Hi,

I have writen a code whit some functions and the program start by launching on of those functions.
The problem is that some of the variables in the functions need too be accessed by other functions. I know that I can use global "variable name" but is there a better way to do that?

I am thinking of using classes to make the variables accessible by other functions. Is that a good way to do it? The variable names is in swe so don't get too confused. The program is a mastermind game where the computer guesses the number.

import random

from kombi import alla_värden


jag_gissar = ("Jag gissar på {0}vad säger du?")
fel_svar = ("Dina svar hänge inte ihop")
fel = ("Fel inmatning")

huvud_meny = (""""Välkommen till MASTERMIND, välj ett alternativ ur menyn:
1. Nytt Spel
2. Jag vill gissa
3. Avsluta

Val: """)

welcome_dator = ("Välkommen till Mastermind Dator!")
think = ("Tänk på ett fyrsiffrigt tal med olika siffror")



def inkonsekvent(p, gissningar):
   for gissning in gissningar:
      res = kontrollera(gissning[0], p)
      (rätt_plats, fel_plats) = gissning[1]
      if res != [rätt_plats, fel_plats]:
         return True # hänger inte ihop med tidigare svar
   return False # hänger ihop med tidigare svar

def kontrollera(p1, p2):
   R = 0
   F = 0
   for i in range(len(p1)):
      if p1[i] == p2[i]:
          R += 1
      else:
         if p1[i] in p2:
            F += 1
   return [R, F]         

def ny_svar():
   # visar gissningen och ber andvändaren om ett svar om vad av den som stämmer.
   rätt_plats = 0
   fel_plats = 0
   #visa_gissning(nya_gissningen[0])
   svar = str(input(jag_gissar.format(visa_gissning(nya_gissningen[0]))))
   for i in svar:
        if i == str("R") or i == str("r"):
            rätt_plats += 1
        elif i == str("F") or i == str("f"):
            fel_plats += 1

   return (rätt_plats, fel_plats)

def ny_svar_kontroll(värde_val):

   rätt_plats, fel_plats = ny_svar()
   if rätt_plats == antal_platser:
      return(värde_val, (rätt_plats, fel_plats))

   if not kontroll_svar((rätt_plats, fel_plats)):
      print(fel)
      return(värde_val, (-1, fel_plats))
   gissningar.append((värde_val, (rätt_plats, fel_plats)))


   värde_val = skapa_ny_gissning() 
   if not värde_val:
      return(värde_val, (-1, fel_plats))
   return(värde_val, (rätt_plats, fel_plats))

def kontroll_svar(a):

   (rätt_plats, fel_plats) = a
   if (rätt_plats + fel_plats > antal_platser) \
       or (rätt_plats + fel_plats > len(värde)):
      return True
   if rätt_plats == 3 and fel_plats == 1:
      return False
   return True

def skapa_ny_gissning():

   nästa_val = next(kombination) 
   while inkonsekvent(nästa_val, gissningar):
      try:
         nästa_val = next(kombination)
      except StopIteration:
         print(fel_svar)
         return exit()
   return nästa_val

def visa_gissningar():
   print("Previous Guesses:")
   for gissning in gissningar:
      gissat_värde = gissning[0]
      for c in gissat_värde:
         print(c, end=" ")
      for i in gissning[1]:
         print(" %i " % i, end=" ")
      print()




def visa_gissning(nya_gissningen):


   formaterat = ""

   for c in nya_gissningen:
      c = str(c)
      formaterat += c + str(" ")

   return formaterat





def mastermind():
   try:
      val = int(input(huvud_meny))
      if val == 1:
         mastermind_dator()

      elif val == 2:
         mastermind_user()
      elif val == 3:
         exit()
   except IOError:
      print(fel_in)


def mastermind_dator():
   värde = []
   värde += range(1,10)
   gissningar = []              
   antal_platser = 4

   kombination = alla_värden(värde, antal_platser)
   värde_val = next(kombination)

   nya_gissningen = (värde_val, (0,0)) 



   while (nya_gissningen[1][0] == -1) or (nya_gissningen[1][0] != antal_platser):
      ############ this is the problem!
      nya_gissningen = ny_svar_kontroll(nya_gissningen[0])



mastermind()

Edited 3 Years Ago by a8med

the variabel svar in function ny_svar requaiers the variebel nya_gissningen but is in the funtktion mastermind_dator and cant acces it.

It is a very good idea to use a class instance to handle this. You can add a parameter self to all the functions and refactor the code like this:

import random
# ...
think = ("Tänk på ett fyrsiffrigt tal med olika siffror")

class Mastermind:
    def __init__(self):
        self.nya_gissningen = None

    def inkonsekvent(self, p, gissningar):
        # ...

    def ny_svar(self):
        # ...
        # ......... self.nya_gissningen[0] ...

    # ...

    def mastermind_dator(self):
        # ...
        self.nya_gissningen = ...

Mastermind().mastermind()

Edited 3 Years Ago by Gribouillis

I agree, passing your variables via self to your class methods will make your life easier.

This question has already been answered. Start a new discussion instead.