开发者

Python实现人机中国象棋游戏

目录
  • 导语
  • 1.游戏规则&基本玩法
    • 1.1 基本玩法
    • 1.2 行棋规则
  • 2.素材文件
    • 3.主要代码
      • 3.1 Chinachess.py 为主文件
      • 3.2 Constants.py 数据常量
      • 3.3 Pieces.py 棋子类,走法
      • 3.4 Computer.py 电脑走法计算
      • 3.5 Button.py按钮定义
    • 4.游戏效果
      • 总结

        导语

        哈喽!哈喽!我是木木子!今日游戏更新——中国象棋上线啦!

        中国象棋是一种古老的棋类游戏,大约有两千年的历史。

        是中华文明非物质文化经典产物,艺术价值泛属于整个人类文明进化史的一个分枝。

        在中国,可以随处在大街上、小公园儿里等地方经常看到一堆人围在一起下棋,这就足以说明中国象棋的流行性以及普遍性有多高!

        早前曾有统计,14、15个中国人当中,就有1个会下中国象棋。中国象棋的受众,可能数以亿计!

        今天教大家制作一款中国象棋and想学象棋的话也可以来看看当作新手村吧~

        1.游戏规则&基本玩法

        1.1 基本玩法

        中国象棋的游戏用具由棋盘和棋子组成,对局时,由执红棋的一方先走,双方轮流各走一招,直至分出胜、负、和,对局即终了。轮到走棋的一方,将某个棋子从一个交叉点走到另一个交叉点,或者吃掉对方的棋子而占领其交叉点,都算走了一着。双方各走一着,称为一个回合。

        1.2 行棋规则

        Python实现人机中国象棋游戏

        2.素材文件

        Python实现人机中国象棋游戏

        3.主要代码

        chinachess.py 为主文件;constants.py 数据常量;pieces.py 棋子类,走法;computer.py 电脑走法计算;button.py按钮定义。

        目前电脑走法比较傻,有兴趣的朋友可以对computer.py 进行升级!不过这针对大部分的新手刚开始学象棋的话完全够用了哈~哈哈哈 如果你新手入门玩儿的过电脑就说明你入门了!

        3.1 Chinachess.py 为主文件

        import pygame
        import time
        import Xiangqi.constants as constants
        from Xiangqi.button import Button
        import Xiangqi.pieces as pieces
        import Xiangqi.computer as computer
         
         
        class MainGame():
            window = None
            Start_X = constants.Start_X
            Start_Y = constants.Start_Y
            Line_Span = constants.Line_Span
            Max_X = Start_X + 8 * Line_Span
            Max_Y = Start_Y + 9 * Line_Span
         
         
            player1Color = constants.player1Color
            player2Color = constants.player2Color
            Putdownflag = player1Color
            piecesSelected = None
         
         
            button_go = None
            piecesList = []
         
         
            def start_game(self):
                MainGame.window = pygame.display.set_mode([constants.SCREEN_WIDTH, constants.SCREEN_HEIGHT])
                pygame.display.set_caption("python代码大全-中国象棋")
                MainGame.button_go = Button(MainGame.window, "重新开始", constants.SCREEN_WIDTH - 100, 300)  # 创建开始按钮
                self.piecesInit()
         
         
                while True:
                    time.sleep(0.1)
                    # 获取事件
                    MainGame.window.fill(constants.BG_COLOR)
                    self.drawChessboard()
                    #MainGame.button_go.draw_button()
                    self.piecesDisplay()
                    self.VictoryOrDefeat()
                    self.Computerplay()
                    self.getEvent()
                    pygame.display.update()
                    pygame.display.flip()
         
         
            def drawChessboard(self): #画象棋盘
                mid_end_y = MainGame.Start_Y + 4 * MainGame.Line_Span
                min_start_y = MainGame.Start_Y + 5 * MainGame.Line_Span
                for i in range(0, 9):
                    x = MainGame.Start_X + i * MainGame.Line_Span
                    if i==0 or i ==8:
                        y = MainGame.Start_Y + i * MainGame.Line_Span
                        pygame.draw.line(MainGame.window, constants.BLACK, [x, MainGame.Start_Y], [x, MainGame.Max_Y], 1)
                    else:
                        pygame.draw.line(MainGame.window, constants.BLACK, [x, MainGame.Start_Y], [x, mid_end_y], 1)
                        pygame.draw.line(MainGame.window, constants.BLACK, [x, min_start_y], [x, MainGame.Max_Y], 1)
         
         
                for i in range(0, 10):
                    x = MainGame.Start_X + i * MainGame.Line_Span
                    y = MainGame.Start_Y + i * MainGame.Line_Span
                    pygame.draw.line(MainGame.window, constants.BLACK, [MainGame.Start_X, y], [MainGame.Max_X, y], 1)
         
         
                speed_dial_start_x =  MainGame.Start_X + 3 * MainGame.Line_Span
                speed_dial_end_x =  MainGame.Start_X + 5 * MainGame.Line_Span
                speed_dial_y1 = MainGame.Start_Y + 0 * MainGame.Line_Span
                speed_dial_y2 = MainGame.Start_Y + 2 * MainGame.Line_Span
                speed_dial_y3 = MainGame.Start_Y + 7 * MainGame.Line_Span
                speed_dial_y4 = MainGame.Start_Y + 9 * MainGame.Line_Span
         
         
                pygame.draw.line(MainGame.window, constants.BLACK, [speed_dial_start_x, speed_dial_y1], [speed_dial_end_x, speed_dial_y2], 1)
                pygame.draw.line(MainGame.window, constants.BLACK, [speed_dial_start_x, speed_dial_y2],
                                 [speed_dial_end_x, speed_dial_y1], 1)
                pygame.draw.line(MainGame.window, constants.BLACK, [speed_dial_start_x, speed_dial_y3],
                                 [speed_dial_end_x, speed_dial_y4], 1)
                pygame.draw.line(MainGame.window, constants.BLACK, [speed_dial_start_x, speed_dial_y4],
                                 [speed_dial_end_x, speed_dial_y3], 1)
         
         
            def piecesInit(self):  #加载棋子
                MainGame.piecesList.append(pieces.Rooks(MainGame.player2Color, 0,0))
                MainGame.piecesList.append(pieces.Rooks(MainGame.player2Color,  8, 0))
                MainGame.piecesList.append(pieces.Elephants(MainGame.player2Color,  2, 0))
                MainGame.piecesList.append(pieces.Elephants(MainGame.player2Color,  6, 0))
                MainGame.piecesList.append(pieces.King(MainGame.player2Color, 4, 0))
                MainGame.piecesList.append(pieces.Knighs(MainGame.player2Color,  1, 0))
                MainGame.piecesList.append(pieces.Knighs(MainGame.player2Color,  7, 0))
                MainGame.piecesList.append(pieces.Cannons(MainGame.player2Color,  1, 2))
                MainGame.piecesList.append(pieces.Cannons(MainGame.player2Color, 7, 2))
                MainGame.piecesList.append(pieces.Mandarins(MainGame.player2Color,  3, 0))
                MainGame.piecesList.append(pieces.Mandarins(MainGame.player2Color, 5, 0))
                MainGame.piecesList.append(pieces.Pawns(MainGame.player2Color, 0, 3))
                MainGame.piecesList.append(pieces.Pawns(MainGame.player2Color, 2, 3))
                MainGame.piecesList.append(pieces.Pawns(MainGame.player2Color, 4, 3))
                MainGame.piecesList.append(pieces.Pawns(MainGame.player2Color, 6, 3))
                MainGame.piecesList.append(pieces.Pawns(MainGame.player2Color, 8, 3))
         
         
                MainGame.piecesList.append(pieces.Rooks(MainGame.player1Color,  0, 9))
                MainGame.piecesList.append(pieces.Rooks(MainGame.player1Color,  8, 9))
                MainGame.piecesList.append(pieces.Elephants(MainGame.player1Color, 2, 9))
                MainGame.piecesList.append(pieces.Elephants(MainGame.player1Color, 6, 9))
                MainGame.piecesList.append(pieces.King(MainGame.player1Color,  4, 9))
                MainGame.piecesList.append(pieces.Knighs(MainGame.player1Color, 1, 9))
                MainGame.piecesList.append(pieces.Knighs(MainGame.player1Color, 7, 9))
                MainGame.piecesList.append(pieces.Cannons(MainGame.player1Color,  1, 7))
                MainGame.piecesList.append(pieces.Cannons(MainGame.player1Color,  7, 7))
                MainGame.piecesList.append(pieces.Mandarins(MainGame.player1Color,  3, 9))
                MainGame.piecesList.append(pieces.Mandarins(MainGame.player1Color,  5, 9))
                MainGame.piecesList.append(pieces.Pawns(MainGame.prZBFKtsmlayer1Color, 0, 6))
                MainGame.piecesList.append(pieces.Pawns(MainGame.player1Color, 2, 6))
                MainGame.piecesList.append(pieces.Pawns(MainGame.player1Color, 4, 6))
                MainGame.piecesList.append(pieces.Pawns(MainGame.player1Color, 6, 6))
                MainGame.piecesList.append(pieces.Pawns(MainGame.player1Color, 8, 6))
         
         
            def piecesDisplay(self):
                for item in MainGame.piecesList:
                    item.displaypieces(MainGame.window)
                    #MainGame.window.blit(item.image, item.rect)
         
         
            def getEvent(self):
                # 获取所有的事件
                eventList = pygame.event.get()
                for event in eventList:
                    if event.type == pygame.QUIT:
                        self.endGame()
                    elif event.type == pygame.MOUSEBUTTONDOWN:
                        pos = pygame.mouse.get_pos()
                        mouse_x = pos[0]
                        mouse_y = pos[1]
                        if (
                                mouse_x > MainGame.Start_X - MainGame.Line_Span / 2 and mouse_x < MainGame.Max_X + MainGame.Line_Span / 2) and (
                                mouse_y > MainGame.Start_Y - MainGame.Line_Span / 2 and mouse_y < MainGame.Max_Y + MainGame.Line_Span / 2):
                            # print( str(mouse_x) + "" + str(mouse_y))
                            # print(str(MainGame.Putdownflag))
                            if MainGame.Putdownflag != MainGame.player1Color:
                                return
         
         
                            click_x = round((mouse_x - MainGame.Start_X) / MainGame.Line_Span)
                            click_y = round((mouse_y - MainGame.Start_Y) / MainGame.Line_Span)
                            click_mod_x = (mouse_x - MainGame.Start_X) % MainGame.Line_Span
                        http://www.cppcns.com    click_mod_y = (mouse_y - MainGame.Start_Y) % MainGame.Line_Span
                            if abs(click_mod_x - MainGame.Line_Span / 2) >= 5 and abs(
                                    click_mod_y - MainGame.Line_Span / 2) >= 5:
                                # print("有效点:x="+str(click_x)+" y="+str(click_y))
                                # 有效点击点
                                self.PutdownPieces(MainGame.player1Color, click_x, click_y)
                        else:
                            print("out")
                        if MainGame.button_go.is_click():
                            #self.restart()
                            print("button_go click")
                        else:
                            print("button_go click out")
         
         
            def PutdownPieces(self, t, x, y):
                selectfilter=list(filter(lambda cm: cm.x == x and cm.y == y and cm.player == MainGame.player1Color,MainGame.piecesList))
                if len(selectfilter):
                    MainGame.piecesSelected = selectfilter[0]
                    return
         
         
                if MainGame.piecesSelected :
                    #print("1111")
         
         
                    arr = pieces.listPiecestoArr(MainGame.piecesList)
                    if MainGame.piecesSelected.canmove(arr, x, y):
                        self.PiecesMove(MainGame.piecesSelected, x, y)
                        MainGame.Putdownflag = MainGame.player2Color
                else:
                    fi = filter(lambda p: p.x == x and p.y == y, MainGame.piecesList)
                    listfi = list(fi)
                    if len(listfi) != 0:
                        MainGame.piecesSelected = listfi[0]
         
         
            def PiecesMove(self,pieces,  x , y):
                for item in  MainGame.piecesList:
                    if item.x ==x and item.y == y:
                        MainGame.piecesList.remove(item)
                pieces.x = x
                pieces.y = y
                print("move to " +str(x) +" "+str(y))
                return True
         
         
            def Computerplay(self):
                if MainGame.Putdownflag == MainGame.player2Color:
                    print("轮到电脑了")
                    computermove = computer.getPlayInfo(MainGame.piecesList)
                    #if computer==None:
                        #return
                    piecemove = None
                    for item in MainGame.piecesList:
                        if item.x == computermove[0] and item.y == computermove[1]:
                            piecemove= item
         
         
                    self.PiecesMove(piecemove, computermove[2], computermove[3])
                    MainGame.Putdwww.cppcns.comownflag = MainGame.player1Color
         
         
            #判断游戏胜利
            def VictoryOrDefeat(self):
                txt =""
                result = [MainGame.player1Color,MainGame.player2Color]
                for item in MainGame.piecesList:
                    if type(item) ==pieces.King:
                        if item.player == MainGame.player1Color:
                            result.remove(MainGame.player1Color)
                        if item.player == MainGame.player2Color:
                            result.remove(MainGame.player2Color)
         
         
                if len(result)==0:
                    return
                if result[0] == MainGame.player1Color :
                    txt = "失败!"
                else:
                    txt = "胜利!"
                MainGame.window.blit(self.getTextSuface("%s" % txt), (constants.SCREEN_WIDTH - 100, 200))
                MainGame.Putdownflag = constants.overColor
         
         
            def getTextSuface(self, text):
                pygame.font.init()
                # print(pygame.font.get_fonts())
                font = pygame.font.SysFont('kaiti', 18)
                txt = font.render(text, True, constants.TEXT_COLOR)
                return txt
         
         
            def endGame(self):
                print("exit")
                exit()
         
         
        if __name__ == '__main__':
            MainGame().start_game()
        

        3.2 Constants.py 数据常量

        #数据常量
        import pygame
         
         
        SCREEN_WIDTH=900
        SCREEN_HEIGHT=650
        Start_X = 50
        Start_Y = 50
        Line_Span = 60
         
         
        player1Color = 1
        player2Color = 2
        overColor = 3
         
         
        BG_COLOR=pygame.Color(200, 200, 200)
        Line_COLOR=pygame.Color(255, 255, 200)
        TEXT_COLOR=pygame.Color(255, 0, 0)
         
         
        # 定义颜色
        BLACK = ( 0, 0, 0)
        WHITE = (255, 255, 255)
        RED = (255, 0, 0)
        GREEN = ( 0, 255, 0)
        BLUE = ( 0, 0, 255)
         
         
        repeat = 0
         
         
        pieces_images = {
            'b_rook': pygame.image.load("imgs/s2/b_c.gif"),
            'b_elephant': pygame.image.load("imgs/s2/b_x.gif"),
            'b_king': pygame.image.load("imgs/s2/b_j.gif"),
            'b_knigh': pygame.image.load("imgs/s2/b_m.gif"),
            'b_mandarin': pygame.image.load("imgs/s2/b_s.gif"),
            'b_cannon': pygame.image.load("imgs/s2/b_p.gif"),
            'b_pawn': pygame.image.load("imgs/s2/b_z.gif"),
         
         
            'r_rook': pygame.image.load("imgs/s2/r_c.gif"),
            'r_elephant': pygame.image.load("imgs/s2/r_x.gif"),
            'r_king': pygame.image.load("imgs/s2/r_j.gif"),
            'r_knigh': pygame.image.load("imgs/s2/r_m.gif"),
            'r_mandarin': pygame.image.load("imgs/s2/r_s.gif"),
            'r_cannon': pygame.image.load("imgs/s2/r_p.gif"),
            'r_pawn': pygame.image.load("imgs/s2/r_z.gif"),
        }
        

        3.3 Pieces.py 棋子类,走法

        #棋子类,走法
        import pygame
        import Xiangqi.constants as constants
         
         
        class  Pieces():
            def __init__(self, player,  x, y):
                self.imagskey = self.getImagekey()
                self.image = constants.pieces_images[self.imagskey]
                self.x = x
                self.y = y
                self.player = player
                self.rect = self.image.get_rect()
                self.rect.left = constants.Start_X + x * constants.Line_Span - self.image.get_rect().width / 2
           

        rZBFKtsm

        self.rect.top = constants.Start_Y + y * constants.Line_Span - self.image.get_rect().height / 2 def displaypieces(self,screen): #print(str(self.rect.left)) self.rect.left = constants.Start_X + self.x * constants.Line_Span - self.image.get_rect().width / 2 self.rect.top = constants.Start_Y + self.y * constants.Line_Span - self.image.get_rect().height / 2 screen.blit(self.image,self.rect); #self.image = self.images #MainGame.window.blit(self.image,self.rect) def canmove(self, arr, moveto_x, moveto_y): pass def getImagekey(self): return None def getScoreWeight(self,listpieces): return None class Rooks(Pieces): def __init__(self, player, x, y): self.player = player super().__init__(player, x, y) def getImagekey(self): if self.player == constants.player1Color: return "r_rook" else: return "b_rook" def canmove(self, arr, moveto_x, moveto_y): if self.x == moveto_x and self.y == moveto_y: return False if arr[moveto_x][moveto_y] ==self.player : return False if self.x == moveto_x: step = -1 if self.y > moveto_y else 1 for i in range(self.y +step, moveto_y, step): if arr[self.x][

        编程客栈

        i] !=0 : return False #print(" move y") return True if self.y == moveto_y: step = -1 if self.x > moveto_x else 1 for i in range(self.x + step, moveto_x, step): if arr[i][self.y] != 0: return False return True def getScoreWeight(self, listpieces): score = 11 return score class Knighs(Pieces): def __init__(self, player, x, y): self.player = player super().__init__(player, x, y) def getImagekey(self): if self.player == constants.player1Color: return "r_knigh" else: return "b_knigh" def canmove(self, arr, moveto_x, moveto_y): if self.x == moveto_x and self.y == moveto_y: return False if arr[moveto_x][moveto_y] == self.player: return False #print(str(self.x) +""+str(self.y)) move_x = moveto_x-self.x move_y = moveto_y - self.y if abs(move_x) == 1 and abs(move_y) == 2: step = 1 if move_y > 0 else -1 if arr[self.x][self.y + step] == 0: return True if abs(move_x) == 2 and abs(move_y) == 1: step = 1 if move_x >0 else -1 if arr[self.x +step][self.y] ==0 : return True def getScoreWeight(self, listpieces): score = 5 return score class Elephants(Pieces): def __init__(self, player, x, y): self.player = player super().__init__(player, x, y) def getImagekey(self): if self.player == constants.player1Color: return "r_elephant" else: return "b_elephant" def canmove(self, arr, moveto_x, moveto_y): if self.x == moveto_x and self.y == moveto_y: return False if arr[moveto_x][moveto_y] == self.player: return False if self.y <=4 and moveto_y >=5 or self.y >=5 and moveto_y <=4: return False move_x = moveto_x - self.x move_y = moveto_y - self.y if abs(move_x) == 2 and abs(move_y) == 2: step_x = 1 if move_x > 0 else -1 step_y = 1 if move_y > 0 else -1 if arr[self.x + step_x][self.y + step_y] == 0: return True def getScoreWeight(self, listpieces): score = 2 return score class Mandarins(Pieces): def __init__(self, player, x, y): self.player = player super().__init__(player, x, y) def getImagekey(self): if self.player == constants.player1Color: return "r_mandarin" else: return "b_mandarin" def canmove(self, arr, moveto_x, moveto_y): if self.x == moveto_x and self.y == moveto_y: return False if arr[moveto_x][moveto_y] == self.player: return False if moveto_x <3 or moveto_x >5: return False if moveto_y > 2 and moveto_y < 7: return False move_x = moveto_x - self.x move_y = moveto_y - self.y if abs(move_x) == 1 and abs(move_y) == 1: return True def getScoreWeight(self, listpieces): score = 2 return score class King(Pieces): def __init__(self, player, x, y): self.player = player super().__init__(player, x, y) def getImagekey(self): if self.player == constants.player1Color: return "r_king" else: return "b_king" def canmove(self, arr, moveto_x, moveto_y): if self.x == moveto_x and self.y == moveto_y: return False if arr[moveto_x][moveto_y] == self.player: return False if moveto_x < 3 or moveto_x > 5: return False if moveto_y > 2 and moveto_y < 7: return False move_x = moveto_x - self.x move_y = moveto_y - self.y if abs(move_x) + abs(move_y) == 1: return True def getScoreWeight(self, listpieces): score = 150 return score class Cannons(Pieces): def __init__(self, player, x, y): self.player = player super().__init__(player, x, y) def getImagekey(self): if self.player == constants.player1Color: return "r_cannon" else: return "b_cannon" def canmove(self, arr, moveto_x, moveto_y): if self.x == moveto_x and self.y == moveto_y: return False if arr[moveto_x][moveto_y] == self.player: return False overflag = False if self.x == moveto_x: step = -1 if self.y > moveto_y else 1 for i in range(self.y + step, moveto_y, step): if arr[self.x][i] != 0: if overflag: return False else: overflag = True if overflag and arr[moveto_x][moveto_y] == 0: return False if not overflag and arr[self.x][moveto_y] != 0: return False return True if self.y == moveto_y: step = -1 if self.x > moveto_x else 1 for i in range(self.x + step, moveto_x, step): if arr[i][self.y] != 0: if overflag: return False else: overflag = True if overflag and arr[moveto_x][moveto_y] == 0: return False if not overflag and arr[moveto_x][self.y] != 0: return False return True def getScoreWeight(self, listpieces): score = 6 return score class Pawns(Pieces): def __init__(self, player, x, y): self.player = player super().__init__(player, x, y) def getImagekey(self): if self.player == constants.player1Color: return "r_pawn" else: return "b_pawn" def canmove(self, arr, moveto_x, moveto_y): if self.x == moveto_x and self.y == moveto_y: return False if arr[moveto_x][moveto_y] == self.player: return False move_x = moveto_x - self.x move_y = moveto_y - self.y if self.player == constants.player1Color: if self.y > 4 and move_x != 0 : return False if move_y > 0: return False elif self.player == constants.player2Color: if self.y <= 4 and move_x != 0 : return False if move_y < 0: return False if abs(move_x) + abs(move_y) == 1: return True def getScoreWeight(self, listpieces): score = 2 return score def listPiecestoArr(piecesList): arr = [[0 for i in range(10)] for j in range(9)] for i in range(0, 9): for j in range(0, 10): if len(list(filter(lambda cm: cm.x == i and cm.y == j and cm.player == constants.player1Color, piecesList))): arr[i][j] = constants.player1Color elif len(list(filter(lambda cm: cm.x == i and cm.y == j and cm.player == constants.player2Color, piecesList))): arr[i][j] = constants.player2Color return arr

        3.4 Computer.py 电脑走法计算

        #电脑走法计算
        import Xiangqi.constants as constants
        #import time
        from Xiangqi.pieces import listPiecestoArr
         
         
        def getPlayInfo(listpieces):
            pieces = movedeep(listpieces ,1 ,constants.player2Color)
            return [pieces[0].x,pieces[0].y, pieces[1], pieces[2]]
         
         
        def movedeep(listpieces, deepstep, player):
            arr = listPiecestoArr(listpieces)
            listMoveEnabel = []
            for i in range(0, 9):
                for j in range(0, 10):
                    for item in listpieces:
                        if item.player == player and item.canmove(arr, i, j):
                            #标记是否有子被吃 如果被吃 在下次循环时需要补会
                            piecesremove = None
                            for itembefore in listpieces:
                                if itembefore.x == i and itembefore.y == j:
                                    piecesremove= itembefore
                                    break
                            if piecesremove != None:
                                listpieces.remove(piecesremove)
         
         
                            #记录移动之前的位置
                            move_x = item.x
                            move_y = item.y
                            item.x = i
                            item.y = j
         
         
                            #print(str(move_x) + "," + str(move_y) + "," + str(item.x) + "  ,  " + str(item.y))
                            scoreplayer1 = 0
                            scoreplayer2 = 0
                            for itemafter in listpieces:
                                if itemafter.player == constants.player1Color:
                                    scoreplayer1 += itemafter.getScoreWeight(listpieces)
                                elif  itemafter.player == constants.player2Color:
                                    scoreplayer2 += itemafter.getScoreWeight(listpieces)
         
         
                            #print("得分:"+item.imagskey +", "+str(len(moveAfterListpieces))+","+str(i)+","+str(j)+"," +str(scoreplayer1) +"  ,  "+ str(scoreplayer2) )
                            #print(str(deepstep))
                            #如果得子 判断对面是否可以杀过来,如果又被杀,而且子力评分低,则不干
                            arrkill = listPiecestoArr(listpieces)
         
         
                            if scoreplayer2 > scoreplayer1 :
                                for itemkill in listpieces:
                                    if itemkill.player == constants.player1Color and itemkill.canmove(arrkill, i, j):
                                        scoreplayer2=scoreplayer1
         
         
                            if deepstep > 0 :
                                nextplayer = constants.player1Color if player == constants.player2Color else constants.player2Color
                                nextpiecesbest= movedeep(listpieces, deepstep -1, nextplayer)
                                listMoveEnabel.append([item, i, j, nextpiecesbest[3], nextpiecesbest[4], nextpiecesbest[5]])
                            else:
                                #print(str(len(listpieces)))
                                #print("得分:" + item.imagskey + ", " + str(len(listpieces)) + "," + str(move_x) + "," + str(move_y) + "," + str(i) + "  ,  " + str(j))
                                if player == constants.player2Color:
                                    listMoveEnabel.append([item, i, j, scoreplayer1, scoreplayer2, scoreplayer1 - scoreplayer2])
                                else:
                                    listMoveEnabel.append([item, i, j, scoreplayer1, scoreplayer2, scoreplayer2 - scoreplayer1])
                            #print("得分:"+str(scoreplayer1))
                            item.x = move_x
                            item.y = move_y
                            if piecesremove != None:
                                listpieces.append(piecesremove)
         
         
            list_scorepalyer1 = sorted(listMoveEnabel, key=lambda tm: tm[5], reverse=True)
            piecesbest = list_scorepalyer1[0]
            if deepstep ==1 :
                print(list_scorepalyer1)
            return piecesbest
        

        3.5 Button.py按钮定义

        #设置按钮
        import pygame
        class Button():
            def __init__(self, screen, msg, left,top):  # msg为要在按钮中显示的文本
                """初始化按钮的属性"""
                self.screen = screen
                self.screen_rect = screen.get_rect()
         
         
                self.width, self.height = 150, 50  # 这种赋值方式很不错
                self.button_color = (72, 61, 139)  # 设置按钮的rect对象颜色为深蓝
                self.text_color = (255, 255, 255)  # 设置文本的颜色为白色
                pygame.font.init()
                self.font = pygame.font.SysFont('kaiti', 20)  # 设置文本为默认字体,字号为40
         
         
                self.rect = pygame.Rect(0, 0, self.width, self.height)
                #self.rect.center = self.screen_rect.center  # 创建按钮的rect对象,并使其居中
                self.left = left
                self.top = top
         
         
                self.deal_msg(msg)  # 渲染图像
         
         
            def deal_msg(self, msg):
                """将msg渲染为图像,并将其在按钮上居中"""
                self.msg_img = self.font.render(msg, True, self.text_color, self.button_color)  # render将存储在msg的文本转换为图像
                self.msg_img_rect = self.msg_img.get_rect()  # 根据文本图像创建一个rect
                self.msg_img_rect.center = self.rect.center  # 将该rect的center属性设置为按钮的center属性
         
         
            def draw_button(self):
                #self.screen.fill(self.button_color, self.rect)  # 填充颜色
                self.screen.blit(self.msg_img, (self.left,self.top))  # 将该图像绘制到屏幕
         
         
            def is_click(self):
                point_x, point_y = pygame.mouse.get_pos()
                x = self.left
                y = self.top
                w, h = self.msg_img.get_size()
         
         
                in_x = x < point_x < x + w
                in_y = y < point_y < y + h
                return in_x and in_y
        

        4.游戏效果

        Python实现人机中国象棋游戏

        总结

        好啦!文章就写到这里了哈,想入门象棋的可以先试着自己研究下,上面的教程也有说走法、行棋的规则,然后后面就是实战,自己动手跟电脑来一场对决吧~

        以上就是Python实现人机中国象棋游戏的详细内容,更多关于Python中国象棋的资料请关注我们其它相关文章!

        0

        上一篇:

        下一篇:

        精彩评论

        暂无评论...
        验证码 换一张
        取 消

        最新开发

        开发排行榜