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)
附: 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
x01.xiangqi: 走动棋子的更多相关文章
- x01.Weiqi.12: 定式布局
定式 下一步当将定式保存到数据库中,如布局中的代码所示,但其初始的代码更有利于理解.以小飞挂为例: // 0 // + 0 0 // + // // + List<Pos> P_LuSta ...
- x01.Weiqi.7: 调整重绘
GitHub 谁方便谁拍,谁重要拍谁.在这个砖头满天飞的时代,一个好的生态显得尤为重要. 红颜小头发,要的很简单. 也许成绝唱,只因鱼断肠. 姚贝福娃的离去,除感叹人生无常外,活着做点有意义的事情, ...
- HDU 4121 Xiangqi 我老了?
Xiangqi Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- HDU 4121 Xiangqi 模拟题
Xiangqi Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4121 ...
- JavaScript中国象棋程序(2) - 校验棋子走法
"JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.这是教程的第2节. 这一系列共有9个部分: 0.JavaScript中国象 ...
- Uva - 1589 - Xiangqi
Xiangqi is one of the most popular two-player board games in China. The game represents a battle bet ...
- Xiangqi(简单模拟)
4746: Xiangqi 时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte 总提交: 15 测试通过:2 描述 Xiangqi i ...
- x01.Tetris: 俄罗斯方块
最强大脑有个小孩玩俄罗斯方块游戏神乎其技,那么,就写一个吧,玩玩而已. 由于逻辑简单,又作了一些简化,所以代码并不多. using System; using System.Collections.G ...
- x01.MagicCube: 简单操作
看最强大脑,发现魔方还是比较好玩的,便买了一个,对照七步还原法,居然也能成功还原. 为什么不写一个魔方程序呢?在网上找了找,略作修改,进行简单操作,还是不错的,其操作代码如下: protected o ...
随机推荐
- Maven的学习资料收集--(九) 构建SSH项目以及专栏maven
在这里整合一下,使用Maven构建一个SSH项目 1.新建一个Web项目 可以参照前面的博客 2.添加依赖,修改pom.xml <project xmlns="http://maven ...
- rabbit的简单搭建,java使用rabbitmq queue的简单例子和一些坑
一 整合 由于本人的码云太多太乱了,于是决定一个一个的整合到一个springboot项目里面. 附上自己的项目地址https://github.com/247292980/spring-boot 以整 ...
- mac下远程win8.1时提示"桌面连接无法验证您希望连接的计算机的身份"的解决办法
在os x下使用远程桌面到win8.1,总出现“远程桌面连接无法验证您希望连接的计算机的身份”的提示. 解决方法:1.网上各种解释,包括防火墙是否打开,是否去掉“仅允许运行使用网络级别身份验证的远程计 ...
- 自动布局库--Masonry使用
参考资料(戳这里): > Masonry官网 > Masonry介绍与使用实践(快速上手Autolayout) > iOS 开发实践之 Auto Layout > Ma ...
- synchronized重入后抛出异常,锁释放了吗
synchronized: 用于同步方法或者代码块,使得多个线程在试图并发执行同一个代码块的时候,串行地执行.以达到线程安全的目的. 允许重入: 在多线程的时候是这样的,但是对于单线程,是允许重入的, ...
- juypter-notebook安装配置
juypter-notebook安装配置 Table of Contents 1. jupyter notebook概述 2. jupyter notebook安装 3. 在jupyter noteb ...
- js为页面元素添加水印
近期有需求为页面部分区域添加上水印,通过在网上找到了js为页面添加水印的方法,后来经过自己的改进,可以实现为页面部分元素添加水印,最终效果如下图: 代码如下: function watermark(s ...
- FreeMarker基本语法的使用
参考博客: http://www.cnblogs.com/panchanggui/p/9346574.html https://blog.csdn.net/zyy88886666/article/de ...
- Markdown引用图片,且不使用网上链接的解决方法
首先介绍下markdown使用图片的3种方法 使用本地图片,缺点是要用到本地的绝对路径,不适合对文档做迁移,否则会有图片链接失效的情况 ![thisisimage](C:\\Users\\Goose\ ...
- JS案例练习 — 给div添加样式选择功能
附加效果图: CSS内容: <style> ; padding:0px} li{list-style:none} body{font:24px 'Microsoft YaHei'; col ...