def _quit(code=0): """Cleanly closes the game""" # In error codes, 0 = clean close, no errors # 1 = closed with errors, very bad if code == 1: log.critical("Game quiting with errors!") else: log.info("Game quiting...") pygame.display.quit() pygame.quit() exit(code)
def renderer(playField): """ Inverts and prints out the play field :param playField: The play field :return: None """ try: playField = np.flip(playField, 0) for col in range(COLUMN_COUNT): for row in range(ROW_COUNT): if not TestMode: pygame.draw.rect(screen, (0, 89, 179), ((col * 100), (row * 100) + 100, 100, 100)) else: pygame.draw.rect(screen, (210, 0, 252), ((col * 100), (row * 100) + 100, 100, 100)) for col in range(COLUMN_COUNT): for row in range(ROW_COUNT): if playField[row][col] == 0: pygame.draw.circle(screen, (0, 0, 0), ((col * 100) + 50, (row * 100) + 150), radius) if playField[row][col] == 1: pygame.draw.circle(screen, (206, 22, 48), ((col * 100) + 50, (row * 100) + 150), radius) if playField[row][col] == 2: pygame.draw.circle(screen, (255, 201, 23), ((col * 100) + 50, (row * 100) + 150), radius) playField = np.flip(playField, 0) return True except Exception as e: log.critical("Renderer failed with error {}".format(e)) _quit(1)
def _input(playField, turn, pos): """ Gets the player's move and validate it param playField: the play field :param turn: the current turn :return: the column the player chose """ # If AI is enabled, this if statement will call ai to give a column number if TestMode: if AIMode and (turn % 2 == 0): return _get_AI_move(playField) return random.randint(0, ROW_COUNT) if turn % 2 == 0 and AIMode: log.debug("Polling AI code for its move...") col = _get_AI_move(playField) """ # todo: call some function that'll return a column number col = 0 # todo: remove this line return # todo: remove this line and uncomment and edit the line below col = ["some function to get a value off the AI"] """ ### SANITY CHECKS ### if col is None: log.critical("AI returned Null value") _quit(1) # exit with an error condition try: int(col) except ValueError: log.critical("AI didnt return an int") _quit(1) # exit with an error condition if col > COLUMN_COUNT - 1: log.critical("AI returned an impossible position") _quit(1) # exit with an error condition else: # value from the AI should be known good now, it can be used safely log.debug("AI is putting its piece on column {}".format(col)) return col else: # if AIMode is not enabled, or its player 1, take input if turn % 2 == 0 and DataGatherMode: col = random.sample([0, 1, 2, 3, 4, 5, 6], 1) while not _validate_move(playField, col): col = random.sample([0, 1, 2, 3, 4, 5, 6], 1) log.debug("Randomiser clicked at {}|{} = column: {}".format( pos[0], pos[1], col)) else: posx = pos[0] col = int(math.floor(posx / 100)) if col > COLUMN_COUNT - 1: return None log.debug("Player clicked at {}|{} = column: {}".format( pos[0], pos[1], col)) return col
def renderer(playField): """ Inverts and prints out the play field :param playField: The play field :return: None """ global hueHSV screen.fill((0, 0, 0)) try: playField = np.flip(playField, 0) for col in range(COLUMN_COUNT): for row in range(ROW_COUNT): if not TestMode: pygame.draw.rect(screen, (0, 89, 179), ((col * 100), (row * 100) + 100, 100, 100)) else: RGB = hsv_to_rgb(hueHSV, 1, 1) if hueHSV == 361: hueHSV = 0 pygame.draw.rect(screen, RGB, ((col * 100), (row * 100) + 100, 100, 100)) for col in range(COLUMN_COUNT): for row in range(ROW_COUNT): if playField[row][col] == 0: pygame.draw.circle(screen, (0, 0, 0), ((col * 100) + 50, (row * 100) + 150), radius) if playField[row][col] == 1: pygame.draw.circle(screen, (206, 22, 48), ((col * 100) + 50, (row * 100) + 150), radius) if playField[row][col] == 2: pygame.draw.circle(screen, (255, 201, 23), ((col * 100) + 50, (row * 100) + 150), radius) playField = np.flip(playField, 0) ### User interface junk # Create all needed surfaces textSurfaces = { "title": small_text.render("Connect 4", True, (255, 255, 255)), "NullSpacer": small_text.render("Wooo im invisible", False, (0, 0, 0)), "turnNum": small_text.render("Turn: " + str(turn), True, (255, 255, 255)), "AIMode": small_text.render("AI: %s" % ("Active" if AIMode else "Disabled"), True, (255, 255, 255)), "TestMode": small_text.render( "TestMode: %s" % ("Active" if TestMode else "Disabled"), True, (255, 255, 255)), } # starting positions posX = ROW_COUNT * 100 + 200 posY = 125 # Iterate through all surfaces for key, value in textSurfaces.items(): rect = textSurfaces[key].get_rect() rect.center = (posX, posY) posY += 25 screen.blit(textSurfaces[key], rect) return True except Exception as e: log.critical("Renderer failed with error {}".format(e)) _quit(1)