예제 #1
0
def isKingMate( color ):
	# Check if king is even mate before checking moves
	if not isKingCheck( color ):
		return False	
	kingPos = board.findKing( color )
	oldBoard = board.getBoardCopy() # F**k this shallow copy shit
	kingMate = True
	for move in legalMoves( kingPos ):
		board.setBoardCopy( oldBoard )
		board.movePiece( kingPos, move )

		if not isKingCheck( color ):
			kingMate = False
			break
		
	# King is mate if no "not-checks" are found
	board.setBoard( oldBoard ) # Revert board
	return kingMate	
예제 #2
0
def movePiece( pos, to ):
	if not posLegal( to ):
		raise exceptions.IllegalPositionException
	
	allowed = False
	for move in legalMoves( pos ):
		if move == to:
			allowed = True
			break
			
	if not allowed:
		raise exceptions.IllegalMoveException
	
	boardCopy = board.getBoardCopy()
	board.movePiece( pos, to )
	
	if isKingCheck( boardIndex( to )[1] ):
		board.setBoard( boardCopy ) # Revert move
		raise exceptions.SelfCheckException # Cannot check self
예제 #3
0
파일: main.py 프로젝트: 74Genesis/2048
def main():
	global board, settings

	pygame.init()
	pygame.font.init()
	screen = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
	pygame.display.set_caption("2048 by 74Genesis")
	font = pygame.font.Font("font/ClearSans-Bold.ttf", 18)
	fontScore = pygame.font.Font("font/ClearSans-Bold.ttf", 13)

	#Основной "холст"
	mainSur = pygame.Surface((WIN_WIDTH, WIN_HEIGHT))
	mainSur.fill(pygame.Color("#faf8ef"))

	# Кнопка Новая игра
	restartBut = pygame.Surface((100, 50))
	restartBut.fill(pygame.Color("#8f7a66"))
	#текст New game
	nGame = font.render("New Game", True, (249,246,242))	

	# Счет
	score = pygame.Surface((80, 50))
	score.fill(pygame.Color("#bbada0"))
	#score
	scoreText = font.render("Score", True, (249,246,242))
	#score число
	scoreNum = None

	# Лучший счет
	bestScore = pygame.Surface((80, 50))
	bestScore.fill(pygame.Color("#bbada0"))
	bestText = font.render("Best", True, (249,246,242))

	#фон доски
	boardBg = pygame.Surface((BOARD_SIZE, BOARD_SIZE))
	boardBg.fill(pygame.Color("#bbada0"))

	board = board.Board()
	# board.board = [[2, 256, 3, 7],
 #       		  	  [2, 128, 4, 8],
	#    		  	  [1024, 64, 5, 9],
	#    		  	  [1024, 32, 6, 34]]

	#Нарисовать заполненные клетки
	cellObjects, textObjects = board.drowFullCells(cellGroup, textGroup)

	pygame.key.set_repeat(1, 400)
	clock = pygame.time.Clock()
	scoreNumX = 0
	while 1:
		clock.tick(400)
		up=down=left=right=False
		#Закрыть окно
		for e in pygame.event.get():
			#Перед выходом сохранить в файл все настройки
			if e.type == pygame.QUIT:
				settings = settings.Settings()
				settings.changeOption("Score", board.getScore())
				settings.changeOption("Best", board.getBest())
				settings.changeOption("StartGame", False)
				settings.changeOption("Board", board.getBoard())
				raise SystemExit

			#Проверять нажатие клавиши только если не осуществляется движение доски
			if not board.startMove:
				if e.type == pygame.KEYDOWN:
					if e.key == pygame.K_UP:
						up = True
					elif e.key == pygame.K_DOWN:
						down = True
					elif e.key == pygame.K_LEFT:
						left = True
					elif e.key == pygame.K_RIGHT:
						right = True
			if e.type == pygame.MOUSEBUTTONDOWN:
				mousePos = pygame.mouse.get_pos()
				if mousePos[0] > ELEM_IND and \
				   mousePos[0] < ELEM_IND+100 and \
				   mousePos[1] > ELEM_IND and \
				   mousePos[1] < ELEM_IND+50:
					board.newGame()
					#Удалить старые спрайты клеток и текста
					for key in cellObjects:
						cellGroup.remove(cellObjects[key])
					for key in textObjects:
						textGroup.remove(textObjects[key])
					cellObjects, textObjects = board.drowFullCells(cellGroup, textGroup) 


		#Если нажата кнопка управления полем
		if up or down or left or right:
			board.setStartMove(True) #начинаем передвижение
			board.setBoardMove(False) #Пересчитана ли доска
			#запоминаем нажатую кнопку
			if up: board.setKeyDown("up")
			if down: board.setKeyDown("down")
			if left: board.setKeyDown("left")
			if right: board.setKeyDown("right")

		#Пока активировано передвижение, изменяем доску
		if board.getStartMove():
			if board.getKeyDown() == "up": up = True
			if board.getKeyDown() == "down": down = True
			if board.getKeyDown() == "left": left = True
			if board.getKeyDown() == "right": right = True
			
			if not board.getBoardMove():
				nBoard, moveMap, nScore = board.move(up, down, left, right)
				board.setNewBoard(nBoard)
				board.setMoveMap(moveMap)
				board.setNewScore(nScore)

				board.setBoardMove(True)

			updateRes = board.update(cellObjects, textObjects, board.moveMap) #двигает клетки

			if updateRes: #Все клетки передвинуты
				board.setBoardMove(False)
				if len(board.getMoveMap()) > 0: # если ячейки двигались
					boardNewNum = board.totalCell(board.getNewBoard()) #добавить ещё одну цифру
					board.setBoard(boardNewNum) #сохранить новую доску
				
				#Удалить старые спрайты клеток и текста
				for key in cellObjects:
					cellGroup.remove(cellObjects[key])
				for key in textObjects:
					textGroup.remove(textObjects[key])

				cellObjects, textObjects = board.drowFullCells(cellGroup, textGroup) #Создать новые
				board.setStartMove(False) #Индикатор движения выключить

				board.setScore(board.getNewScore()) #Обновить счет

				#Если лучший счет меньше основного, обновить его
				if board.getBest() < board.getScore():
					board.setBest(board.getScore())

				#Проверяем не проиграл ли пользователь
				# if board.isMove(board.getNewBoard()):
				# 	print("Конец игры")

				#Победил ли пользователь
				# if board.winner(board.getNewBoard()):
				# 	print("Победитель !")

		#Создание числа "Счет" и "Лучший счет"
		scoreNum = fontScore.render(str(board.getScore()), True, (249,246,242))
		bestNum = fontScore.render(str(board.getBest()), True, (249,246,242))

		#Рисование всех элементов
		#Главный "Холст"
		screen.blit(mainSur, (0,0)) 
		#Новая игра
		screen.blit(restartBut, (ELEM_IND,ELEM_IND)) 
		#New game
		screen.blit(nGame, (ELEM_IND+7, ELEM_IND+11)) 
		#cчет
		screen.blit(score, (115+ELEM_IND,ELEM_IND)) 
		screen.blit(scoreText, (147, ELEM_IND)) #Текст score
		scoreNumX = numAlignCenter(str(board.getScore()), 115+ELEM_IND, 80) #позиция числа
		screen.blit(scoreNum, (scoreNumX, ELEM_IND+25)) #Число score
		#Лучший счет
		screen.blit(bestScore, (115+80+ELEM_IND*2,ELEM_IND)) 
		screen.blit(bestText, (115+80+ELEM_IND*2 + 23, ELEM_IND)) #Текст best
		bestNumX = numAlignCenter(str(board.getBest()), 115+80+ELEM_IND*2, 80) #позиция числа
		screen.blit(bestNum, (bestNumX, ELEM_IND+25)) #Число best
		#фон доски
		screen.blit(boardBg, (ELEM_IND,ELEM_IND*2 + 50)) 

		board.drowCellBack(screen, GAME_BEGIN_X, GAME_BEGIN_Y) #пустые клетки
			
		cellGroup.draw(screen)
		textGroup.draw(screen)
		pygame.display.update()