Python实现人机中国象棋游戏

作者:顾木子吖 时间:2023-01-28 21:33:52 

导语

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

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

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

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

早前曾有统计,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实现人机中国象棋游戏

来源:https://blog.csdn.net/weixin_55822277/article/details/120795609

标签:Python,人机,中国象棋
0
投稿

猜你喜欢

  • python 包之 re 正则匹配教程分享

    2021-10-15 18:36:41
  • 通过Python实现控制手机详解

    2021-04-21 12:10:37
  • Python下opencv图像阈值处理的使用笔记

    2023-08-24 21:28:27
  • 使用requests库制作Python爬虫

    2023-08-17 21:43:23
  • 中文用户名的js检验正则

    2022-03-26 03:19:32
  • 解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...

    2023-03-06 19:48:57
  • python encode和decode的妙用

    2021-01-08 01:34:20
  • Python logging设置和logger解析

    2021-07-15 22:12:52
  • jupyter lab文件导出/下载方式

    2021-01-28 12:34:46
  • JavaScript输入邮箱自动提示实例代码

    2024-02-27 03:01:43
  • Python装饰器中@property使用详解

    2022-04-22 04:46:44
  • Python爬取商家联系电话以及各种数据的方法

    2023-07-24 18:39:38
  • pytorch加载自定义网络权重的实现

    2022-06-16 14:39:10
  • mysql存储过程学习总结

    2011-07-04 12:03:53
  • python3利用venv配置虚拟环境及过程中的小问题小结

    2023-04-29 06:01:28
  • python读文件保存到字典,修改字典并写入新文件的实例

    2021-09-19 05:37:57
  • Python混合使用同步和异步函数的方法

    2021-07-19 05:01:05
  • 用python编写一个图片拼接工具

    2023-09-01 18:31:52
  • Python使用pandas对数据进行差分运算的方法

    2021-09-28 06:56:07
  • Python编程使用Selenium模拟淘宝登录实现过程

    2023-08-29 00:56:53
  • asp之家 网络编程 m.aspxhome.com