Exemplo n.º 1
0
	def load_menu_bg(self, filename):
		'''Load an image file from the data directory and store it in dest'''
		bg1 = image_manager.get_image(filename)
		bg2 = image_manager.get_image("menu_back2.png")
		
		bg1 = pygame.transform.scale(bg1, (self.bg_w, self.bg_h))
		bg2 = pygame.transform.scale(bg2, (int(self.bg_w/1.1), int(self.bg_h/1.1)))
		self.menu_back_img = bg1
		tx = (bg1.get_width()-bg2.get_width())/2
		ty = (bg1.get_height()-bg2.get_height())/2
		self.menu_back_img.blit(bg2, bg2.get_rect().move(tx, ty))
Exemplo n.º 2
0
    def load_menu_bg(self, filename):
        '''Load an image file from the data directory and store it in dest'''
        bg1 = image_manager.get_image(filename)
        bg2 = image_manager.get_image("menu_back2.png")

        bg1 = pygame.transform.scale(bg1, (self.bg_w, self.bg_h))
        bg2 = pygame.transform.scale(
            bg2, (int(self.bg_w / 1.1), int(self.bg_h / 1.1)))
        self.menu_back_img = bg1
        tx = (bg1.get_width() - bg2.get_width()) / 2
        ty = (bg1.get_height() - bg2.get_height()) / 2
        self.menu_back_img.blit(bg2, bg2.get_rect().move(tx, ty))
Exemplo n.º 3
0
    def render(self, surface):
        if not self.visible:
            return

        if self.font is None:
            #self.font = pygame.font.Font(None, 25)
            self.font = pygame.font.Font(None, 30)

        #Render bg:
        bg_x = (self.scr_w - self.bg_w) / 2
        bg_y = (self.scr_h - self.bg_h) / 2
        #pygame.draw.rect(surface, (210, 128, 0), \
        #		pygame.Rect(bg_x, bg_y, self.bg_w, self.bg_h))
        #pygame.draw.rect(surface, (0, 0, 120), \
        #		pygame.Rect(bg_x, bg_y, self.bg_w, self.bg_h), 4)
        if not self.menu_back_img:
            self.load_menu_bg("menu_back.png")

        surface.blit(self.menu_back_img,
                     pygame.Rect(bg_x, bg_y, self.bg_w, self.bg_h))

        #Render menu options:
        entry_w = 2 * self.bg_w / 3
        entry_x = bg_x + (self.bg_w - entry_w) / 2
        entry_y = bg_y + (
            self.bg_h -
            (self.font.get_height() + 40 + 20) * len(self.options)) / 2
        #print "bg_h:", self.bg_h, "entries_height:", (self.font.get_height()+20)*len(self.options)

        for i in range(0, len(self.options)):
            option = self.options[i]
            #text_sface = self.font.render(option, 1, (255, 255, 255))
            text_sface = self.font.render(option, 1, (170, 88, 0))

            entry_h = text_sface.get_height() + 20

            #Button background:
            if not self.btn_back_img:
                self.btn_back_img = image_manager.get_image("btn_back.png")

            entry_x = bg_x + (self.bg_w - self.btn_back_img.get_width()) / 2
            surface.blit(self.btn_back_img,
                         pygame.Rect(entry_x, entry_y, entry_w, entry_h))

            #Button text:
            x = entry_x + (self.btn_back_img.get_width() -
                           text_sface.get_width()) / 2
            surface.blit(
                text_sface,
                (x, entry_y +
                 (self.btn_back_img.get_height() - text_sface.get_height()) /
                 2))

            #self.option_coords[i] = (entry_x, entry_y, entry_x+entry_w, entry_y+entry_h)
            self.option_coords[i] = (entry_x, entry_y, entry_x+self.btn_back_img.get_width(), \
               entry_y+self.btn_back_img.get_height())

            entry_y += entry_h + 40
Exemplo n.º 4
0
	def render(self, pos, size, piece, surface):
		'''
		Render the piece. x,y are the top left corner of the
		container cell; cell_size is its size
		'''
		img = image_manager.get_image('%s%s.png' % (piece.type, piece.owner.name))
		w,h = img.get_width(), img.get_height()
		tx = pos[0]*size + (size - w) / 2
		ty = pos[1]*size + (size - h) / 2

		surface.blit(img, pygame.Rect(tx, ty, w, h))
