zoukankan      html  css  js  c++  java
  • x01.xiangqi: 走动棋子

    采用 pygame 写的象棋程序,目前只完成绘制棋盘与走动棋子,还没考虑规则等问题。

    1. 代码:

    """ x01.xiangqi (c) 2019 by x01"""
    
    import os, sys, pygame 
    from pygame.locals import *
    
    BaseDir = os.path.dirname(os.path.abspath(__file__))
    ImagePath = BaseDir + '/res/'
    
    BoardWidth = 520
    BoardHeight = 576
    BoardEdge = 8
    PieceSize = 56
    
    # piece type
    King = 0
    Advisor = 1
    Bishop = 2
    Knight = 3
    Rook = 4
    Cannon = 5
    Pawn = 6
    Selected = 7
    
    # piece types
    types = [
        20, 19, 18, 17, 16, 17, 18, 19, 20, 
        0,  0,  0,  0,  0,  0,  0,  0,  0, 
        0, 21,  0,  0,  0,  0,  0, 21,  0, 
        22,  0, 22,  0, 22,  0, 22,  0, 22,
        0,  0,  0,  0,  0,  0,  0,  0,  0, 
        0,  0,  0,  0,  0,  0,  0,  0,  0, 
        14,  0, 14,  0, 14,  0, 14,  0, 14,
        0, 13,  0,  0,  0,  0,  0, 13,  0, 
        0,  0,  0,  0,  0,  0,  0,  0,  0, 
        12, 11, 10,  9,  8,  9, 10, 11, 12
    ]
    
    class Piece(object):
        def __init__(self, player, ptype, name, pos):
            self.player = player 
            self.ptype = ptype 
            self.name = name 
            self.pos = pos 
    
    pieces = [
        # black
        Piece(0, King, "bk.bmp", (4,0)), 
        Piece(0, Advisor, "ba.bmp", (3,0)),Piece(0, Advisor, "ba.bmp", (5,0)), 
        Piece(0, Bishop, "bb.bmp", (2,0)), Piece(0, Bishop, "bb.bmp", (6,0)),
        Piece(0, Knight, "bn.bmp", (1,0)), Piece(0, Knight, "bn.bmp", (7,0)),
        Piece(0, Rook, "br.bmp", (0,0)), Piece(0, Rook, "br.bmp", (8,0)),
        Piece(0, Cannon, "bc.bmp", (1,2)), Piece(0, Cannon, "bc.bmp", (7,2)), 
        Piece(0, Pawn, "bp.bmp", (0,3)), Piece(0, Pawn, "bp.bmp", (2,3)),
        Piece(0, Pawn, "bp.bmp", (4,3)),Piece(0, Pawn, "bp.bmp", (6,3)),Piece(0, Pawn, "bp.bmp", (8,3)),
        
        # red
        Piece(1, King, "rk.bmp", (4,9)), 
        Piece(1, Advisor, "ra.bmp", (3,9)),Piece(1, Advisor, "ra.bmp", (5,9)), 
        Piece(1, Bishop, "rb.bmp", (2,9)), Piece(1, Bishop, "rb.bmp", (6,9)),
        Piece(1, Knight, "rn.bmp", (1,9)), Piece(1, Knight, "rn.bmp", (7,9)),
        Piece(1, Rook, "rr.bmp", (0,9)), Piece(1, Rook, "rr.bmp", (8,9)),
        Piece(1, Cannon, "rc.bmp", (1,7)), Piece(1, Cannon, "rc.bmp", (7,7)), 
        Piece(1, Pawn, "rp.bmp", (0,6)), Piece(1, Pawn, "rp.bmp", (2,6)),
        Piece(1, Pawn, "rp.bmp", (4,6)),Piece(1, Pawn, "rp.bmp", (6,6)),Piece(1, Pawn, "rp.bmp", (8,6)),
    
        # selected
        Piece(2, Selected, 'selected.bmp', (0,0))
    ]
    
    # type index
    def index(pos):
        col,row = pos[0], pos[1]
        return row * 9 + col
    
    def draw(surface, name, xy, ispiece=True):
        img = pygame.image.load(ImagePath + name).convert()
        if ispiece:
            img.set_colorkey((0,255,0))
        surface.blit(img, xy)
    
    def draw_pieces(surface):
        for p in pieces[:-1]:
            x = p.pos[0] * PieceSize + BoardEdge
            y = p.pos[1] * PieceSize + BoardEdge
            draw(surface, p.name, (x,y))
    
    def run():
        pygame.init()
        screen = pygame.display.set_mode((BoardWidth, BoardHeight),0,32)
        pygame.display.set_caption('x01.xiangqi')
        draw(screen, 'board.bmp', (0,0), False)
        draw_pieces(screen)
        
        prevPiece = None 
        player = 1
        clock = pygame.time.Clock()
        while True:
            for event in pygame.event.get():
                if event.type == QUIT:
                    sys.exit()
                if event.type == KEYDOWN:
                    if event.key == K_ESCAPE:
                        sys.exit()
                if event.type == MOUSEBUTTONDOWN:
                    x,y = pygame.mouse.get_pos()
                    x,y = ((x // PieceSize) * PieceSize + BoardEdge, (y//PieceSize)*PieceSize + BoardEdge)
                    pos = (x//PieceSize, y//PieceSize)
                    
                    draw(screen,'board.bmp',(0,0),False)
                    draw_pieces(screen)    
                    pieces[-1].pos = pos
                    draw(screen, pieces[-1].name, (x,y))
    
                    for p in pieces[:-1]:
                        if p.pos == pos:
                            prevPiece = p
                            break
                    
                    if types[index(pos)] == 0 and prevPiece != None:
                        if player != prevPiece.player:
                            continue
                        player = 1 - player
                        if prevPiece.player == 0:
                            types[index(pos)] = prevPiece.ptype + 16
                        elif prevPiece.player == 1:
                            types[index(pos)] = prevPiece.ptype + 8
                        types[index(prevPiece.pos)] = 0
                        for p in pieces[:-1]:
                            if p.pos == prevPiece.pos:
                                p.pos = pos 
                                break
                        prevPiece = None 
                        
                        draw(screen,'board.bmp',(0,0),False)
                        draw_pieces(screen)        
                        draw(screen, pieces[-1].name, (x,y))
    
            clock.tick(40)
            pygame.display.update()
            
    
    if __name__ == '__main__':
        run()
    main.py

    2. 效果图:

                      

    3. 下载链接:(x01.lab => py => xiangqi)

    x01.xiangqi

    附: md 批量转换到 pdf 文件

      a) 需安装 pandoc, 拷贝 template.tex 到 /usr/share/pandoc/data/templates/ 目录中。

      b) 需安装中文字体。

      c) 需安装 xelatex.

      d) 代码 md2pdfs.py 及模板 template.tex 如下:

    from pathlib import Path
    import os
    
    def md2pdfs(currdir='.'):
        dir = os.path.abspath(currdir)
        files = os.listdir(dir) 
        for f in files:
            path = os.path.join(dir, f)
            if os.path.isdir(path):
                md2pdfs(path)
                dir = os.path.dirname(path)
                continue
            name = os.path.splitext(f)[0]
            ext = os.path.splitext(f)[1]
            if ext == '.md':
                mdfile = f
                pdffile = name + '.pdf'
                os.chdir(dir)
                print(os.getcwd() + '/' + f)
                cmd = "pandoc '{0}' -o '{1}' --latex-engine=xelatex -V mainfont='PingFang SC' --template=template.tex".format(mdfile, pdffile)
                os.system(cmd)
            
            
    
    if __name__ == '__main__':
        md2pdfs()
    md2pdfs.py
    documentclass[12pt]{article}
    usepackage{xeCJK}
    setCJKmainfont{SimSun}
    $if(fontfamily)$
    usepackage{$fontfamily$}
    $else$
    usepackage{lmodern}
    $endif$
    $if(linestretch)$
    usepackage{setspace}
    setstretch{$linestretch$}
    $endif$
    
    % 图片设置
    usepackage{graphicx}
    % 可以指定根目录下的image文件夹为图片文件夹
    graphicspath{{image/}}
    
    % 页面设置
    usepackage[a4paper]{geometry}
    geometry{
        left=2.54cm,
        right=2.54cm,
        top=3.18cm,
        bottom=3.18cm,
        footskip=1.48cm,
        headsep=.5cm,
        headheight=1.5cm
    }
    
    usepackage{amssymb,amsmath}
    usepackage{ifxetex,ifluatex}
    usepackage{fixltx2e} % provides 	extsubscript
    ifnum 0ifxetex 1fiifluatex 1fi=0 % if pdftex
      usepackage[T1]{fontenc}
      usepackage[utf8]{inputenc}
    $if(euro)$
      usepackage{eurosym}
    $endif$
    else % if luatex or xelatex
      ifxetex
        usepackage{xltxtra,xunicode}
      else
        usepackage{fontspec}
      fi
      defaultfontfeatures{Mapping=tex-text,Scale=MatchLowercase}
      
    ewcommand{euro}{€}
    
    % $if(mainfont)$
    %     setmainfont{$mainfont$}
    % $endif$
    % $if(sansfont)$
    %     setsansfont{$sansfont$}
    % $endif$
    % $if(monofont)$
    %     setmonofont[Mapping=tex-ansi]{$monofont$}
    % $endif$
    % $if(CJKmainfont)$
    %     usepackage{xeCJK}
    %     setCJKmainfont[$CJKoptions$]{$CJKmainfont$}
    % $endif$
    
    
    % 字体的设置,可以自行修改
    % usepackage{xeCJK}
    % 【推荐】第一种设置
    % XeLaTeX在编译时会自动选择思源宋体的bold部分
    % 不设置monofont,因为有些字符在其他指定字符的出现变形,不如默认字体美观
    % setCJKmainfont{思源宋体 CN}
    % setCJKsansfont{思源黑体 CN}
    % setmainfont{思源宋体 CN}
    % setsansfont{思源黑体 CN}
    % 【列示】第二种设置
    % setCJKmainfont{思源宋体}[BoldFont = 思源黑体 Regular]
    %setCJKmonofont{思源黑体 Light}
    % setCJKsansfont{思源黑体 Regular}
    % setmainfont{IBM Plex Serif}
    % setmonofont{IBM Plex Mono}
    % setsansfont{IBM Plex Sans}
    
    
    fi
    % use upquote if available, for straight quotes in verbatim environments
    IfFileExists{upquote.sty}{usepackage{upquote}}{}
    % use microtype if available
    IfFileExists{microtype.sty}{%
    usepackage{microtype}
    UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts
    }{}
    
    ifxetex
      usepackage[setpagesize=false, % page size defined by xetex
                  unicode=false, % unicode breaks when used with xetex
                  xetex]{hyperref}
    else
      usepackage[unicode=true]{hyperref}
    fi
    usepackage[usenames,dvipsnames]{color}
    hypersetup{breaklinks=true,
                bookmarks=true,
                pdfauthor={$author-meta$},
                pdftitle={$title-meta$},
                colorlinks=true,
                citecolor=$if(citecolor)$$citecolor$$else$blue$endif$,
                urlcolor=$if(urlcolor)$$urlcolor$$else$blue$endif$,
                linkcolor=$if(linkcolor)$$linkcolor$$else$magenta$endif$,
                pdfborder={0 0 0}}
    urlstyle{same}  % don't use monospace font for urls
    $if(lang)$
    ifxetex
      usepackage{polyglossia}
      setmainlanguage{$mainlang$}
      setotherlanguages{$for(otherlang)$$otherlang$$sep$,$endfor$}
    else
      usepackage[shorthands=off,$lang$]{babel}
    fi
    $endif$
    $if(natbib)$
    usepackage{natbib}
    ibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$}
    $endif$
    $if(biblatex)$
    usepackage{biblatex}
    $for(bibliography)$
    addbibresource{$bibliography$}
    $endfor$
    $endif$
    $if(listings)$
    usepackage{listings}
    $endif$
    $if(lhs)$
    lstnewenvironment{code}{lstset{language=Haskell,basicstyle=small	tfamily}}{}
    $endif$
    $if(highlighting-macros)$
    $highlighting-macros$
    $endif$
    $if(verbatim-in-note)$
    usepackage{fancyvrb}
    VerbatimFootnotes
    $endif$
    $if(tables)$
    usepackage{longtable,booktabs}
    $endif$
    $if(graphics)$
    usepackage{graphicx,grffile}
    makeatletter
    defmaxwidth{ifdimGin@nat@width>linewidthlinewidthelseGin@nat@widthfi}
    defmaxheight{ifdimGin@nat@height>	extheight	extheightelseGin@nat@heightfi}
    makeatother
    % Scale images if necessary, so that they will not overflow the page
    % margins by default, and it is still possible to overwrite the defaults
    % using explicit options in includegraphics[width, height, ...]{}
    setkeys{Gin}{width=maxwidth,height=maxheight,keepaspectratio}
    $endif$
    $if(links-as-notes)$
    % Make links footnotes instead of hotlinks:
    
    enewcommand{href}[2]{#2footnote{url{#1}}}
    $endif$
    $if(strikeout)$
    usepackage[normalem]{ulem}
    % avoid problems with sout in headers with hyperref:
    pdfstringdefDisableCommands{
    enewcommand{sout}{}}
    $endif$
    setlength{emergencystretch}{3em}  % prevent overfull lines
    providecommand{	ightlist}{%
      setlength{itemsep}{0pt}setlength{parskip}{0pt}}
    $if(numbersections)$
    setcounter{secnumdepth}{5}
    $else$
    setcounter{secnumdepth}{0}
    $endif$
    $if(verbatim-in-note)$
    VerbatimFootnotes % allows verbatim text in footnotes
    $endif$
    
    $if(title)$
    	itle{fseries huge $title$$if(subtitle)$\vspace{0.5cm}{Large  $subtitle$}$endif$}
    $endif$
    $if(author)$
    author{LARGE $for(author)$$author$$sep$ and $endfor$}
    $endif$
    date{{large 	oday}}
    $for(header-includes)$
    $header-includes$
    $endfor$
    
    % Redefines (sub)paragraphs to behave more like sections
    ifxparagraphundefinedelse
    letoldparagraphparagraph
    
    enewcommand{paragraph}[1]{oldparagraph{#1}mbox{}}
    fi
    ifxsubparagraphundefinedelse
    letoldsubparagraphsubparagraph
    
    enewcommand{subparagraph}[1]{oldsubparagraph{#1}mbox{}}
    fi
    
    egin{document}
    $if(title)$
    maketitle
    $endif$
    $if(abstract)$
    egin{abstract}
    $abstract$
    end{abstract}
    $endif$
    
    $for(include-before)$
    $include-before$
    
    $endfor$
    $if(toc)$
    {
    setcounter{tocdepth}{$toc-depth$}
    	ableofcontents
    }
    $endif$
    $if(lot)$
    listoftables
    $endif$
    $if(lof)$
    listoffigures
    $endif$
    $body$
    
    $if(natbib)$
    $if(bibliography)$
    $if(biblio-title)$
    $if(book-class)$
    
    enewcommandibname{$biblio-title$}
    $else$
    
    enewcommand
    efname{$biblio-title$}
    $endif$
    $endif$
    ibliography{$for(bibliography)$$bibliography$$sep$,$endfor$}
    
    $endif$
    $endif$
    $if(biblatex)$
    printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$
    
    $endif$
    $for(include-after)$
    $include-after$
    
    $endfor$
    end{document}
    template.tex

     e) 合并 pdf 代码 merge_pdf.py 如下:

    # merge_pdf.py
    # usage: 
    #   复制到目标目录,由终端进入,运行 "python3 merge_pdf.py" 命令即可。
    
    import os
    from PyPDF2 import PdfFileReader, PdfFileWriter
    
    filenames = []
    outfile = '../temp.pdf'
    
    def getfiles(curr_dir='.', ext='.pdf'):
        global filenames
        dir = os.path.abspath(curr_dir)
        files = os.listdir(dir)
        for f in files:
            path = os.path.join(dir,f)
            if os.path.isdir(path):
                getfiles(path, ext)
                continue
            extname = os.path.splitext(f)[1]
            if ext == extname:
                filenames.append(os.path.join(dir,f))
    
    def merge():
        getfiles()
        filenames.sort()
        writer = PdfFileWriter()
        pages = 0
        for f in filenames:
            print(f)
            reader = PdfFileReader(open(f, 'rb'))
            count = reader.getNumPages()
            pages += count
            for i in range(count):
                writer.addPage(reader.getPage(i))
            writer.addBookmark(os.path.basename(f)[:-3],pages - count)
        stream = open(outfile, 'wb')
        writer.write(stream)
        stream.close()
        print("OK!")
    
    def test(dir='.'):
        dirs = os.listdir(dir)
        for f in dirs:
            if os.path.isdir(f):
                test(f)
                continue
            print(f)
    
    if __name__ == '__main__':
        filenames.clear()
        merge()
    merge_pdf.py

     又:github 上的 python-100 项目转换后的下载链接:  py100days.pdf

  • 相关阅读:
    Python学习心得第二周-作业
    Python学习心得第二周-02 字符串、列表、元组、字典
    Python学习心得第二周-01 数字类型
    eclipse 性能调优之内存分配
    Spring 面试
    技巧 linux 如何显示一个文件的某几行(中间几行)
    命令 scp
    机器学习遇到的好的资料
    maven 使用记录
    “冷启动”问题浅析
  • 原文地址:https://www.cnblogs.com/china_x01/p/10805112.html
Copyright © 2011-2022 走看看