当前位置:   article > 正文

Python实现人机中国象棋游戏_中国象棋特级大师人机python

中国象棋特级大师人机python

特别鸣谢以下更多python教程请到友情连接: 菜鸟教程https://www.piaodoo.com

初中毕业读什么技校 http://cntkd.net

茂名一技http://www.enechn.com

ppt制作教程步骤 http://www.tpyjn.cn

兴化论坛http://www.yimoge.cn

电白论坛 http://www.fcdzs.com

永城信息港 http://www.1l4u.com

茂名一技有什么专业 http://www.jeob.cn

茂名市高级技工学校 http://www.szsyby.net

初中毕业读什么技校 http://www.ausq.cn


导语

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

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

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

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

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

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

1.游戏规则&基本玩法

1.1 基本玩法

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

1.2 行棋规则

2.素材文件

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228

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"),
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

}

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

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
  • 1
  • 2
  • 3

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
  • 1
  • 2
  • 3

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 &lt;3 or moveto_x &gt;5:
        return False
    if moveto_y &gt; 2 and moveto_y &lt; 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

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 &lt; 3 or moveto_x &gt; 5:
        return False
    if moveto_y &gt; 2 and moveto_y &lt; 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

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 &gt; 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 &gt; 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

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 &gt; 4  and move_x != 0 :
            return  False
        if move_y &gt; 0:
            return  False
    elif self.player == constants.player2Color:
        if self.y &lt;= 4  and move_x != 0 :
            return  False
        if move_y &lt; 0:
            return False


    if abs(move_x) + abs(move_y) == 1:
        return True
def getScoreWeight(self, listpieces):
    score = 2
    return score
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

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
  • 1

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 &gt; scoreplayer1 :
                    for itemkill in listpieces:
                        if itemkill.player == constants.player1Color and itemkill.canmove(arrkill, i, j):
                            scoreplayer2=scoreplayer1


                if deepstep &gt; 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

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 &lt; point_x &lt; x + w
    in_y = y &lt; point_y &lt; y + h
    return in_x and in_y
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

4.游戏效果

总结

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

以上就是Python实现人机中国象棋游戏的详细内容,更多关于Python中国象棋的资料请关注菜鸟教程www.piaodoo.com其它相关文章!

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号