Exemplo n.º 5
0
    def render(self, surface, x, y, cell_size):
        '''
		Render this piece. x,y are the top left corner of the 
		container cell; cell_size is its size
		'''
        img = image_manager.get_image(self.type + self.owner + ".png")

        w, h = img.get_width(), img.get_height()
        tx = x + (cell_size - w) / 2
        ty = y + (cell_size - h) / 2

        surface.blit(img, pygame.Rect(tx, ty, w, h))
Exemplo n.º 6
0
	def initialize(self):
		'''Initialize Fonts, Images, etc.'''
		self.bg = pygame.transform.scale( \
			image_manager.get_image("menu_back.png"), (self.w, self.h))
		
		pawn_white = image_manager.get_image("pawnwhite.png")
		pawn_black = image_manager.get_image("pawnblack.png")
		king_white = image_manager.get_image("kingwhite.png")
		king_black = image_manager.get_image("kingblack.png")
		
		self.turn_imgs = { "move_white" : pawn_white, \
				"move_black" : pawn_black, \
				"check_white" : king_white, \
				"check_black" : king_black, \
				"checkmate_white" : king_white, \
				"checkmate_black" : king_black }
		
		font = pygame.font.Font(None, 25)
		self.turn_text = font.render(_("Current Turn:"), 1, (255, 255, 255))
		self.check_text = font.render(_("Check:"), 1, (255, 255, 0))
		self.mate_text = font.render(_("Checkmate:"), 1, (255, 20, 20))
		
		self.loaded = True
Exemplo n.º 7
0
	def render_background(self, board, surface):
		'''Render the checkboard background'''
		if self.background is None:
			#Create alternating background
			self.background = pygame.Surface((self.w, self.h))
			for i in range(0, 8):
				for j in range(0, 8):
					self.cell_renderer.render_background(board[i, j], self.background)

			#Load texture and blit it
			texture = image_manager.get_image("wood.png")
			texture = pygame.transform.scale(texture, (self.w, self.h))
			self.background.blit(texture, texture.get_rect())

		surface.blit(self.background, self.background.get_rect())
Exemplo n.º 8
0
	def render(self, surface):
		if not self.visible:
			return

		if self.font is None:
			self.font = pygame.font.Font(None, 30)

		#Render bg:
		bg_x = (self.scr_w - self.bg_w) / 2
		bg_y = (self.scr_h - self.bg_h) / 2
		if not self.menu_back_img:
			self.load_menu_bg("menu_back.png")

		surface.blit(self.menu_back_img, pygame.Rect(bg_x, bg_y, self.bg_w, self.bg_h))

		#Render menu options:
		entry_w = 2 * self.bg_w / 3
		entry_x = bg_x + (self.bg_w - entry_w) / 2
		entry_y = bg_y + (self.bg_h - (self.font.get_height()+ 40 + 20)*len(self.options)) / 2
		#print "bg_h:", self.bg_h, "entries_height:", (self.font.get_height()+20)*len(self.options)

		for i in range(0, len(self.options)):
			option = self.options[i]
			#text_sface = self.font.render(option, 1, (255, 255, 255))
			text_sface = self.font.render(option, 1, (170, 88, 0))

			entry_h = text_sface.get_height() + 20

			#Button background:
			if not self.btn_back_img:
				self.btn_back_img = image_manager.get_image("btn_back.png")

			entry_x = bg_x + (self.bg_w - self.btn_back_img.get_width()) / 2
			surface.blit(self.btn_back_img, pygame.Rect(entry_x, entry_y, entry_w, entry_h))
			
			#Button text:
			x = entry_x + (self.btn_back_img.get_width() - text_sface.get_width())/2
			surface.blit(text_sface, (x, entry_y+(self.btn_back_img.get_height()-text_sface.get_height())/2))

			#self.option_coords[i] = (entry_x, entry_y, entry_x+entry_w, entry_y+entry_h)
			self.option_coords[i] = (entry_x, entry_y, entry_x+self.btn_back_img.get_width(), \
						entry_y+self.btn_back_img.get_height())

			entry_y += entry_h + 40
