4
\$\begingroup\$

I completed writing a dice roll script in Python but I thought it looked too messy. Is there anything I should change here?

import random, os class Dice: result = [] total = 0 def __roll_(sides=1): return random.randint(1, sides) def roll(sides=1, times=1): for time in range(0, times): Dice.result.append(Dice.__roll_(sides)) Dice.result = Dice.result[len(Dice.result) - times:len(Dice.result)] Dice.sumResult() return Dice.result def sumResult(): Dice.total = 0 for num in range(0, len(Dice.result)): Dice.total += Dice.result[num] return Dice.total def saveResult(directory=''): if directory == '': savetxt = open('savedResult.txt', 'a+') else: savetxt = open(os.path.join(directory, 'savedResult.txt'), 'a+') savetxt.write(str(Dice.result) + '\n') savetxt.close() def saveTotal(directory=''): if directory == '': savetxt = open('savedTotal.txt', 'a+') else: savetxt = open(os.path.join(directory, 'savedTotal.txt'), 'a+') savetxt.write(str(Dice.total) + '\n') savetxt.close() 
\$\endgroup\$
0

    2 Answers 2

    4
    \$\begingroup\$

    Your class is not a class, self is totally missing. You have to rewrite the whole thing. Internal methods start with one single underscore _roll. You can access lists from the end with negative indices, len in unnesseccary. Never change the internal state of a instance and return a value. Do the one or the other. You can join with empty strings, if is unneccessary. Open files with the with-statement. Never use the string representation of python objects like lists or dicts for other purposes than debugging. Remember the naming conventions in PEP-8.

    import random import os class Dice: def __init__(self, sides=1): self.sides = sides self.result = [] self.total = 0 def _roll(self): return random.randint(1, self.sides) def roll(self, times=1): self.result[:] = [self._roll() for time in range(times)] self.sum_result() def sum_result(self): self.total = sum(self.result) def save_result(self, directory=''): with open(os.path.join(directory, 'savedResult.txt'), 'a') as txt: txt.write('%s\n' % ', '.join(map(str, self.result))) def save_total(directory=''): with open(os.path.join(directory, 'savedTotal.txt'), 'a') as txt: txt.write('%d\n' % self.total) 
    \$\endgroup\$
    1
    • \$\begingroup\$Oh my goodness, that's why it looked so bad! I knew I was missing something. Thanks!\$\endgroup\$
      – ChaiNunes
      CommentedJan 3, 2016 at 22:02
    4
    \$\begingroup\$

    @Daniel rightfully noted:

    Your class is not a class, self is totally missing

    I am going to question the basis of your design, does a class represent the best way to program a Dice rolling script?

    Even if you like the idea of a class, think about about the separation of concerns, why should a Dice know how to save its result to a file?

    My implementation of the script just uses some functions, and i feel like this is a big simplification, remember OOP, as any programming paradigm, is not the final perfect solution to all design problems:

    import random import os def roll(sides): return random.randint(1, sides) def roll_many(sides, times): return (roll(sides) for time in range(times)) def save_list_to_file(list_, directory=''): with open(os.path.join(directory, 'savedResult.txt'), 'a') as txt: txt.write('%s\n' % ', '.join(map(str, list_))) def save_number_to_file(n, directory=''): with open(os.path.join(directory, 'savedTotal.txt'), 'a') as txt: txt.write('%d\n' % n) 
    \$\endgroup\$
    1
    • 1
      \$\begingroup\$Thanks for the non-OOP answer; I find it great, but I'm planning on sticking with a class.\$\endgroup\$
      – ChaiNunes
      CommentedJan 3, 2016 at 22:30

    Start asking to get answers

    Find the answer to your question by asking.

    Ask question

    Explore related questions

    See similar questions with these tags.