当前位置:   article > 正文

[python游戏开发]用Python代码制作中国象棋游戏,适合新手小白练手

[python游戏开发]用Python代码制作中国象棋游戏,适合新手小白练手

Pygame 做的中国象棋,一直以来喜欢下象棋,写了 python 就拿来做一个试试,水平有限,希望源码能帮助大家更好的学习 python。总共分为四个文件,chinachess.py 为主文件,constants.py 数据常量,pieces.py 棋子类,走法,computer.py 电脑走法计算。 源码:在这里插入图片描述

在这里插入图片描述

chinachess.py 为主文件

import pygame
import time
import constants
import pieces
import 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("天青-中国象棋")
        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()
  • 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

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

pieces.py 棋子类,走法,

import pygame
import 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
  • 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
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272

computer.py 电脑走法计算

import constants
#import time
from 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
  • 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

源码在下方获取

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/914808
推荐阅读
相关标签
  

闽ICP备14008679号