Exemplo n.º 9
0
    def _run(self, scr_w, scr_h):
        pygame.init()

        #Messages
        game_messages = {}
        game_messages["checkmate"] = Message(_("Checkmate!"), 10, 40,
                                             (255, 0, 0))
        game_messages["check"] = Message(_("Check"), 10, 40, (128, 0, 0))
        game_messages["none"] = Message("", 10, 40)

        #XO: 1200x900
        if len(sys.argv) == 3:
            scr_w = int(sys.argv[1])
            scr_h = int(sys.argv[2])

        size = width, height = scr_h - 70, scr_h - 70

        #Screen config
        if not self.gtk_embedded:
            self.screen = pygame.display.set_mode((scr_w, scr_h))
        else:
            self.screen = pygame.display.get_surface()
        pygame.display.set_caption("Ceibal-Chess")

        surface = pygame.Surface(size)
        bg_img = image_manager.get_image("bg.png")
        bg_img = pygame.transform.scale(bg_img, (scr_w, scr_h))
        log.info("Starting width=%s height=%s", scr_w, scr_h)

        accum_surface = pygame.Surface((scr_w, scr_h), pygame.SRCALPHA)

        #Center chessboard in screen
        screen_rect = self.screen.get_rect()
        sface_rect = surface.get_rect()
        delta_x = (screen_rect.w - sface_rect.w) / 2
        delta_y = (screen_rect.h - sface_rect.h) / 2

        clock = pygame.time.Clock()

        board = Board(width, height)

        menu_opts = [_("New CPU Game"), _("Player vs. Player"), \
          _("Credits"), _("Quit Ceibal-Chess")]
        menu = Menu(scr_h, scr_h, menu_opts)
        menu.visible = True

        #LOG related:
        #Unique identifier for this game (used for logs)

        #Controller
        self.controller = BoardController(board, MODE_P_VS_P)
        self.controller.init_board()

        #FPS
        #messenger.messages["FPS"] = Message("FPS: (calculating)", 10, 10)
        fps = 0
        last_time = time.time()

        #Create UI Elements:
        turn_display = StatePanel(scr_w - scr_w / 6.5, scr_h / 40, 120, 120)
        board_renderer = BoardRenderer(width, height)

        clock = pygame.time.Clock()
        #Post an ACTIVEEVENT to render the first time
        pygame.event.set_blocked(pygame.MOUSEMOTION)
        pygame.event.post(pygame.event.Event(pygame.ACTIVEEVENT))

        while not self.done:
            fps += 1
            new_time = time.time()
            if new_time - last_time > 1:
                #messenger.messages["FPS"] = Message("FPS: " + str(fps/5.0), 10, 10)
                last_time = new_time
                fps = 0

            # no more than 30 FPS
            clock.tick(20)

            #Event handling
            if self.gtk_embedded:
                while gtk.events_pending():
                    gtk.main_iteration()

            #event = pygame.event.wait()
            for event in pygame.event.get():
                #discard mousemotion event (too expensive)
                #while event.type == pygame.MOUSEMOTION:
                #	event = pygame.event.wait()

                if event.type == pygame.QUIT:
                    self.controller.close()
                    self.done = True
                    break

                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_ESCAPE:
                        menu.toggle_visible()
                    if event.key == pygame.K_u and not menu.visible:
                        self.controller.undo_move()
                    #else:
                    #	controller.close()
                    #	sys.exit(0)

                if event.type == pygame.MOUSEBUTTONDOWN:
                    x, y = pygame.mouse.get_pos()

                    if not menu.visible:
                        clicked_cell = board.pick(x - delta_x, y - delta_y)
                        if clicked_cell:
                            self.controller.on_cell_clicked(clicked_cell)
                    else:
                        option = menu.on_click(x - delta_x, y - delta_y)
                        if option:
                            if option == menu_opts[3]:
                                self.controller.close()
                                self.done = True
                                break
                            elif option in menu_opts[0:2]:
                                game_mode = MODE_P_VS_CPU
                                if option == menu_opts[1]:
                                    game_mode = MODE_P_VS_P
                                board = Board(width, height)
                                self.controller.close("Started new game")
                                self.controller = BoardController(
                                    board, game_mode, self.debug)
                                self.controller.init_board()
                                menu.visible = False
                                turn_display.set_state("move_white")

                # This dirty piece of code makes the refresh and checkmate check only happen when needed
                # Need to fix this and how the _update function works.
                #if (board.current_turn.name == "black") or \
                #  ((board.current_turn.name == "white") and \
                #   (event.type == pygame.MOUSEBUTTONDOWN or event.type == pygame.MOUSEBUTTONUP)) or \
                #   (turn_display.loaded == False):

                self._update(board_renderer, board, surface, accum_surface,
                             menu, sface_rect, delta_x, delta_y, bg_img,
                             turn_display)

                # Update IA if on "player vs cpu" mode and menu is not visible:
                if not menu.visible:
                    self.controller.update()

        log.debug("Exiting...")
        if not self.gtk_embedded:
            pygame.quit()

        if self.close_callback:
            self.close_callback()
