The below code*, written in Python, compiled in codeskulptor doesn't increase the global variables c_score and p_score by just 1 in the score() function, instead it increases it endlessly.
*Ignore any formatting errors that might have crept in, the code compiles just fine, it is only the function which doesn't work as intended.
import random
import simplegui #graphic library
'''Following variables are all global variables
which are used in various capacities throughout the program. '''
message = "Welcome to Stone, Paper, Scissors"
c_message = "Computer is waiting for you to begin"
w_message = "The game hasn't begun yet"
number = 0
c_number = 0
c_score = 0
p_score = 0
'''First of the many helper functions, simulates computer
choice and prints relevant message in GUI window'''
def comp_choice():
global c_number #Calling global variable
global c_message
c_number = random.randrange(1,4) #'random' function
if c_number == 1:
c_message = "Computer chose Rock"
elif c_number == 2:
c_message = "Computer chose Paper"
elif c_number == 3:
c_message = "Computer chose scissors"
return c_message
def score():
global c_score
global p_score
global number
global c_number
difference = number - c_number
if difference == -1 or difference == 2:
c_score += 1
elif difference == 1 or difference == -2:
p_score += 1
return str(p_score) + ' ' + str(c_score)
#Functions which code user choice buttons
def rock():
global message #calls for global variable
global number
number = 1
message = "You chose Rock"
'''This function call here is used to stimulate each
round, the one following this applies the logic
of the original game to determine and give results.'''
comp_choice()
game_logic()
def paper():
global number
global message
number = 2
message = "You chose Paper"
comp_choice()
game_logic()
def scissors():
global number
global message
number = 3
message = "You chose Scissors"
comp_choice()
game_logic()
# Heart of the game
def game_logic():
global number
global c_number
global w_message
difference = number - c_number
if difference == -1 or difference == 2:
w_message = "Computer Wins!"
elif difference == 1 or difference == -2:
w_message = "Player Wins!"
else:
w_message = 'Player and Computer Tie'
def draw(canvas):
canvas.draw_text("Player's choice: %s" % message, [0,100], 30, "Red")
canvas.draw_text("Computer's choice: %s" % c_message, [0,125], 30, "Green")
canvas.draw_text(w_message, [0,150], 30, "Black")
canvas.draw_text(score(), [0,75], 30, "Black")
'''Following code registers buttons and their functions, it also creates the playing window.'''
frame = simplegui.create_frame("Home", 700, 200)
frame.set_canvas_background('White')
button1 = frame.add_button( "Rock", rock, 100)
button2 = frame.add_button( "Paper", paper, 100)
button3 = frame.add_button("Scissors", scissors, 100)
frame.set_draw_handler(draw)
frame.start()
The problem isn't in your
scorefunction. That works 'correctly'. The problem is that you are calling thescore()each time you have to draw your GUI.Instead of calling the
score(), do like you do withw_messageone line above. Have thegame_logic()function set ascorestring.As a side note, you should rethink your code structure. Using
globalshould only really be used if you have to; otherwise, you should be using parameters.