george1703 Δημοσ. 29 Αυγούστου 2017 Δημοσ. 29 Αυγούστου 2017 θελω να κάνω ένα πρόγραμμα στην 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() αλλα δεν υλοποιεί τις παραπάνω λειτουργίες. που έχω κάνει λάθος? ευχαριστώ εκ των προτέρων
pmav99 Δημοσ. 29 Αυγούστου 2017 Δημοσ. 29 Αυγούστου 2017 1. Φτιάξε το indentation 2. random.choices is your friend
george1703 Δημοσ. 29 Αυγούστου 2017 Μέλος Δημοσ. 29 Αυγούστου 2017 def select_letters(self): l=[] for i in range(6): l.append(random.choice(list(self.lets))) η συνάρτηση θα είναι αυτή, αλλά το πρόβλημα είναι ότι δεν μπορεί να πάρει σαν παράμετρο το λεξικό και δεν επιλέγει γράμματα απο το ήδη ανακατεμένο σακουλάκι
pmav99 Δημοσ. 29 Αυγούστου 2017 Δημοσ. 29 Αυγούστου 2017 Δεν χρειάζεται να ανακατέψεις το σακουλάκι. Η 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" θα σου πρότεινα να αρχίσεις να βάζεις περιγραφικά ονόματα στις μεταβλητές σου.
k33theod Δημοσ. 29 Αυγούστου 2017 Δημοσ. 29 Αυγούστου 2017 Δεν έχω παίξει scrabble αλλά νομίζω τα γράμματα πρέπει να τα βγάζεις από το σακουλάκι που έχει τα γράμματα μέσα (letlist) για να αδειάζει αλλιώς θα συνεχίσει να έχει πάντα μέσα όλα τα γράμματα seven, letlist= letlist[:7], letlist[7:] random.shuffle(letlist) #Δεν χρειάζεται το try τελικά γιατί δεν κάνει error
george1703 Δημοσ. 29 Αυγούστου 2017 Μέλος Δημοσ. 29 Αυγούστου 2017 Δεν έχω παίξει scrabble αλλά νομίζω τα γράμματα πρέπει να τα βγάζεις από το σακουλάκι που έχει τα γράμματα μέσα (letlist) για να αδειάζει αλλιώς θα συνεχίσει να έχει πάντα μέσα όλα τα γράμματα try: seven, letlist= letlist[:7], letlist[7:] random.shuffle(letlist) except IndexError: seven ,letlist=letlist,[] ναι γι αυτο πρέπει για τον κάθε παίκτη να γεμίζει το σακουλάκι. αυτό προσπάθησα να κάνω με την randomize_sak
k33theod Δημοσ. 29 Αυγούστου 2017 Δημοσ. 29 Αυγούστου 2017 ναι γι αυτο πρέπει για τον κάθε παίκτη να γεμίζει το σακουλάκι. αυτό προσπάθησα να κάνω με την 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 #και παίρνεις τα "τελείως τυχαία" 7 πρώτα γράμματα
george1703 Δημοσ. 31 Αυγούστου 2017 Μέλος Δημοσ. 31 Αυγούστου 2017 def main(): start() k=r.SakClass() k.__init__() k.randomize_sak() k.select_letters() η start είναι πάνω απο την main και οι αλλες είναι σε αλλη βιβλιοθήκη που εχω κανει import. αλλα δεν τρέχουν καμια. γιατι?
k33theod Δημοσ. 31 Αυγούστου 2017 Δημοσ. 31 Αυγούστου 2017 Για την απάντηση μου παίρνω υπόψη και τον αρχικό σου κώδικα Κατ αρχήν τις μεθόδους που αρχίζουν και τελειώνουν με __ δεν τις καλούμε απευθείας αλλά με διαφορετικό τρόπο την __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
george1703 Δημοσ. 31 Αυγούστου 2017 Μέλος Δημοσ. 31 Αυγούστου 2017 αλλαξα οπως ανεφερες την main αλλα πάλι τίποτα def main(): k=SakClass() k.select_letters() ο κώδικας είναι οπως είναι και πάνω. θέλω όταν πατάω run να εκτελούνται οι def και να μου εμφανίζονται κατευθειαν τα 7 γράμματα
k33theod Δημοσ. 31 Αυγούστου 2017 Δημοσ. 31 Αυγούστου 2017 αλλαξα οπως ανεφερες την main αλλα πάλι τίποτα def main(): k=SakClass() k.select_letters() ο κώδικας είναι οπως είναι και πάνω. θέλω όταν πατάω run να εκτελούνται οι def και να μου εμφανίζονται κατευθειαν τα 7 γράμματα Πρέπει να δω την δομή του προγράμματος σου για να καταλάβω πως έχεις τα αρχεία δηλαδή + την run Σε εμένα στον idle : >>> scrabble=SakClass() >>> def main(obj): return obj.select_letters() >>> main(scrabble) ['Ο', 'Τ', 'Ρ', 'Σ', 'Η', 'Τ', 'Σ'] >>>
george1703 Δημοσ. 31 Αυγούστου 2017 Μέλος Δημοσ. 31 Αυγούστου 2017 Πρέπει να δω την δομή του προγράμματος σου για να καταλάβω πως έχεις τα αρχεία δηλαδή + την run Σε εμένα στον idle : >>> scrabble=SakClass() >>> def main(obj): return obj.select_letters() >>> main(scrabble) ['Ο', 'Τ', 'Ρ', 'Σ', 'Η', 'Τ', 'Σ'] >>> το εστειλα σε pm
k33theod Δημοσ. 31 Αυγούστου 2017 Δημοσ. 31 Αυγούστου 2017 Η δημόσια ανάρτηση βοηθάει πιθανόν και άλλους και ίσως πάρεις βοήθεια σε πράγματα που εγώ δεν βλέπω Σου έχω απαντήσει
iceblade Δημοσ. 31 Αυγούστου 2017 Δημοσ. 31 Αυγούστου 2017 Για αυτό που θες να κάνεις δε χρειάζεσαι κλάσεις Τα functions δεν καλούνται από μόνα τους, όταν γράψεις ένα main() δε θα καλεστεί αυτόματα αν δεν το καλέσεις εσύ. H Python δεν είναι ούτε Java ούτε C. 1
george1703 Δημοσ. 1 Σεπτεμβρίου 2017 Μέλος Δημοσ. 1 Σεπτεμβρίου 2017 Για αυτό που θες να κάνεις δε χρειάζεσαι κλάσεις Τα functions δεν καλούνται από μόνα τους, όταν γράψεις ένα main() δε θα καλεστεί αυτόματα αν δεν το καλέσεις εσύ. H Python δεν είναι ούτε Java ούτε C. δηλαδη αν εχω μια συνάρτηση που θελω να κανει καποιες ενεργειες(σε αυτην την περιπτωση να εκτυπωνει μυνηματα στην οθονη) πως την καλώ?
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα