欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python实现人机中国象棋游戏

程序员文章站 2022-06-21 12:06:42
目录导语1.游戏规则&基本玩法1.1 基本玩法1.2 行棋规则2.素材文件3.主要代码3.1 chinachess.py 为主文件3.2 constants.py 数据常量3.3 pieces...

导语

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

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

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

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

早前曾有统计,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.player1color, 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
                    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.putdownflag = 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
        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中国象棋的资料请关注其它相关文章!