返回顶部
首页 > 资讯 > 后端开发 > Python >x01.xiangqi: 走动棋子
  • 496
分享到

x01.xiangqi: 走动棋子

棋子xiangqi 2023-01-31 00:01:44 496人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

采用 pygame 写的象棋程序,目前只完成绘制棋盘与走动棋子,还没考虑规则等问题。 1. 代码: """ x01.xiangqi (c) 2019 by x01""" import os, sys, pygame from p

采用 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 \textsubscript
\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=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}
  \newcommand{\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}
\bibliographystyle{$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\ttfamily}}{}
$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
\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi}
\def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi}
\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:
\renewcommand{\href}[2]{#2\footnote{\url{#1}}}
$endif$
$if(strikeout)$
\usepackage[normalem]{ulem}
% avoid problems with \sout in headers with hyperref:
\pdfstringdefDisableCommands{\renewcommand{\sout}{}}
$endif$
\setlength{\emergencystretch}{3em}  % prevent overfull lines
\providecommand{\tightlist}{%
  \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)$
\title{\bfseries \huge $title$$if(subtitle)$\\\vspace{0.5cm}{\Large  $subtitle$}$endif$}
$endif$
$if(author)$
\author{\LARGE $for(author)$$author$$sep$ \and $endfor$}
$endif$
\date{{\large \today}}
$for(header-includes)$
$header-includes$
$endfor$

% Redefines (sub)paragraphs to behave more like sections
\ifx\paragraph\undefined\else
\let\oldparagraph\paragraph
\renewcommand{\paragraph}[1]{\oldparagraph{#1}\mbox{}}
\fi
\ifx\subparagraph\undefined\else
\let\oldsubparagraph\subparagraph
\renewcommand{\subparagraph}[1]{\oldsubparagraph{#1}\mbox{}}
\fi

\begin{document}
$if(title)$
\maketitle
$endif$
$if(abstract)$
\begin{abstract}
$abstract$
\end{abstract}
$endif$

$for(include-before)$
$include-before$

$endfor$
$if(toc)$
{
\setcounter{tocdepth}{$toc-depth$}
\tableofcontents
}
$endif$
$if(lot)$
\listoftables
$endif$
$if(lof)$
\listoffigures
$endif$
$body$

$if(natbib)$
$if(bibliography)$
$if(biblio-title)$
$if(book-class)$
\renewcommand\bibname{$biblio-title$}
$else$
\renewcommand\refname{$biblio-title$}
$endif$
$endif$
\bibliography{$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

--结束END--

本文标题: x01.xiangqi: 走动棋子

本文链接: https://lsjlt.com/news/182199.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • x01.xiangqi: 走动棋子
    采用 pygame 写的象棋程序,目前只完成绘制棋盘与走动棋子,还没考虑规则等问题。 1. 代码: """ x01.xiangqi (c) 2019 by x01""" import os, sys, pygame from p...
    99+
    2023-01-31
    棋子 xiangqi
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作