Exemplo n.º 10
0
	def _run(self, scr_w, scr_h):
		pygame.init()

		#Messages
		game_messages = {}
		game_messages["checkmate"] = Message(_("Checkmate!"), 10, 40, (255, 0, 0))
		game_messages["check"] = Message(_("Check"), 10, 40, (128, 0, 0))
		game_messages["none"] = Message("", 10, 40)

		#XO: 1200x900
		if len(sys.argv) == 3:
			scr_w = int(sys.argv[1])
			scr_h = int(sys.argv[2])

		size = width, height = scr_h - 70, scr_h - 70

		#Screen config
		if not self.gtk_embedded:
			self.screen = pygame.display.set_mode((scr_w, scr_h))
		else:
			self.screen = pygame.display.get_surface()
		pygame.display.set_caption("Ceibal-Chess")

		surface = pygame.Surface(size)
		bg_img = image_manager.get_image("bg.png")
		bg_img = pygame.transform.scale(bg_img, (scr_w, scr_h))
		log.info("Starting width=%s height=%s", scr_w, scr_h)

		accum_surface = pygame.Surface((scr_w, scr_h), pygame.SRCALPHA)

		#Center chessboard in screen
		screen_rect = self.screen.get_rect()
		sface_rect = surface.get_rect()
		delta_x = (screen_rect.w - sface_rect.w) / 2
		delta_y = (screen_rect.h - sface_rect.h) / 2

		clock = pygame.time.Clock()

		board = Board(width, height)

		menu_opts = [_("New CPU Game"), _("Player vs. Player"), \
				_("Credits"), _("Quit Ceibal-Chess")]
		menu = Menu(scr_h, scr_h, menu_opts)
		menu.visible = True

		#LOG related:
		#Unique identifier for this game (used for logs)

		#Controller
		self.controller = BoardController(board, MODE_P_VS_P)
		self.controller.init_board()

		#FPS
		#messenger.messages["FPS"] = Message("FPS: (calculating)", 10, 10)
		fps = 0
		last_time = time.time()

		#Create UI Elements:
		turn_display = StatePanel(scr_w - scr_w/6.5, scr_h/40, 120, 120)
		board_renderer = BoardRenderer(width, height)

		clock = pygame.time.Clock()
		#Post an ACTIVEEVENT to render the first time
		pygame.event.set_blocked(pygame.MOUSEMOTION)
		pygame.event.post(pygame.event.Event(pygame.ACTIVEEVENT))

		while not self.done:
			fps += 1
			new_time = time.time()
			if new_time - last_time > 1:
				#messenger.messages["FPS"] = Message("FPS: " + str(fps/5.0), 10, 10)
				last_time = new_time
				fps = 0

			# no more than 30 FPS
			clock.tick(20)


			#Event handling
			if self.gtk_embedded:
				while gtk.events_pending():
					gtk.main_iteration()

			#event = pygame.event.wait()
			for event in pygame.event.get():
				#discard mousemotion event (too expensive)
				#while event.type == pygame.MOUSEMOTION:
				#	event = pygame.event.wait()

				if event.type == pygame.QUIT:
					self.controller.close()
					self.done = True
					break

				if event.type == pygame.KEYDOWN:
					if event.key == pygame.K_ESCAPE:
						menu.toggle_visible()
					if event.key == pygame.K_u and not menu.visible:
						self.controller.undo_move()
					#else:
					#	controller.close()
					#	sys.exit(0)

				if event.type == pygame.MOUSEBUTTONDOWN:
					x, y = pygame.mouse.get_pos()

					if not menu.visible:
						clicked_cell = board.pick(x-delta_x, y-delta_y)
						if clicked_cell:
							self.controller.on_cell_clicked(clicked_cell)
					else:
						option = menu.on_click(x-delta_x, y-delta_y)
						if option:
							if option == menu_opts[3]:
								self.controller.close()
								self.done = True
								break
							elif option in menu_opts[0:2]:
								game_mode = MODE_P_VS_CPU
								if option == menu_opts[1]:
									game_mode = MODE_P_VS_P
								board = Board(width, height)
								self.controller.close("Started new game")
								self.controller = BoardController(board, game_mode, self.debug)
								self.controller.init_board()
								menu.visible = False
								turn_display.set_state("move_white")
				
				# This dirty piece of code makes the refresh and checkmate check only happen when needed
				# Need to fix this and how the _update function works.
				#if (board.current_turn.name == "black") or \
				#  ((board.current_turn.name == "white") and \
				#   (event.type == pygame.MOUSEBUTTONDOWN or event.type == pygame.MOUSEBUTTONUP)) or \
				#   (turn_display.loaded == False):


				self._update(board_renderer, board, surface, accum_surface, menu, sface_rect, delta_x, delta_y, bg_img, turn_display)

				# Update IA if on "player vs cpu" mode and menu is not visible:
				if not menu.visible:
					self.controller.update()

		log.debug("Exiting...")
		if not self.gtk_embedded:
			pygame.quit()

		if self.close_callback:
			self.close_callback()
