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)
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
 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))
Exemplo n.º 5
0
        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
Exemplo n.º 6
0
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
Exemplo n.º 7
0
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()
Exemplo n.º 8
0
     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"
Exemplo n.º 9
0
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()