Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

θελω να κάνω ένα πρόγραμμα στην python όπου υλοποιεί μια απλή εκδοχή του scrabble. 

μέχρι στιγμής έχω κάνει μια κλάση στην οποία δημιουργείτε το σακουλάκι με τα γράμματα, και ανακατεύονται μέσα στο σακουλάκι. 

επιπλέον θέλω απο το ανακατεμένο πλέον σακουλάκι να επιλέγονται τυχαία επτά γράμματα. μέχρι στιγμής ο κώδικας μου ειναι ο εξής: 

import random
class SakClass():
#μεθοδος κατασκευαστή
#Orizei to lexiko me to posa grammata uparxoun sto sakoulaki kai ti vatmo pianoun

    def __init__(self):
         self.lets = {'Α':[12,1],'Β':[1,8],'Γ':[2,4],'Δ':[2,4],'Ε':[8,1],
                     'Ζ':[1,10],'Η':[7,1],'Θ':[1,10],'Ι':[8,1],'Κ':[4,2],
                     'Λ':[3,3],'Μ':[3,3],'Ν':[6,1],'Ξ':[1,10],'Ο':[9,1],
                     'Π':[4,2],'Ρ':[5,2],'Σ':[7,1],'Τ':[8,1],'Υ':[4,2],
                     'Φ':[1,8],'Χ':[1,8],'Ψ':[1,10],'Ω':[3,3]}
         self.letlist = []
         self.randomize_sak()
         self.lets_set=set()
def get_sak():
    return list(lets)

#dimiourgei mia lista prosthetontas tyxaia grammata ap to sakoulaki
def randomize_sak(self):
        self.letlist=[]
        for i in self.lets:
            for k in range(self.lets[i][0]):
                self.letlist.append(i)
        random.shuffle(self.letlist)


def main():
    k=r.SakClass()
    k.__init__()
    k.randomize_sak()
        




αλλα δεν υλοποιεί τις παραπάνω λειτουργίες. που έχω κάνει λάθος?

ευχαριστώ εκ των προτέρων

Δημοσ.
    def select_letters(self):
        l=[]
        for i in range(6):
            l.append(random.choice(list(self.lets))) 
  

η συνάρτηση θα είναι αυτή, αλλά το πρόβλημα είναι ότι δεν μπορεί να πάρει σαν παράμετρο το λεξικό και δεν επιλέγει γράμματα απο το ήδη ανακατεμένο σακουλάκι

Δημοσ.

Δεν χρειάζεται να ανακατέψεις το σακουλάκι. Η choices το κάνει μόνη της.

In [13]: import random
In [14]: lets = {'Α':[12,1],'Β':[1,8],'Γ':[2,4],'Δ':[2,4],'Ε':[8,1],
    ...:                      'Ζ':[1,10],'Η':[7,1],'Θ':[1,10],'Ι':[8,1],'Κ':[4,2],
    ...:                      'Λ':[3,3],'Μ':[3,3],'Ν':[6,1],'Ξ':[1,10],'Ο':[9,1],
    ...:                      'Π':[4,2],'Ρ':[5,2],'Σ':[7,1],'Τ':[8,1],'Υ':[4,2],
    ...:                      'Φ':[1,8],'Χ':[1,8],'Ψ':[1,10],'Ω':[3,3]}
In [15]: random.choices(list(lets.keys()), k=7)
Out[15]: ['Τ', 'Ρ', 'Η', 'Υ', 'Ξ', 'Χ', 'Θ']

Για την ακρίβεια το "lets" δεν θα το έβαζα καν σαν attribute του instance. Αφού έιναι constant, δεν υπάρχει λόγο να δημιουργείς το ίδιο dict για κάθε παίχτη. θα το κάνεις είτε ξεχωριστό object στο global namespace, είτε class attribute.


επίσης αν το lets είναι συντόμευση του "letters" θα σου πρότεινα να αρχίσεις να βάζεις περιγραφικά ονόματα στις μεταβλητές σου.

Δημοσ.

Δεν έχω παίξει scrabble αλλά νομίζω τα γράμματα πρέπει να τα βγάζεις από το σακουλάκι που έχει τα γράμματα μέσα (letlist) για να αδειάζει αλλιώς θα συνεχίσει να έχει πάντα μέσα όλα τα γράμματα 

  
    seven, letlist= letlist[:7], letlist[7:]
    random.shuffle(letlist)
  
    #Δεν χρειάζεται το try τελικά γιατί δεν κάνει error
Δημοσ.

 

Δεν έχω παίξει scrabble αλλά νομίζω τα γράμματα πρέπει να τα βγάζεις από το σακουλάκι που έχει τα γράμματα μέσα (letlist) για να αδειάζει αλλιώς θα συνεχίσει να έχει πάντα μέσα όλα τα γράμματα 

  try:
    seven, letlist= letlist[:7], letlist[7:]
    random.shuffle(letlist)
  except IndexError:
    seven ,letlist=letlist,[]
    

ναι γι αυτο πρέπει για τον κάθε παίκτη να γεμίζει το σακουλάκι. 

αυτό προσπάθησα να κάνω με την randomize_sak

Δημοσ.

ναι γι αυτο πρέπει για τον κάθε παίκτη να γεμίζει το σακουλάκι. 

αυτό προσπάθησα να κάνω με την randomize_sak

Εννοείς για κάθε νέο παιχνίδι

Την randomize_sak άστην είναι εντάξει, νομίζω ότι η λίστα προσομοιάζει καλά το σακούλι με τα γράμματα.

def select_letters(self):
        self.seven, self.letlist=self.letlist[:7],self.letlist[7:]
        random.shuffle(self.letlist)
        return self.seven

#και παίρνεις τα "τελείως τυχαία"   :-D 7 πρώτα γράμματα

Δημοσ.
def main():
    start()
    k=r.SakClass()
    k.__init__()
    k.randomize_sak()
    k.select_letters()

η start είναι πάνω απο την main και οι αλλες είναι σε αλλη βιβλιοθήκη που εχω κανει import. αλλα δεν τρέχουν καμια. γιατι?

Δημοσ.

Για την απάντηση μου παίρνω υπόψη και τον αρχικό σου κώδικα

 

Κατ αρχήν τις μεθόδους που αρχίζουν και τελειώνουν με __ δεν τις καλούμε απευθείας αλλά με διαφορετικό τρόπο

την __init__ συγκεκριμένα δεν την καλούμε καθόλου, καλείται μόνη της με την δημιουργία του αντικειμένου

εφόσον μέσα στην __init__ έχεις άλλες μεθόδους όπως στο πρώτο μύνημα δεν χρειάζεται να καλέσεις ούτες αυτές γιατί και αυτές καλούνται μέσω της __init__

https://docs.python.org/3/reference/datamodel.html?highlight=__init__#object.__init__

οπότε μεγάλο μέρος της main σου είναι λάθος

>>> class SakClass():
  def __init__(self):
    self.lets = {'Α':[12,1],'Β':[1,8],'Γ':[2,4],'Δ':[2,4],'Ε':[8,1],
                     'Ζ':[1,10],'Η':[7,1],'Θ':[1,10],'Ι':[8,1],'Κ':[4,2],
                     'Λ':[3,3],'Μ':[3,3],'Ν':[6,1],'Ξ':[1,10],'Ο':[9,1],
                     'Π':[4,2],'Ρ':[5,2],'Σ':[7,1],'Τ':[8,1],'Υ':[4,2],
                     'Φ':[1,8],'Χ':[1,8],'Ψ':[1,10],'Ω':[3,3]}
    self.randomize_sak()
      
  def randomize_sak(self):
    self.letlist=[]
    for i in self.lets:
      for k in range(self.lets[i][0]):
        self.letlist.append(i)
    random.shuffle(self.letlist)

  def select_letters(self):
    random.shuffle(self.letlist)  
    self.seven, self.letlist=self.letlist[:7],self.letlist[7:]
    return self.seven

Όταν τώρα κάνω ένα αντικείμενο από την κλάση εκτελούνται και η __init__ και η randomize_sak()

>>> κ=SakClass()
>>> k.select_letters()#καλώ μόνο αυτήν
['Ρ', 'Α', 'Ε', 'Η', 'Ι', 'Ε', 'Μ']
>>> k.seven
['Ρ', 'Α', 'Ε', 'Η', 'Ι', 'Ε', 'Μ']
>>> len(k.letlist)
95

Την επόμενη φορά που θα ξανακαλέσω την select_letters

>>> k.select_letters()
['Σ', 'Β', 'Α', 'Α', 'Δ', 'Π', 'Ο']
>>> len(k.letlist)
88
Δημοσ.

αλλαξα οπως ανεφερες την main αλλα πάλι τίποτα 

def main():
    k=SakClass()
    k.select_letters()



ο κώδικας είναι οπως είναι και πάνω.

θέλω όταν πατάω run να εκτελούνται οι def και να μου εμφανίζονται κατευθειαν τα 7  γράμματα

Δημοσ.

αλλαξα οπως ανεφερες την main αλλα πάλι τίποτα 

def main():
    k=SakClass()
    k.select_letters()



ο κώδικας είναι οπως είναι και πάνω.

θέλω όταν πατάω run να εκτελούνται οι def και να μου εμφανίζονται κατευθειαν τα 7  γράμματα

Πρέπει να δω την δομή του προγράμματος σου για να καταλάβω πως έχεις τα αρχεία δηλαδή + την run

Σε εμένα στον idle :

>>> scrabble=SakClass()
>>> def main(obj):
  return obj.select_letters()
>>> main(scrabble)
['Ο', 'Τ', 'Ρ', 'Σ', 'Η', 'Τ', 'Σ']
>>> 
Δημοσ.

 

Πρέπει να δω την δομή του προγράμματος σου για να καταλάβω πως έχεις τα αρχεία δηλαδή + την run

Σε εμένα στον idle :

>>> scrabble=SakClass()
>>> def main(obj):
  return obj.select_letters()
>>> main(scrabble)
['Ο', 'Τ', 'Ρ', 'Σ', 'Η', 'Τ', 'Σ']
>>> 

το εστειλα σε pm

Δημοσ.

Η δημόσια ανάρτηση βοηθάει πιθανόν και άλλους 

και ίσως πάρεις βοήθεια σε πράγματα που εγώ δεν βλέπω

Σου έχω απαντήσει  :-)

Δημοσ.

  1. Για αυτό που θες να κάνεις δε χρειάζεσαι κλάσεις

Τα functions δεν καλούνται από μόνα τους, όταν γράψεις ένα main() δε θα καλεστεί αυτόματα αν δεν το καλέσεις εσύ. H Python δεν είναι ούτε Java ούτε C.

  • Like 1
Δημοσ.

 

  1. Για αυτό που θες να κάνεις δε χρειάζεσαι κλάσεις
  2. Τα functions δεν καλούνται από μόνα τους, όταν γράψεις ένα main() δε θα καλεστεί αυτόματα αν δεν το καλέσεις εσύ. H Python δεν είναι ούτε Java ούτε C.

 

δηλαδη αν εχω μια συνάρτηση που θελω να κανει καποιες ενεργειες(σε αυτην την περιπτωση να εκτυπωνει μυνηματα στην οθονη) πως την καλώ?

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...