Exemplo n.º 11
0
def main(requested_w, requested_h):
    pygame.init()

    #Messages
    game_messages = {}
    game_messages["checkmate"] = Message("Checkmate!", 10, 40, (255, 0, 0))
    game_messages["check"] = Message("Check", 10, 40, (128, 0, 0))
    game_messages["none"] = Message("", 10, 40)

    #XO: 1200x900
    scr_w = requested_w
    scr_h = requested_h
    if len(sys.argv) == 3:
        scr_w = int(sys.argv[1])
        scr_h = int(sys.argv[2])

    size = width, height = scr_h - 70, scr_h - 70

    #Screen config
    screen = pygame.display.set_mode((scr_w, scr_h))
    pygame.display.set_caption("Ceibal-Chess")

    surface = pygame.Surface(size)
    bg_img = image_manager.get_image("bg.png")
    bg_img = pygame.transform.scale(bg_img, (scr_w, scr_h))
    print scr_w, scr_h

    #Center chessboard in screen
    screen_rect = screen.get_rect()
    sface_rect = surface.get_rect()
    delta_x = (screen_rect.w - sface_rect.w) / 2
    delta_y = (screen_rect.h - sface_rect.h) / 2

    clock = pygame.time.Clock()

    board = Board(width, height)

    menu_opts = ["New CPU Game", "Player vs. Player", \
      "Practice Mode", "Credits", "Quit Ceibal-Chess"]
    menu = Menu(scr_h, scr_h, menu_opts)
    menu.visible = True

    #LOG related:
    #Unique identifier for this game (used for logs)
    game_code = str(int(time.time()))

    try:
        logpath = os.path.join(os.environ["HOME"], ".cchess")
    except:
        logpath = ".cchess"

    if not os.path.isdir(logpath):
        os.mkdir(logpath)

    #Controller
    controller = BoardController(board, MODE_P_VS_P, game_code, logpath)
    controller.init_board()

    #FPS
    #messenger.messages["FPS"] = Message("FPS: (calculating)", 10, 10)
    fps = 0
    last_time = time.time()

    #Create UI Elements:
    turn_display = StatePanel(scr_w - scr_w / 6, scr_h / 40, 120, 120)

    #Post an ACTIVEEVENT to render the first time
    pygame.event.post(pygame.event.Event(pygame.ACTIVEEVENT))

    while 1:
        fps += 1
        new_time = time.time()
        if new_time - last_time > 5:
            #print "FPS:", fps/5.0
            #messenger.messages["FPS"] = Message("FPS: " + str(fps/5.0), 10, 10)
            last_time = new_time
            fps = 0

        #clock.tick(30)

        try:
            if not menu.visible:
                controller.update(0)

            #Event handling
            event = pygame.event.wait()
            #discard mousemotion event (too expensive)
            while event.type == pygame.MOUSEMOTION:
                event = pygame.event.wait()

            if event.type == pygame.QUIT:
                controller.shutdown()
                sys.exit(0)

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    menu.toggle_visible()
                #else:
                #	controller.shutdown()
                #	sys.exit(0)

            if event.type == pygame.MOUSEBUTTONDOWN:
                x, y = pygame.mouse.get_pos()

                if not menu.visible:
                    clicked_cell = board.pick(x - delta_x, y - delta_y)
                    controller.on_cell_clicked(clicked_cell)
                else:
                    option = menu.on_click(x - delta_x, y - delta_y)
                    if option:
                        if option == menu_opts[4]:
                            controller.shutdown()
                            sys.exit(0)
                        elif option in menu_opts[0:2]:
                            game_mode = MODE_P_VS_CPU
                            if option == menu_opts[1]:
                                game_mode = MODE_P_VS_P
                            board = Board(width, height)
                            controller.shutdown("Started new game")
                            controller = BoardController(
                                board, game_mode, game_code, logpath)
                            controller.init_board()
                            menu.visible = False
                            turn_display.set_state("move_white")
            if not menu.visible:
                print "Checking if king is checkmated:"
                t_ini = time.time()
                checkmated = board.king_is_checkmated(board.current_turn)
                print "Check if checkmate for %s took %.5f secs" % \
                 (board.current_turn, time.time() - t_ini)

                if checkmated:
                    #print "Checkmate for", board.current_turn
                    #messenger.messages["check"] = game_messages["checkmate"]
                    controller.game_state = "checkmate"
                    turn_display.set_state("checkmate_" + board.current_turn)

                elif board.king_is_checked(board.current_turn):
                    #messenger.messages["check"] = game_messages["check"]
                    turn_display.set_state("check_" + board.current_turn)
                else:
                    #messenger.messages["check"] = game_messages["none"]
                    turn_display.set_state("move_" + board.current_turn)

        except Exception, ex:
            print "Caught exception, dumping and cleaning up..."
            #Dump to stdout
            print ex.message
            traceback.print_exc(file=sys.stdout)

            #Dump move log and close IA
            controller.shutdown(ex.message)

            #Dump trace to file
            trace_file = open(os.path.join(logpath, game_code + ".trace"), "w")
            traceback.print_exc(file=trace_file)
            trace_file.close()

            #Dump screen to image file
            pygame.image.save(screen, os.path.join(logpath,
                                                   game_code + ".png"))

            print "Ceibal-Chess is done crashing... Game code was: " + game_code
            print "Have a nice day :)"
            sys.exit(-1)

        #time visual update:
        t_ini = time.time()

        clear(screen)
        clear(surface)

        screen.blit(bg_img, bg_img.get_rect())

        board.render_background(surface)

        if controller.selected_cell is not None:
            board.render_moves_for_piece_in_cell(surface,
                                                 controller.selected_cell)
            controller.selected_cell.render_foreground(surface)

        board.render_foreground(surface)

        menu.render(surface)

        screen.blit(surface, sface_rect.move(delta_x, delta_y))

        if not menu.visible:
            turn_display.render(screen)

        messenger.render_messages(screen)

        update()

        print "Visual refresh took %.5f secs" % (time.time() - t_ini)