123456790 发表于 2022-3-26 11:02:11

Python实现人机中国象棋游戏

目录


[*]导语
[*]1.游戏规则&基本玩法

[*]1.1 基本玩法
[*]1.2 行棋规则

[*]2.素材文件
[*]3.主要代码

[*]3.1 Chinachess.py 为主文件
[*]3.2 Constants.py 数据常量
[*]3.3 Pieces.py 棋子类,走法
[*]3.4 Computer.py 电脑走法计算
[*]3.5 Button.py按钮定义

[*]4.游戏效果
[*]总结

导语

哈喽!哈喽!我是木木子!今日游戏更新——中国象棋上线啦!
中国象棋是一种古老的棋类游戏,大约有两千年的历史。
是中华文明非物质文化经典产物,艺术价值泛属于整个人类文明进化史的一个分枝。
在中国,可以随处在大街上、小公园儿里等地方经常看到一堆人围在一起下棋,这就足以说明中国象棋的流行性以及普遍性有多高!
早前曾有统计,14、15个中国人当中,就有1个会下中国象棋。中国象棋的受众,可能数以亿计!
今天教大家制作一款中国象棋and想学象棋的话也可以来看看当作新手村吧~

1.游戏规则&基本玩法


1.1 基本玩法

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

1.2 行棋规则



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()
      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, , , 1)
            else:
                pygame.draw.line(MainGame.window, constants.BLACK, , , 1)
                pygame.draw.line(MainGame.window, constants.BLACK, , , 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, , , 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, , , 1)
      pygame.draw.line(MainGame.window, constants.BLACK, ,
                         , 1)
      pygame.draw.line(MainGame.window, constants.BLACK, ,
                         , 1)
      pygame.draw.line(MainGame.window, constants.BLACK, ,
                         , 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
                mouse_y = pos
                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
            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


    def PiecesMove(self,pieces,x , y):
      for item inMainGame.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 and item.y == computermove:
                  piecemove= item


            self.PiecesMove(piecemove, computermove, computermove)
            MainGame.Putdownflag = MainGame.player1Color


    #判断游戏胜利
    def VictoryOrDefeat(self):
      txt =""
      result =
      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 == 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


classPieces():
    def __init__(self, player,x, y):
      self.imagskey = self.getImagekey()
      self.image = constants.pieces_images
      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):
      returnNone


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 ==self.player :
            returnFalse
      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 !=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 != 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 == 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 == 0:
                return True
      if abs(move_x) == 2 and abs(move_y) == 1:
            step = 1 if move_x >0 else -1
            if arr ==0 :
                returnTrue


    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 == self.player:
            return False
      if self.y <=4 and moveto_y >=5 or self.y >=5 and moveto_y <=4:
            returnFalse
      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 == 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 == 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 == 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 == 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 != 0:
                  if overflag:
                        return False
                  else:
                        overflag = True


            if overflag and arr == 0:
                return False
            if not overflag and arr != 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 != 0:
                  if overflag:
                        return False
                  else:
                        overflag = True


            if overflag and arr == 0:
                return False
            if not overflag and arr != 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 == self.player:
            return False
      move_x = moveto_x - self.x
      move_y = moveto_y - self.y


      if self.player == constants.player1Color:
            if self.y > 4and move_x != 0 :
                returnFalse
            if move_y > 0:
                returnFalse
      elif self.player == constants.player2Color:
            if self.y <= 4and move_x != 0 :
                returnFalse
            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 = [ 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 = constants.player1Color
            elif len(list(filter(lambda cm: cm.x == i and cm.y == j and cm.player == constants.player2Color,
                                 piecesList))):
                arr = 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 .x,pieces.y, pieces, pieces]


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)
                        elifitemafter.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(, nextpiecesbest, nextpiecesbest])
                  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()
                        else:
                            listMoveEnabel.append()
                  #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, reverse=True)
    piecesbest = list_scorepalyer1
    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中国象棋的资料请关注脚本之家其它相关文章!
                                                      
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Python实现人机中国象棋游戏