def mostrarTurno(lista_jugadores, PANTALLA, cursor): turno = "" for j in lista_jugadores: if (j.turno): turno = j.nombre break display_box(PANTALLA, "Turno: %s" % turno, cursor, 666, (40 * 5) + 130)
def mostrarJugadores(lista_jugadores, PANTALLA, cursor): xj = 630 yj = 130 display_box(PANTALLA, 'Jugadores', cursor, xj, yj) for jug in lista_jugadores: yj += 40 display_box(PANTALLA, "%s -> %s" % (jug.color, jug.nombre), cursor, xj, yj)
def clientMenu(): global server_addr buttontimer = pygame.time.get_ticks() pygame.mouse.set_visible(1) start = ButtonClass("Start", WHITE, 90, startClient) exit = ButtonClass("exit", WHITE, 120, sys.exit) SCREEN.fill(BLACK) start.update() exit.update() inputbox.display_box(SCREEN,'') server_addr = inputbox.ask(SCREEN, 'Enter Server Adress') EntrServer = BIGFONT.render(server_addr, True, RED) EntSrvRect = EntrServer.get_rect() EntSrvRect.center = (WX / 2, WY / 2 - 10) while True: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() SCREEN.fill(BLACK) SCREEN.blit(EntrServer, EntSrvRect) start.update() exit.update() if pygame.time.get_ticks() - buttontimer >= 500: buttontimer = pygame.time.get_ticks() start.enabled = True exit.enabled = True pygame.display.update() fpsClock.tick(FPS)
def display_boxes(self): for row in range(self.nr_rows): inputbox.display_box(self.screen, self.question_list[row] + ': ' + self.inputs[row], position=(self.position[0], self.position[1] + row * self.inputbox_h))
Game = Board() Solver.New() setup(Game, Solver) elif key is K_l: fname = inputbox.ask(screen,"Load") if len(fname) > 0: f = file(fname,"r") line1 = f.readline() line2 = f.readline() f.close() try: Game = Board() Solver.Load(line2) setup(Game, Solver) Game.Load(line1) inputbox.display_box(screen,"Loaded %s" % (fname)) except: inputbox.display_box(screen,"Failed to Load %s" % (fname)) elif key is K_s: fname = inputbox.ask(screen,"Save") if len(fname) > 0: try: Game.Save(fname, Solver.Save(fname)) inputbox.display_box(screen,"Saved to %s" % (fname)) except: inputbox.display_box(screen,"Failed to Save to %s" %s (fname)) elif key is K_q or key is K_ESCAPE: pygame.quit() # print "Good Bye" running = 0 break
def init(): # 初始化游戏 pygame.init() # 设置游戏界面大小,背景和标题 screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption('飞机大战') background = pygame.image.load('resources/image/background.png').convert() screen.fill(0) screen.blit(background, (0, 0)) current_string = [] display_box(screen, 'NAME' + ": " + string.join(current_string, ""), background) while 1: inkey = get_key() if inkey == K_BACKSPACE: current_string = current_string[0:-1] elif inkey == K_RETURN: break elif inkey == K_MINUS: current_string.append("_") elif inkey <= 127: current_string.append(chr(inkey)) elif inkey == 'exit': pygame.quit() exit() display_box(screen, 'NAME' + ": " + string.join(current_string, ""), background) player_name = string.join(current_string, "") screen.fill(0) screen.blit(background, (0, 0)) easy_level_btn = Button("EASY", (SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2), 36) medium_level_btn = Button("MEDIUM", (SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2 + 36), 36) hard_level_btn = Button("HARD", (SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2 + 72), 36) easy_level_btn.render(screen) medium_level_btn.render(screen) hard_level_btn.render(screen) game_level = None is_waiting = True while is_waiting: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() elif event.type == MOUSEBUTTONDOWN: if easy_level_btn.is_clicked(): game_level = EasyLevel is_waiting = False elif medium_level_btn.is_clicked(): game_level = MediumLevel is_waiting = False elif hard_level_btn.is_clicked(): game_level = HardLevel is_waiting = False pygame.display.update() return game_level, player_name, screen
def run_game(): #------------------------------------------ #Init Board ourBoard = board.TheBoard() human = player.Player() computer = player.Player() bag = [ letter for letter in allLetters ] bag = human.rack.replenish(bag) bag = computer.rack.replenish(bag) playerTurn = True #playerTurn = False wordListTrie = generateWordList() #------------------------------------------ #Pygame starts pygame.init() size = width, height = 1000, 500 #------------------------------------------ #Screen Setup WINDOW = pygame.display.set_mode(size) CAPTION = pygame.display.set_caption('Scrabby') SCREEN = pygame.display.get_surface() SCREEN.fill((150, 141, 131)) FIRSTHALF = pygame.Surface((size[0]/2, size[1])) FIRSTHALF.fill((51, 51, 51)) SECONDHALF = pygame.Surface((size[0]/2, size[1])) SECONDHALF.fill((42, 42, 42)) BOARD = pygame.Surface((462, 462)) BOARD.fill((10, 10, 10)) TRANSPARENT = pygame.Surface(size) TRANSPARENT.set_alpha(255) TRANSPARENT.fill((255,255,255)) #------------------------------------------ #Fonts Setup FONTSMALL = pygame.font.SysFont('Futura', 15) FONTSMALL2 = pygame.font.SysFont('Andale Mono', 13) #------------------------------------------ #Board Setup boardRectangles = [] rowMarkers = [] colMarkers = [] for x in range(0, 463, 29): rowRectangles = [] for y in range(0, 463, 29): if(y == 435): if(x == 435): rect = pygame.draw.rect(BOARD, (238, 228, 218), (x,y,29,29)) else: rect = pygame.draw.rect(BOARD, (238, 228, 218), (x,y,27,29)) elif(x == 435): rect = pygame.draw.rect(BOARD, (238, 228, 218), (x,y,29,27)) else: rect = pygame.draw.rect(BOARD, (238, 228, 218), (x,y,27,27)) if(y == 0): colMarkers.append(rect) elif(x == 0): rowMarkers.append(rect) else: rowRectangles.append(rect) if(len(rowRectangles) != 0): boardRectangles.append(rowRectangles) #Beautify the Board for idx, x in enumerate(ourBoard.board): for idy, y in enumerate(x): myRect = boardRectangles[idx][idy] if y.occupied == True: pass #print boardRectangles[idx][idy] else: if y.wordMultiplier == 3: specialColor = (255, 0, 0) #TW elif y.wordMultiplier == 2: specialColor = (255, 153, 255) #DW elif y.letterMultiplier == 3: specialColor = (0, 102, 255) #TL elif y.letterMultiplier == 2: specialColor = (102, 204, 255) #DL else: specialColor = (84, 130, 53) myRect = pygame.draw.rect(BOARD, specialColor, (myRect.topleft[0],myRect.topleft[1], myRect.width, myRect.height)) if y.wordMultiplier == 3: BOARD.blit(FONTSMALL2.render("TW", 1, (50,50,50)),(myRect.topleft[0]+5, myRect.topleft[1]+5)) elif y.wordMultiplier == 2: BOARD.blit(FONTSMALL2.render("DW", 1, (50,50,50)),(myRect.topleft[0]+5, myRect.topleft[1]+5)) elif y.letterMultiplier == 3: BOARD.blit(FONTSMALL2.render("TL", 1, (50,50,50)),(myRect.topleft[0]+5, myRect.topleft[1]+5)) elif y.letterMultiplier == 2: BOARD.blit(FONTSMALL2.render("DL", 1, (50,50,50)),(myRect.topleft[0]+5, myRect.topleft[1]+5)) ######################################### #Row-Column Markers are rendered next mychar = 'A' for idx, x in enumerate(colMarkers): if(idx == 0): x = pygame.draw.rect(BOARD, (51, 51, 51), (x.topleft[0], x.topleft[1], x.width+2, x.height+2)) else: x = pygame.draw.rect(BOARD, (51, 51, 51), (x.topleft[0], x.topleft[1], x.width+2, x.height)) BOARD.blit(FONTSMALL.render(mychar, 1, (200,200,200)),(x.topleft[0]+10, x.topleft[1]+5)) mychar = chr(ord(mychar) + 1) mynum = 1 for idx, x in enumerate(rowMarkers): x = pygame.draw.rect(BOARD, (51, 51, 51), (x.topleft[0], x.topleft[1], x.width, x.height+2)) BOARD.blit(FONTSMALL.render(str(mynum), 1, (200,200,200)),(x.topleft[0]+5, x.topleft[1]+5)) mynum += 1 #----------------------------------------- #Refresh Display FIRSTHALF.blit(BOARD, (19,19)) SCREEN.blit(FIRSTHALF,(0,0)) SCREEN.blit(SECONDHALF,(500,0)) displayScores(human.score, computer.score, len(bag), SECONDHALF, SCREEN, playerTurn) displayRack(human.rack, SECONDHALF, SCREEN) pygame.display.flip() #----------------------------------------- ourBoard.printBoard() print "Player gets to move first!\n" #----------------------------------------- #Main Loop firstMoveFlag = True scoringTimes = [] crossTimes = [] genTimes = [] moveTimes = [] simTimes = [] while True and not (human.rack.isEmpty() or computer.rack.isEmpty()): #------------------------------------ #Detect Events if(firstMoveFlag): ourBoard.board[7][7].isAnchor = True firstMoveFlag = False if(playerTurn): setCrossCheckBits(ourBoard, wordListTrie) motion = getDetails(SECONDHALF, SCREEN, wordListTrie, human.rack) #Get Info from Player if(motion == False): #If Info is not legit, continue continue elif(motion[0] == "Shuffle"): #If Users asks for shuffle if(len(bag) == 0): if(canGoHomeNow == 1): print "Human: Can't possibly find a move.\nEnding Game.\nGGWP All.\n" break else: canGoHomeNow = 1 print motion[1] human.rack = removeTiles(human.rack, motion[1]) print "Shuffle Success!\n\n" playerTurn = False bag = human.rack.replenish(bag) #Replenish Player's Rack after shuffle displayRack(human.rack, SECONDHALF, SCREEN) #Display Player's New Rack human.rack.showRack() bag += [x for x in motion[1]] inputbox.display_box(SCREEN, SECONDHALF, "SHUFFLE SUCCESS!", (107,142,35)) time.sleep(2) displayScores(human.score, computer.score, len(bag), SECONDHALF, SCREEN, playerTurn) #Display Scores else: #If Info is legit, try playing the word #Check for valid move here current = validityCheck(motion[3], ourBoard, motion[2], motion[1], human.rack) if not (current): print "Error. Invalid Move.\n\n" inputbox.display_box(SCREEN, SECONDHALF, "Invalid Move!", (139,0,0)) time.sleep(1) continue else: print "Before player move:" human.rack.showRack() #need to call scoreThisMove before playerMove function is called because the latter sets tile to occupied human.score += scoreThisMove(ourBoard, motion[1], (motion[2][0], motion[2][1]), motion[3], human.rack) #calculate score of the move playerMove(ourBoard, motion[1], (motion[2][0], motion[2][1]), motion[3], human.rack) #Play the move on offline board playerTurn = False #Change turn to Computer human.rack = removeTiles(human.rack, current) bag = human.rack.replenish(bag) #Replenish Player's Rack after legit move renderWord(motion[1], motion[2], boardRectangles, motion[3], BOARD, ourBoard) FIRSTHALF.blit(BOARD, (19,19)) SCREEN.blit(FIRSTHALF,(0,0)) pygame.display.flip() print "Move Success!\n\n" inputbox.display_box(SCREEN, SECONDHALF, "MOVE SUCCESS!", (107,142,35)) time.sleep(2) displayScores(human.score, computer.score, len(bag), SECONDHALF, SCREEN, playerTurn) #Display Scores displayRack(human.rack, SECONDHALF, SCREEN) #Display Player's New Rack print "After player move:" human.rack.showRack() ourBoard.printBoard() #DisplayBoard canGoHomeNow = 0 else: #AI print "Computer is thinking it's move!\n\n\n" moveStart = datetime.datetime.now() crossStart = datetime.datetime.now() setCrossCheckBits(ourBoard, wordListTrie) crossEnd = datetime.datetime.now() crossTimes.append((crossEnd-crossStart).microseconds) inputbox.display_box(SCREEN, SECONDHALF, "COMPUTER'S TURN!", (160,36,34)) #time.sleep(2) genStart = datetime.datetime.now() rackLetters = [tile.letter for tile in computer.rack.rack] #List of 4-tuples: (word, pos, isAcross, anchorPos) legalWords = [] generateAllMoves(ourBoard, rackLetters, wordListTrie, legalWords) genEnd = datetime.datetime.now() genTimes.append((genEnd-genStart).microseconds) if(len(legalWords)): wordsWithScores = {} #dictionary of words with their scores scoringStart = datetime.datetime.now() for i in xrange(len(legalWords)): currentScore = scoreThisMove(ourBoard, legalWords[i][0], legalWords[i][1], legalWords[i][2], computer.rack) wordsWithScores[legalWords[i]] = (currentScore, currentScore + computeLeaves(legalWords[i][0], legalWords[i][1], legalWords[i][2], computer.rack, ourBoard)) wordsWithScores = OrderedDict(sorted(wordsWithScores.items(), key=lambda t: t[1][1], reverse = True)) #sorted dictionary i = 0 for k in wordsWithScores: legalWords[i] = k i += 1 scoringEnd = datetime.datetime.now() timeTaken = (scoringEnd - scoringStart).microseconds scoringTimes.append(timeTaken) # print legalWords[0][0], wordsWithScores[legalWords[0]] # print legalWords[0][3], legalWords[0][4] if(isRandomWalk == 0): print "Greedy!" AIWord = legalWords[0] elif(isRandomWalk == 1): print isRandomWalk print "Random Walk!" AIWord = legalWords[random.randint(0,len(legalWords) - 1)] else: # print "Top Ten: "+str(legalWords[:10]) # print "Top Ten: "+str([wordsWithScores[x] for x in legalWords[:10]]) simStart = datetime.datetime.now() AIWord = getBestWord(ourBoard, legalWords[:5], computer.rack, bag, wordListTrie) simEnd = datetime.datetime.now() simTimes.append((simEnd-simStart).microseconds) current = validityCheck(AIWord[2], ourBoard, AIWord[1], AIWord[0], computer.rack) if not current: print "Try again." continue else: print "Before Computer Move:" computer.rack.showRack() print "\nAI played:", AIWord[:3] print "Score of move:", wordsWithScores[AIWord][0] print computer.score += wordsWithScores[AIWord][0] playerMove(ourBoard,AIWord[0], AIWord[1], AIWord[2], computer.rack) playerTurn = True computer.rack = removeTiles(computer.rack, current) bag = computer.rack.replenish(bag); renderWord(AIWord[0], AIWord[1], boardRectangles, AIWord[2], BOARD, ourBoard) FIRSTHALF.blit(BOARD, (19,19)) SCREEN.blit(FIRSTHALF,(0,0)) pygame.display.flip() print "Move Success!\n\n" inputbox.display_box(SCREEN, SECONDHALF, "MOVE SUCCESS!", (107,142,35)) time.sleep(1) displayScores(human.score, computer.score, len(bag), SECONDHALF, SCREEN, playerTurn) print "After Computer Move:" computer.rack.showRack() ourBoard.printBoard() canGoHomeNow = 0 else: if(len(bag) == 0): if canGoHomeNow == 1: print "Computer: Can't possibly find a move.\nEnding Game.\nSigh.\nGGWP.\n" break else: canGoHomeNow = 1 playerTurn = True print "Computer: Can't possibly find a move.\nWaiting for Human's Response.\n" continue else: print "No Move Possible! Had to shuffle!" toRemove = ''.join([x.letter for x in computer.rack.rack]) if(len(bag) < 7): toRemove = toRemove[:len(bag)] computer.rack = removeTiles(computer.rack,toRemove) print "Shuffle Success!\n\n" bag = computer.rack.replenish(bag) #Replenish Player's Rack after shuffle bag += [x for x in toRemove] playerTurn = True inputbox.display_box(SCREEN, SECONDHALF, "SHUFFLE SUCCESS!", (107,142,35)) time.sleep(2) displayScores(human.score, computer.score, len(bag), SECONDHALF, SCREEN, playerTurn) #Display Scores continue moveEnd = datetime.datetime.now() moveTimes.append((moveEnd - moveStart).microseconds) pygame.display.flip() print "Stats for nerdz" if(len(crossTimes)): print "Average crosscheck time:", sum(crossTimes)/float(len(crossTimes)) print "Std deviation:", np.std(crossTimes) if(len(genTimes)): print "Average move gen time:", sum(genTimes)/float(len(genTimes)) print "Std deviation:", np.std(genTimes) if(len(scoringTimes)): print "Average scoring time:", sum(scoringTimes)/float(len(scoringTimes)) print "Std deviation:", np.std(scoringTimes) if(len(simTimes)): print "Average sim time:", sum(simTimes)/float(len(simTimes)) print "Std deviation:", np.std(simTimes) if(len(moveTimes)): print "Average move time:", sum(moveTimes)/float(len(moveTimes)) print "Std deviation:", np.std(moveTimes) #apply endgame score rules playerScoreLeftOver = 0 for tileLeft in human.rack.rack: playerScoreLeftOver += tileLeft.getVal() computerScoreLeftOver = 0 for tileLeft in computer.rack.rack: computerScoreLeftOver += tileLeft.getVal() if len(human.rack.rack) == 0: human.score += computerScoreLeftOver else: human.score -= playerScoreLeftOver if len(computer.rack.rack) == 0: computer.score += playerScoreLeftOver else: computer.score -= computerScoreLeftOver displayScores(human.score, computer.score, len(bag), SECONDHALF, SCREEN, playerTurn) if computer.score > human.score: res = "COMPUTER" inputbox.display_box(SCREEN, SECONDHALF, "COMPUTER WON!", (0, 102, 255)) elif human.score > computer.score: res = "PLAYER" inputbox.display_box(SCREEN, SECONDHALF, "PLAYER WON!", (0, 102, 255)) else: inputbox.display_box(SCREEN, SECONDHALF, "TIE!", (0, 102, 255)) #sys.exit(0) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit()
Game = Board() Solver.New() setup(Game, Solver) elif key is K_l: fname = inputbox.ask(screen, "Load") if len(fname) > 0: f = file(fname, "r") line1 = f.readline() line2 = f.readline() f.close() try: Game = Board() Solver.Load(line2) setup(Game, Solver) Game.Load(line1) inputbox.display_box(screen, "Loaded %s" % (fname)) except: inputbox.display_box(screen, "Failed to Load %s" % (fname)) elif key is K_s: fname = inputbox.ask(screen, "Save") if len(fname) > 0: try: Game.Save(fname, Solver.Save(fname)) inputbox.display_box(screen, "Saved to %s" % (fname)) except: inputbox.display_box(screen, "Failed to Save to %s" % s(fname)) elif key is K_q or key is K_ESCAPE: pygame.quit() # print "Good Bye"
def run_game(): #------------------------------------------ #Init Board ourBoard = board.TheBoard() player1 = player.Player() player2 = player.Player() bag = [ letter for letter in allLetters ] bag = player1.rack.replenish(bag) bag = player2.rack.replenish(bag) playerTurn = True #playerTurn = False P1 = "Monty" P2 = "Monty" if(choice1 == 0): P1 = "Midas" if(choice2 == 0): P2 = "Midas" if(choice1 == 1): P1 = "Monkey" if(choice2 == 1): P2 = "Monkey" wordListTrie = generateWordList() #------------------------------------------ #Pygame starts pygame.init() size = width, height = 1000, 500 #------------------------------------------ #Screen Setup WINDOW = pygame.display.set_mode(size) CAPTION = pygame.display.set_caption('Scrabby') SCREEN = pygame.display.get_surface() SCREEN.fill((150, 141, 131)) FIRSTHALF = pygame.Surface((size[0]/2, size[1])) FIRSTHALF.fill((51, 51, 51)) SECONDHALF = pygame.Surface((size[0]/2, size[1])) SECONDHALF.fill((42, 42, 42)) BOARD = pygame.Surface((462, 462)) BOARD.fill((10, 10, 10)) TRANSPARENT = pygame.Surface(size) TRANSPARENT.set_alpha(255) TRANSPARENT.fill((255,255,255)) #------------------------------------------ #Fonts Setup FONTSMALL = pygame.font.SysFont('Futura', 15) FONTSMALL2 = pygame.font.SysFont('Andale Mono', 13) #------------------------------------------ #Board Setup boardRectangles = [] rowMarkers = [] colMarkers = [] for x in range(0, 463, 29): rowRectangles = [] for y in range(0, 463, 29): if(y == 435): if(x == 435): rect = pygame.draw.rect(BOARD, (238, 228, 218), (x,y,29,29)) else: rect = pygame.draw.rect(BOARD, (238, 228, 218), (x,y,27,29)) elif(x == 435): rect = pygame.draw.rect(BOARD, (238, 228, 218), (x,y,29,27)) else: rect = pygame.draw.rect(BOARD, (238, 228, 218), (x,y,27,27)) if(y == 0): colMarkers.append(rect) elif(x == 0): rowMarkers.append(rect) else: rowRectangles.append(rect) if(len(rowRectangles) != 0): boardRectangles.append(rowRectangles) #Beautify the Board for idx, x in enumerate(ourBoard.board): for idy, y in enumerate(x): myRect = boardRectangles[idx][idy] if y.occupied == True: pass #print boardRectangles[idx][idy] else: if y.wordMultiplier == 3: specialColor = (255, 0, 0) #TW elif y.wordMultiplier == 2: specialColor = (255, 153, 255) #DW elif y.letterMultiplier == 3: specialColor = (0, 102, 255) #TL elif y.letterMultiplier == 2: specialColor = (102, 204, 255) #DL else: specialColor = (84, 130, 53) myRect = pygame.draw.rect(BOARD, specialColor, (myRect.topleft[0],myRect.topleft[1], myRect.width, myRect.height)) if y.wordMultiplier == 3: BOARD.blit(FONTSMALL2.render("TW", 1, (50,50,50)),(myRect.topleft[0]+5, myRect.topleft[1]+5)) elif y.wordMultiplier == 2: BOARD.blit(FONTSMALL2.render("DW", 1, (50,50,50)),(myRect.topleft[0]+5, myRect.topleft[1]+5)) elif y.letterMultiplier == 3: BOARD.blit(FONTSMALL2.render("TL", 1, (50,50,50)),(myRect.topleft[0]+5, myRect.topleft[1]+5)) elif y.letterMultiplier == 2: BOARD.blit(FONTSMALL2.render("DL", 1, (50,50,50)),(myRect.topleft[0]+5, myRect.topleft[1]+5)) ######################################### #Row-Column Markers are rendered next mychar = 'A' for idx, x in enumerate(colMarkers): if(idx == 0): x = pygame.draw.rect(BOARD, (51, 51, 51), (x.topleft[0], x.topleft[1], x.width+2, x.height+2)) else: x = pygame.draw.rect(BOARD, (51, 51, 51), (x.topleft[0], x.topleft[1], x.width+2, x.height)) BOARD.blit(FONTSMALL.render(mychar, 1, (200,200,200)),(x.topleft[0]+10, x.topleft[1]+5)) mychar = chr(ord(mychar) + 1) mynum = 1 for idx, x in enumerate(rowMarkers): x = pygame.draw.rect(BOARD, (51, 51, 51), (x.topleft[0], x.topleft[1], x.width, x.height+2)) BOARD.blit(FONTSMALL.render(str(mynum), 1, (200,200,200)),(x.topleft[0]+5, x.topleft[1]+5)) mynum += 1 #----------------------------------------- #Refresh Display FIRSTHALF.blit(BOARD, (19,19)) SCREEN.blit(FIRSTHALF,(0,0)) SCREEN.blit(SECONDHALF,(500,0)) displayScores(player1.score, player2.score, len(bag), SECONDHALF, SCREEN, playerTurn, P1, P2) displayRack(player1.rack, SECONDHALF, SCREEN) pygame.display.flip() #----------------------------------------- ourBoard.printBoard() print P1+" gets to move first!\n" #----------------------------------------- #Main Loop firstMoveFlag = True scoringTimes = [] crossTimes = [] genTimes = [] moveTimes = [] justStartAlready = True while True and not (player1.rack.isEmpty() or player2.rack.isEmpty()): #------------------------------------ #Detect Events if(firstMoveFlag): ourBoard.board[7][7].isAnchor = True firstMoveFlag = False if(playerTurn): setCrossCheckBits(ourBoard, wordListTrie) if(justStartAlready): inputbox.ask(SCREEN, SECONDHALF, "Start?"); justStartAlready = False #Get Info from Player inputbox.display_box(SCREEN, SECONDHALF, P1.upper()+"'S TURN!", (160,36,34)) #time.sleep(2) rackLetters = [tile.letter for tile in player1.rack.rack] player1.rack.showRack() #List of 4-tuples: (word, pos, isAcross, anchorPos) legalWords = [] generateAllMoves(ourBoard, rackLetters, wordListTrie, legalWords) if(len(legalWords)): wordsWithScores = {} #dictionary of words with their scores scoringStart = datetime.datetime.now() for i in xrange(len(legalWords)): currentScore = scoreThisMove(ourBoard, legalWords[i][0], legalWords[i][1], legalWords[i][2], player1.rack ) wordsWithScores[legalWords[i]] = (currentScore, currentScore + computeLeaves(legalWords[i][0], legalWords[i][1], legalWords[i][2], player2.rack, ourBoard)) wordsWithScores = OrderedDict(sorted(wordsWithScores.items(), key=lambda t: t[1][1], reverse = True)) #sorted dictionary i = 0 for k in wordsWithScores: legalWords[i] = k i += 1 if(choice1 == 0): print "Greedy!" AIWord = legalWords[0] elif(choice1 == 1): print "Random Walk!" AIWord = legalWords[random.randint(0,len(legalWords) - 1)] else: print "Top Five: "+str(legalWords[:5]) print "Top Five: "+str([wordsWithScores[x] for x in legalWords[:5]]) AIWord = getBestWord(ourBoard, legalWords[:5], player1.rack, bag, wordListTrie) # print legalWords[0][0], wordsWithScores[legalWords[0]] # print legalWords[0][3], legalWords[0][4] current = validityCheck(AIWord[2], ourBoard, AIWord[1], AIWord[0], player1.rack) if not current: print "Try again." continue else: print "Before "+P1+" Move:" player1.rack.showRack() print "\n"+P1+" played:", AIWord[:3] print "Score of move:", wordsWithScores[AIWord][0] print player1.score += wordsWithScores[AIWord][0] playerMove(ourBoard,AIWord[0], AIWord[1], AIWord[2], player1.rack) playerTurn = False player1.rack = removeTiles(player1.rack, current) bag = player1.rack.replenish(bag); renderWord(AIWord[0], AIWord[1], boardRectangles, AIWord[2], BOARD, ourBoard) FIRSTHALF.blit(BOARD, (19,19)) SCREEN.blit(FIRSTHALF,(0,0)) pygame.display.flip() print "Move Success!\n\n" inputbox.display_box(SCREEN, SECONDHALF, "MOVE SUCCESS!", (107,142,35)) time.sleep(1) displayScores(player1.score, player2.score, len(bag), SECONDHALF, SCREEN, playerTurn, P1, P2) displayRack(player1.rack, SECONDHALF, SCREEN) #Display Player's New Rack print "After"+P1+" Move:" player1.rack.showRack() ourBoard.printBoard() canGoHomeNow = 0 else: if(len(bag) == 0): if canGoHomeNow == 1: print P1+": Can't possibly find a move.\nEnding Game.\nSigh.\nGGWP.\n" break else: canGoHomeNow = 1 playerTurn = False print P1+": Can't possibly find a move.\nWaiting for Human's Response.\n" continue else: print "No Move Possible! Had to shuffle!" toRemove = ''.join([x.letter for x in player1.rack.rack]) if(len(bag) < 7): toRemove = toRemove[:len(bag)] player1.rack = removeTiles(player1.rack,toRemove) print "Shuffle Success!\n\n" bag = player1.rack.replenish(bag) #Replenish Player's Rack after shuffle bag += [x for x in toRemove] playerTurn = False inputbox.display_box(SCREEN, SECONDHALF, "SHUFFLE SUCCESS!", (107,142,35)) time.sleep(2) displayScores(player1.score, player2.score, len(bag), SECONDHALF, SCREEN, playerTurn, P1, P2) #Display Scores continue else: #AI print P2+" is thinking it's move!\n\n\n" moveStart = datetime.datetime.now() crossStart = datetime.datetime.now() setCrossCheckBits(ourBoard, wordListTrie) crossEnd = datetime.datetime.now() crossTimes.append((crossEnd-crossStart).microseconds) inputbox.display_box(SCREEN, SECONDHALF, P2.upper()+"'S TURN!", (160,36,34)) #time.sleep(2) genStart = datetime.datetime.now() rackLetters = [tile.letter for tile in player2.rack.rack] #List of 4-tuples: (word, pos, isAcross, anchorPos) legalWords = [] generateAllMoves(ourBoard, rackLetters, wordListTrie, legalWords) genEnd = datetime.datetime.now() genTimes.append((genEnd-genStart).microseconds) if(len(legalWords)): wordsWithScores = {} #dictionary of words with their scores scoringStart = datetime.datetime.now() for i in xrange(len(legalWords)): currentScore = scoreThisMove(ourBoard, legalWords[i][0], legalWords[i][1], legalWords[i][2], player2.rack ) wordsWithScores[legalWords[i]] = (currentScore, currentScore + computeLeaves(legalWords[i][0], legalWords[i][1], legalWords[i][2], player2.rack, ourBoard)) wordsWithScores = OrderedDict(sorted(wordsWithScores.items(), key=lambda t: t[1][1], reverse = True)) #sorted dictionary i = 0 for k in wordsWithScores: legalWords[i] = k i += 1 scoringEnd = datetime.datetime.now() timeTaken = (scoringEnd - scoringStart).microseconds scoringTimes.append(timeTaken) # print legalWords[0][0], wordsWithScores[legalWords[0]] # print legalWords[0][3], legalWords[0][4] if(choice2 == 0): print "Greedy!" AIWord = legalWords[0] elif(choice2 == 1): print "Random Walk!" AIWord = legalWords[random.randint(0,len(legalWords) - 1)] else: print "Top Five: "+str(legalWords[:5]) print "Top Five: "+str([wordsWithScores[x] for x in legalWords[:5]]) AIWord = getBestWord(ourBoard, legalWords[:5], player2.rack, bag, wordListTrie) current = validityCheck(AIWord[2], ourBoard, AIWord[1], AIWord[0], player2.rack) if not current: print "Try again." continue else: print "Before "+P2+" Move:" player2.rack.showRack() print "\n"+P2+" played:", AIWord[:3] print "Score of move:", wordsWithScores[AIWord][0] print player2.score += wordsWithScores[AIWord][0] playerMove(ourBoard,AIWord[0], AIWord[1], AIWord[2], player2.rack) playerTurn = True player2.rack = removeTiles(player2.rack, current) bag = player2.rack.replenish(bag); renderWord(AIWord[0], AIWord[1], boardRectangles, AIWord[2], BOARD, ourBoard) FIRSTHALF.blit(BOARD, (19,19)) SCREEN.blit(FIRSTHALF,(0,0)) pygame.display.flip() print "Move Success!\n\n" inputbox.display_box(SCREEN, SECONDHALF, "MOVE SUCCESS!", (107,142,35)) time.sleep(1) displayScores(player1.score, player2.score, len(bag), SECONDHALF, SCREEN, playerTurn, P1, P2) print "After "+P2+" Move:" player2.rack.showRack() ourBoard.printBoard() canGoHomeNow = 0 else: if(len(bag) == 0): if canGoHomeNow == 1: print P2+": Can't possibly find a move.\nEnding Game.\nSigh.\nGGWP.\n" break else: canGoHomeNow = 1 playerTurn = True print P2+": Can't possibly find a move.\nWaiting for Human's Response.\n" continue else: print "No Move Possible! Had to shuffle!" toRemove = ''.join([x.letter for x in player2.rack.rack]) if(len(bag) < 7): toRemove = toRemove[:len(bag)] player2.rack = removeTiles(player2.rack,toRemove) print "Shuffle Success!\n\n" bag = player2.rack.replenish(bag) #Replenish Player's Rack after shuffle bag += [x for x in toRemove] playerTurn = True inputbox.display_box(SCREEN, SECONDHALF, "SHUFFLE SUCCESS!", (107,142,35)) time.sleep(2) displayScores(player1.score, player2.score, len(bag), SECONDHALF, SCREEN, playerTurn, P1, P2) #Display Scores continue moveEnd = datetime.datetime.now() moveTimes.append((moveEnd - moveStart).microseconds) pygame.display.flip() if(len(crossTimes) and len(genTimes) and len(scoringTimes) and len(moveTimes)): print "Stats for nerdz" print "Average crosscheck time:", sum(crossTimes)/float(len(crossTimes)) print "Std deviation:", np.std(crossTimes) print "Average move gen time:", sum(genTimes)/float(len(genTimes)) print "Std deviation:", np.std(genTimes) print "Average scoring time:", sum(scoringTimes)/float(len(scoringTimes)) print "Std deviation:", np.std(scoringTimes) print "Average move time:", sum(moveTimes)/float(len(moveTimes)) print "Std deviation:", np.std(moveTimes) if player2.score > player1.score: inputbox.display_box(SCREEN, SECONDHALF, P2.upper()+" WON!", (0, 102, 255)) elif player1.score > player2.score: inputbox.display_box(SCREEN, SECONDHALF, P1.upper()+" WON!", (0, 102, 255)) else: inputbox.display_box(SCREEN, SECONDHALF, "TIE!", (0, 102, 255)) #sys.exit(0) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit()