Ejemplo n.º 1
0
class Damas:
	def __init__(self):
		self.width, self.height=600, 700
		pygame.init()
		self.screen = pygame.display.set_mode((self.width, self.height))
		#se cargan las imagenes de las fichas
		self.ficha_negra=self.cargar_imagen("img/ficha_negra.png")
		self.ficha_blanca=self.cargar_imagen("img/ficha_blanca.png")
		self.ficha_dama_negra=self.cargar_imagen("img/dama_negra.png")
		self.ficha_dama_blanca=self.cargar_imagen("img/dama_blanca.png")
		#Se cargan las imagenes de las celdas
		self.celda_negra=self.cargar_imagen("img/celda_negra.png")
		self.celda_blanca=self.cargar_imagen("img/celda_blanca.png")
		self.celda_selecionada= self.cargar_imagen("img/ficha_seleccionada.png")
		#se cargan las imagenes de los botones
		self.cancel_button= self.cargar_imagen("img/cancel.png")
		self.ok_button=self.cargar_imagen("img/aceptar.png")
		self.button_clicked=self.cargar_imagen("img/clicked.png")

		self.new_game_button=self.cargar_imagen("img/new_game.png")
		self.settings_button=self.cargar_imagen("img/settings.png")
		#carga la imagen de fondo
		self.fondo=self.cargar_imagen("img/fondo.png")
		self.toolbar=self.cargar_imagen("img/fondo_toolbar.png")
		pygame.display.set_caption("Damas")

		'''
		se instancia la interfaz de comunicacion con la inteligencia artificial
		'''
		self.game=Game()
		self.settings=Settings(self.screen,self.fondo,self.width,self.height)
		self.settings.set_ia_game(self.game)
		self.settings.set_gui_fuctions(self.cargar_imagen, self.dibujar_imagen,self.print_text)


	'''
	Dada la url de una imagen, carga la misma y establece el centro como x e y
	'''
	def cargar_imagen(self, url,x=0, y=0):
		picture=pygame.image.load(url)
		rect=picture.get_rect()
		rect.center=(x,y)
		return picture

	def print_text (self,text,x,y, size=30, color=(255,255,255)):
		pygame.font.init()
		fuente = pygame.font.Font(None, size)
		render = fuente.render(text, 1, color)
		self.screen.blit(render, (x, y))
		pygame.display.flip()
	'''
	Dibuja la celda del tablero
	'''
	def dibujar_imagen(self,picture ,x, y):
		rect=picture.get_rect()
		rect.center=(x,y);
		self.screen.blit(picture, rect)
		return rect
	'''
	Dibuja los botones ok y cancel
	'''
	def dibujar_botones(self):
		y=self.height-90
		x=self.width//2
		self.ok_button_rect=self.dibujar_imagen(self.ok_button, x-52,y)
		self.cancel_button_rect= self.dibujar_imagen(self.cancel_button, x+52,y)

		self.new_game_button_rect=self.dibujar_imagen(self.new_game_button, x-52,50)
		self.settings.new_game_rect=self.new_game_button_rect
		self.settings_button_rect=self.dibujar_imagen(self.settings_button, x+52,50)
		pygame.display.flip()

	'''
	Dibuja el tablero principal e inializa el tablero.
	'''
	def dibujar_tablero(self):
		self.dibujar_imagen(self.fondo, self.width//2,self.height//2)
		self.dibujar_imagen(self.toolbar, self.width//2,41)
		delta=59
		y=self.height//2 -delta*3-delta//2+3
		self.tablero_rect=[]
		indice=0
		for i in range(Tablero.MAX_DIM):
			x=self.width//2 -delta*3-delta//2
			for j in range(Tablero.MAX_DIM):
				if(self.game.tablero.casillas[i][j].duenho==Ficha.BLOQUEADA):
					rect=self.dibujar_imagen(self.celda_blanca, x, y)
				else:
					rect=self.dibujar_imagen(self.celda_negra, x, y)
					if(self.game.tablero.casillas[i][j].duenho==Ficha.USUARIO):
						self.dibujar_imagen(self.ficha_negra, x,y)

					elif (self.game.tablero.casillas[i][j].duenho==Ficha.COMPUTADORA):
						self.dibujar_imagen(self.ficha_blanca, x,y)

				self.tablero_rect.append(rect)
				x=x+delta
				indice=indice+1
			indice=indice-1
			y=y+delta-1
		pygame.display.flip()

	'''
	Traduce un indice a coordenadas i,j de la matriz
	'''
	def traducir_a_move(self, index):
		i=index//8
		j=index%8
		return Move(i,j)

	def traducir_a_index(self, move):
		return move.i*8+move.j%8
	'''
	trace route posee su propio bulce de eventos debido a que cuando se selecciona una ficha
	se debe esperar por la nueva posicion de la ficha nueva (mover fichas) y asi trazar su ruta.
	Traza el camino de las casillas que son seleccionadas hasta que se presione ok o cancel
	'''
	def trace_route(self, x,y, old_move):
		clock=pygame.time.Clock()
		route_list=[]
		route_casillas_list=[]
		#se inicializa el buffer de los movimientos
		move_buffer=old_move
		route_list.append(old_move)
		#Se pinta la casilla como seleccionada si esta no esta vacia
		if(self.game.ocupe_casilla(old_move)):
			ficha_color=self.obtener_ficha_color(self.traducir_a_index(old_move))
			self.dibujar_imagen(self.celda_selecionada,x,y)
			self.dibujar_imagen(ficha_color,x,y)
			pygame.display.flip()
		else:
			return False

		while True:
			for event in pygame.event.get():
				if event.type == pygame.QUIT:
					quit = True
					pygame.quit()
				#Se hizo click
				elif event.type == 5:
					index=0
					mouse_x, mouse_y = pygame.mouse.get_pos()
					#Se verifica si ser realizo click en el tablero
					for r in self.tablero_rect:
						#traduce a coordenadas
						new_move=self.traducir_a_move(index)
						#verifica si se selecciono la casilla y si esta disponible
						if (r.collidepoint(mouse_x, mouse_y) and not self.game.esta_bloqueada(new_move)):
							#chequea si el movimiento acutal es permitido
							if(self.game.route_valido(move_buffer,new_move) ):
								x_new,y_new = r.center
								move_buffer=new_move
								#Anhade a la lista de move realizados el move acutal
								route_list.append(new_move)
								#Anhade a la lista de coordenadas asociadas a los move la coordenada actual
								route_casillas_list.append(r.center)
								#Marca como seleccionada la celda actual
								self.dibujar_imagen(self.celda_selecionada,x_new,y_new)
								pygame.display.flip()
						index=index+1

					#Si se selecciono el boton de cancelar
					if( self.cancel_button_rect.collidepoint(mouse_x,mouse_y)):
						#Marca el boton para indicar que este fue seleccionado
						x_click,y_click=self.cancel_button_rect.center
						self.dibujar_imagen(self.button_clicked,x_click,y_click)
						pygame.display.flip()
						#Actualiza la ficha inicial dado que esta ya no esta seleccionada
						self.dibujar_imagen(self.celda_negra, x,y)
						ficha_color=self.obtener_ficha_color(self.traducir_a_index(old_move))
						self.dibujar_imagen(ficha_color, x,y)
						#Recorre la lista de coordenadas asociadas a los move y acutaliza su estado
						for punto in route_casillas_list:
							__x,__y=punto
							#Pone el tablero a su estado anterio
							self.dibujar_imagen(self.celda_negra,__x,__y)
						#Se pone el boton en su estado normal
						clock.tick(5)
						self.dibujar_imagen(self.cancel_button,x_click,y_click)
						pygame.display.flip()
						return False

					elif( self.ok_button_rect.collidepoint(mouse_x,mouse_y)):
						__x,__y=x,y
						#Marca el boton para indicar que este fue seleccionado
						x_click,y_click=self.ok_button_rect.center
						self.dibujar_imagen(self.button_clicked,x_click,y_click)

						#si se selecciona una ficha y luego se da ok, para que acutalice a su estado normal
						if(len(route_list)-1==0):
							ficha_color=self.obtener_ficha_color(self.traducir_a_index(old_move))
							self.dibujar_celda_ficha(ficha_color,__x,__y)
							self.dibujar_imagen(self.ok_button,x_click,y_click)
							pygame.display.flip()
							return False

						#Recorre la lista de move y verifica que el camino sea correcto
						for i in range(len(route_list)-1):
							#Trata de realizar el movimiento si este no esta permitido, no lo realizara
							mover_index=self.game.realizar_movimiento(route_list[i],route_list[i+1])
							if not (mover_index==False):
									#obtiene las coordenadas actuales
									x_new,y_new = route_casillas_list[i]
									#actualiza el estado de la celda anterior
									self.dibujar_imagen(self.celda_negra,__x,__y)
									#actualiza el estado de la celda actual
									ficha_color=self.obtener_ficha_color(self.traducir_a_index(route_list[i+1]))
									self.dibujar_celda_ficha(ficha_color,x_new,y_new)
									pygame.display.flip()
									#Ahora __x e __y pasan a ser la posicion actual
									__x,__y=route_casillas_list[i]
									#Espera un momento para dar la impresion que la ficha se mueve lentamente
									clock.tick(2)
									#Elimina la ficha que se comio en la jugada
									if not (mover_index==True) :
										pto_x, pto_y= self.tablero_rect[mover_index].center
										self.dibujar_imagen(self.celda_negra,pto_x,pto_y)
										pygame.display.flip()
										clock.tick(2)
						#Se pone el boton en su estado normal
						self.dibujar_imagen(self.ok_button,x_click,y_click)
						return True
			clock.tick(50)

	#dibuja la casilla y la ficha en la posicion x e y
	def dibujar_celda_ficha(self,ficha_color,x,y):
		self.dibujar_imagen(self.celda_negra, x,y)
		self.dibujar_imagen(ficha_color, x,y)

	def dibujar_celda(self, move):
		index=self.traducir_a_index(move)
		x,y =self.tablero_rect[index].center
		self.dibujar_imagen(self.celda_negra, x,y)
		pygame.display.flip()
	#Se encarga de mover las fichas y pintar sus respectivas casillas
	def mover_fichas(self, old_index, new_index, ficha_color):
		__x,__y= self.tablero_rect[old_index].center
		self.dibujar_imagen(self.celda_negra,__x,__y)
		#actualiza el estado de la celda actual
		x_new, y_new=self.tablero_rect[new_index].center
		self.dibujar_celda_ficha(ficha_color,x_new,y_new)
		pygame.display.flip()

	def obtener_ficha_color(self,index):
		move=self.traducir_a_move(index)
		if self.game.es_dama_usuario(move):
			return self.ficha_dama_negra
		elif self.game.es_dama_computadora(move):
			return self.ficha_dama_blanca
		elif self.game.es_ficha_usuario(move):
			return self.ficha_negra
		#self.game.es_ficha_computadora(move):
		return self.ficha_blanca