1,105,406 Community Members

New to python, criticism required

Member Avatar
bulleh
Newbie Poster
4 posts since Jan 2013
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

Hi guys!,

I thought i'd try and learn a bit of python to keep myself occupied, and i was wondering if you could give me some constructive criticism on a word guessing game i have created. I'm an amatuer programmer and i'm always looking at improving when and where ever i can.

You can see the code below.

import random

#global 
LIVES = 5
CORRECT = 0
GUESSED = []


#main is first function to be called, which intiates everything.
def main():
    startGame()
    difficulty = input()
    playGame(difficulty)

#choice for options
def startGame():
    print ("So you would like to play a word game? \n")
    print ("Please choose a difficulty")
    print ("0:    Easy")
    print ("1:    Medium")
    print ("2:    Hard")

#which actually initiates the game fully, bringing in the right difficulty, then running the game.
def playGame(difficulty):
    global LIVES
    global CORRECT
    global GUESSED

    if(difficulty == 0):
        selectedWord = ["dog", "cat", "cow", "eat", "mut","die","cry","buy","why"]
    elif(difficulty == 1):
        selectedWord = ["joker","poker","pride","cried","lied"]
    elif(difficulty == 2):
        selectedWord = ["medium", "elephant", "cheeses", "breeder", "sugar", "python"]

    print("Easy? Really? You Wimp!\n")
    length =random.choice(selectedWord)
    print("The length of your word is"), len(length)

    print length #in for testing purposes.
    while(LIVES !=0 and CORRECT != 1):
        word_update(length,GUESSED)
        if(CORRECT==1):
           break
        print("Press 1 to enter a letter, or 2 to guess the full word")
        enternw = input()
        guess(enternw, length)
        replayGame(length)

#replay the game option.
def replayGame(word):
    global LIVES
    if(LIVES == 0):
        print ("GAME OVER, You ran out of LIVES \n The word was"), word
        print ("Would you like to replay?, Y for yes, N for no")
        replay = raw_input()
        if(replay == "y" or replay == "Y"):
            LIVES = 5
            main()
        elif(replay == "n" or replay == "N"):
            print ("Thank you for playing") 
        else:("Unknown Option. Goodbye")

#determines whether to enter letter or word, then runs and controls lives etc. 
def guess(enternw, length):
    global LIVES
    global CORRECT
    global GUESSED

    if(enternw == 1):       
        print("You chose to select a letter, please selecter a letter")
        letter = raw_input()

        if (letter in GUESSED):
            print("You already guessed"), letter
        elif(letter in length):
            print"Found",letter
            print length.find(letter)
            GUESSED.append(letter)
        else:
            print "Not Found"
            LIVES = LIVES - 1
            print LIVES,("Lives Remain")
            GUESSED.append(letter)
    if(enternw == 2):
        print("You chose to guess a word, please guess the word.")
        guessedWord = raw_input()
        if(guessedWord == length):
            print("Correct, the word was"), length
            CORRECT = 1
        else: 
            print("Sorry, wrong word, keep trying!")
            LIVES = LIVES - 1
            print LIVES,("Lives Remain")

#courtesy of http://www.daniweb.com/software-development/python/threads/59737/guess-a-word
def word_update(word, letters_guessed):
    global CORRECT
    masked_word = ""
    for letter in word:
        if letter in letters_guessed:
            masked_word += letter
        else: masked_word += "-"
    print "The word:", masked_word
    if(word == masked_word): 
        print("You guessed correct, well done!")
        CORRECT = 1

main()
Member Avatar
vegaseat
DaniWeb's Hypocrite
6,984 posts since Oct 2004
Reputation Points: 1,544 [?]
Q&As Helped to Solve: 1,872 [?]
Skill Endorsements: 67 [?]
Moderator
 
0
 

Line 62 should be
else: print("Unknown Option. Goodbye")
Also put in a console wait line after that line ...
raw_input("Press Enter to go on ...")

Line 36 should be part of the line 29 if statment.
Your print statements are misleading. For instance,
line 38 is a dangerous mix of Python2 print and Python3 print().

In general, if and elif are statements and shouldn't be written like they are functions().
In Python something() indicates a function and its call, anything else can be confusing.

Member Avatar
bulleh
Newbie Poster
4 posts since Jan 2013
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

Cool, i'll get these sorted.

for line 38, would
print("The length of your word is %s") % len(length)
be better?

Member Avatar
dashing.adamhughes
Light Poster
38 posts since Nov 2012
Reputation Points: 0 [?]
Q&As Helped to Solve: 10 [?]
Skill Endorsements: 1 [?]
 
1
 

I think a program to represent a game is a good introduction to object oriented programming. When you find yourself defining several global variables that are shared between a bunch of functions, you should build a game class. Imagine you wanted to increase the complexity of your game. At some point, you will have to reuse functions and add more to them, at each stage, the value of youra various global variables will be important to how the game proceeds... this has object oriented written all over it.

Member Avatar
vegaseat
DaniWeb's Hypocrite
6,984 posts since Oct 2004
Reputation Points: 1,544 [?]
Q&As Helped to Solve: 1,872 [?]
Skill Endorsements: 67 [?]
Moderator
 
1
 

this would still be a mixed up statement and function style
print("The length of your word is %s") % len(length)
should be (Python2 only statement style)
print "The length of your word is %s" % len(length)
or better use the print() function (okay with Python2 and Python3)
print("The length of your word is %s" % len(length))

