搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

Python开发中国象棋实战(附源码)

[复制链接]
查看: 49|回复: 0

1万

主题

1万

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
45261
发表于 2020-2-14 19:47 | 显示全部楼层 |阅读模式
Pygame 做的中国象棋,不停以来喜煌B象棋,写了 python 就拿来做一个试试,水平有限,电脑走法水平低,需要鄙人次版本中更新电脑走法,渴望源码能帮助大家更好的进修 python。总共分为四个文件,chinachess.py 为主文件,constants.py 数据常量,pieces.py 棋子类,走法,computer.py 电脑走法盘算。
PS:此外很多人在进修Python的进程中,凡是由于遇题目打点不了大要没好的教程从而致使自己放弃,为此我整理啦从底子的python剧本到web斥地、爬虫、django、数据挖掘等【PDF等】需要的可以进Python全栈斥地交换.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面有最新Python教程项目可拿,不懂的题目有老司机打点哦,一路相互监视配合进步
Python开发中国象棋实战(附源码)  热点新闻
  
chinachess.py 为主文件
  1. import pygameimport timeimport constantsimport piecesimport computerclass 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()
复制代码
constants.py 数据常量
  1. import pygameSCREEN_WIDTH=900SCREEN_HEIGHT=650Start_X = 50Start_Y = 50Line_Span = 60player1Color = 1player2Color = 2overColor = 3BG_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 = 0pieces_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"),}
复制代码
pieces.py 棋子类,走法,
  1. import pygameimport constantsclass  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  Noneclass 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 scoreclass 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 scoreclass 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 =5 or self.y >=5 and moveto_y  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 scoreclass 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 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 scoreclass 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 scoreclass 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 scoreclass 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  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
复制代码
以上就是蔽肪粗享,此外很多人在进修Python的进程中,凡是由于遇题目打点不了大要没好的教程从而致使自己放弃,为此我整理啦从底子的python剧本到web斥地、爬虫、django、数据挖掘等【PDF等】需要的可以进Python全栈斥地交换.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面有最新Python教程项目可拿,不懂的题目有老司机打点哦,一路相互监视配合进步本文的翰墨及图片根源于收集加上自己的想法,仅供进修、交换操纵,不具有任何贸易用处,版权归原作者全数,若有题目请实时联系我们以作处置惩罚。

免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 全椒百姓网-全椒知名**,发布及时新鲜的全椒新闻资讯 生活信息 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表