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()
1

There are 1 best solutions below

0
On

The problem isn't in your score function. That works 'correctly'. The problem is that you are calling the score() each time you have to draw your GUI.

Instead of calling the score(), do like you do with w_message one line above. Have the game_logic() function set a score string.

As a side note, you should rethink your code structure. Using global should only really be used if you have to; otherwise, you should be using parameters.