Using OOP for simple code like this is probably overkill, but might be a good exercise.
Well, at least you made the global names capitals.

Member Avatar
Lardmeister
Posting Virtuoso
1,966 posts since Mar 2007
Reputation Points: 434 [?]
Q&As Helped to Solve: 111 [?]
Skill Endorsements: 8 [?]
 
2
 

Here is an example how to write your program in OOP style. Look no global stuff!
Study the details.

''' class_word_game1.py
guess the word game using Object Oriented Programming (OOP)
'''

import random

# avoids using raw_input() for strings
# code can be used with Python2 or Python3
try:
    input = raw_input
except:
    pass

class WordGame(object):

    def __init__(self):
        # prefix self. makes variable available for all methods in class
        self.lives = 5
        self.correct = 0
        self.guessed = []
        # class methods are called with a self. prefix
        self.difficulty = self.start_game()
        self.play_game()

    def start_game(self):
        '''a class method's first argument is self'''
        print("So you would like to play a word game? \n")
        print("Please choose a difficulty")
        print("0:    Easy")
        print("1:    Medium")
        print("2:    Hard")
        diffculty = int(input("Enter 0, 1 or 3: "))
        return diffculty

    def play_game(self):

        if self.difficulty == 0:
            selectedWord = ["dog", "cat", "cow", "eat",
                "mut","die","cry","buy","why"]
            print("Easy? Really? You Wimp!\n")
        elif self.difficulty == 1:
            selectedWord = ["joker","poker","pride","cried","lied"]
        elif self.difficulty == 2:
            selectedWord = ["medium", "elephant", "cheeses",
                "breeder", "sugar", "python"]

        word = random.choice(selectedWord)
        print("The length of your word is %d" % len(word))

        print(word) #in for testing purposes.
        while self.lives !=0 and self.correct != 1:
            self.word_update(word)
            if self.correct == 1:
                break
            print("Press 1 to enter a letter, or 2 to guess the full word")
            enternw = int(input(">> "))
            self.guess(enternw, word)
            self.replay_game(word)

    def replay_game(self, word):

        if(self.lives == 0):
            print("GAME OVER, You ran out of Lives!")
            print("The word was %s" % word)
            print("Would you like to replay?")
            replay = input("Y for yes, N for no ").upper()
            if replay == "Y":
                self.lives = 5
                self.play_game()
            elif replay == "N":
                print("Thank you for playing")
            else:
                print("Unknown Option. Goodbye")

    def guess(self, enternw, word):

        if enternw == 1:
            print("You chose to select a letter, please select a letter")
            letter = input(">> ")

            if letter in self.guessed:
                print("You already guessed %s" % letter)
            elif letter in word:
                print("Found %s" % letter)
                print("%d Lives Remain" % self.lives)
                #print(word.find(letter))  # test
                self.guessed.append(letter)
            else:
                print("Not Found")
                self.lives -= 1
                print("%d Lives Remain" % self.lives)
                self.guessed.append(letter)
        if enternw == 2:
            print("You chose to guess a word, please guess the word.")
            guessedWord = input()
            if guessedWord == word:
                print("Correct, the word was %s" % word)
                self.correct = 1
            else:
                print("Sorry, wrong word, keep trying!")
                self.lives -= 1
                print("%d Lives Remain" % self.lives)

    #courtesy of
    #http://www.daniweb.com/software-development/python/threads/59737/guess-a-word
    def word_update(self, word):

        masked_word = ""
        for letter in word:
            #print(letter, self.guessed)  # test
            if letter in self.guessed:
                masked_word += letter
            else:
                masked_word += "-"
        print("The word: %s" % masked_word)
        if word == masked_word:
            print("You guessed correct, well done!")
            self.correct = 1


# create the instance to start the game
mygame = WordGame()
Member Avatar
bulleh
Newbie Poster
4 posts since Jan 2013
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

Cheers, i don't really know why i didn't start with OO in the first place.

How do you clear the command line screen?
(i'm using work computer to do this, and we are not allowed to download to computer so i'm using repl.it to run my code.)

Member Avatar
Ene Uran
Posting Virtuoso
1,822 posts since Aug 2005
Reputation Points: 610 [?]
Q&As Helped to Solve: 278 [?]
Skill Endorsements: 10 [?]
 
2
 

If you have the Windows OS, maybe you should look into Portable Python and run your code from a USB flashcard, and also use the PyScripter IDE that comes with it.

For the free download and info see:
http://www.portablepython.com/releases/

Since you are a beginner I would download Python version 2.7.3 it makes working with older code examples much easier.

Member Avatar
Ene Uran
Posting Virtuoso
1,822 posts since Aug 2005
Reputation Points: 610 [?]
Q&As Helped to Solve: 278 [?]
Skill Endorsements: 10 [?]
 
1
 

The console screen can be cleared with multiple print():

for x in range(40):
    print('')

Or simply:
print('\n'*40)

Member Avatar
bulleh
Newbie Poster
4 posts since Jan 2013
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

Good idea, i'll look into that, and thanks for the console clear tip.

Question Answered as of 1 Year Ago by vegaseat, Ene Uran, Lardmeister and 1 other
You
This question has already been solved: Start a new discussion instead
Post:
Start New Discussion
View similar articles that have also been tagged: