[深度学习]实现一个博弈型的AI,从五子棋开始(2)

<div class="iteye-blog-content-contain" style="font-size: 14px"><p>&lt;div id="cnblogs_post_body"&gt;</p>
<p>&nbsp;&lt;p&gt;嗯,今天接着来搞五子棋,从五子棋开始给小伙伴们聊AI。&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;昨天晚上我们已经实现了一个五子棋的逻辑部分,其实讲道理,有个规则在,可以开始搞AI了,但是考虑到不够直观,我们还是顺带先把五子棋的UI也先搞出来。所以今天咱们搞UI。&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;逻辑部分在这里:&lt;a href="http://www.cnblogs.com/erwin/p/7828956.html" target="_blank"&gt;[深度学习]实现一个博弈型的AI,从五子棋开始(1)&lt;/a&gt;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;小伙伴:啥?再次省去吐槽一万字,说好的讲深度学习在哪儿,说好的强化学习在哪儿,今天又是五子棋&hellip;&hellip;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;我:是五子棋,AI不能缺场景啊,没有场景谈AI就是空谈,是得先有个棋啊。再说了,虽说之前搞了个逻辑,至少搞个界面出来测一下嘛,万一场景的逻辑都没对,还AI个锤子!&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;老罗:又关我什么事?&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;好了,不扯了,回正题,我们一开始设计就是逻辑和UI分离,上一篇我们实现了逻辑部分,今天来实现UI部分,给咱的五子棋搞个UI。&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;(2)五子棋下棋UI的实现&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;Python做五子棋UI的话,咱们这里就用 PyGame&amp;nbsp;来搞,当然也有别的库,说老实话Python做UI我真没搞过多少,PyGame&amp;nbsp;的基础用法和各种知识我就不展开了,毕竟这不是重点,有兴趣的小伙伴可以自行Google,我也是边学边用呢,哈哈!&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;既然是做UI,得有素材,我在网上找了一个棋盘:&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&lt;img src="http://images2017.cnblogs.com/blog/17518/201711/17518-20171114210832952-1927177064.jpg" alt="" /&gt;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;以及黑白两颗棋子:&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&lt;img src="http://images2017.cnblogs.com/blog/17518/201711/17518-20171114210907343-344724676.png" alt="" /&gt;&amp;nbsp;&lt;img src="http://images2017.cnblogs.com/blog/17518/201711/17518-20171114210919499-261841834.png" alt="" /&gt;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;PS:为了UI上面好看,棋子因为是圆形的,最好是处理成PNG格式,带Alpha通道,外面透明。另外这几张图不知道上传了会不会被压缩成别的格式,我打了个包放在文章末尾了。&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;在咱们之前的工程里建个目录&ldquo;UI&rdquo;,棋盘取名&amp;nbsp;chessboard.jpg 放在目录下,两颗棋子分别取名&amp;nbsp;piece_black.png、piece_white.png 也放到目录下。&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;看看属性,棋盘是540*540像素的,棋子是32*32像素,数字记下来,然后咱们找的这个棋盘是有边缘的,量一下,边缘离第一根线大约是22像素。要做render,得用到这些数字。&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;横竖各15根线这个不用说,15根线中间有14个格子,所以线和线的距离是总宽度减去两个边缘再除以格子数: (540 - 22 * 2) / 14 貌似除不尽,那就先这样子。&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;好了,建一个文件 render.py ,咱们先把刚刚那些数字放进去,顺便该import的也import了,比如pygame、比如咱们昨天的定义和昨天的五棋子逻辑:&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;div class="cnblogs_code"&gt;&nbsp;</p>
<p>&nbsp; &lt;pre&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;coding:utf-8&lt;/span&gt;</p>
<p>&nbsp;</p>
<p>&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt; pygame</p>
<p>&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; pygame.locals &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; *</p>
<p>&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; consts &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; *</p>
<p>&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; gobang &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt; GoBang</p>
<p>&nbsp;</p>
<p>&lt;/span&gt;&lt;span style="color: #008000;"&gt;#IMAGE_PATH&lt;/span&gt;&lt;span style="color: #008000;"&gt; = '/Users/phantom/Projects/AI/gobang/UI/'&lt;/span&gt;</p>
<p>IMAGE_PATH = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;UI/&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;</p>
<p>&nbsp;</p>
<p>WIDTH &lt;/span&gt;= 540&lt;span style="color: #000000;"&gt;</p>
<p>HEIGHT &lt;/span&gt;= 540&lt;span style="color: #000000;"&gt;</p>
<p>MARGIN &lt;/span&gt;= 22&lt;span style="color: #000000;"&gt;</p>
<p>GRID &lt;/span&gt;= (WIDTH - 2 * MARGIN) / (N - 1&lt;span style="color: #000000;"&gt;)</p>
<p>PIECE &lt;/span&gt;= 32&lt;/pre&gt;&nbsp;</p>
<p>&nbsp;&lt;/div&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;然后我们定义一个新的类,GameRender,render初始化的时候我们绑定一个逻辑类,然后初始化pygame,把窗体大小设置一下,该加载的资源先加载了,代码比较简单,没有什么为什么,pygame就是这么用的,pygame有兴趣的小伙伴自己Google。&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;render我们仍然考虑定义了一个current表示当前步,黑棋先下,所以current定义成黑色。&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;div class="cnblogs_code"&gt;&nbsp;</p>
<p>&nbsp; &lt;pre&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; GameRender(object):</p>
<p>&nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;def&lt;/span&gt; &lt;span style="color: #800080;"&gt;__init__&lt;/span&gt;&lt;span style="color: #000000;"&gt;(self, gobang):</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 绑定逻辑类&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; self.&lt;span style="color: #800080;"&gt;__gobang&lt;/span&gt; =&lt;span style="color: #000000;"&gt; gobang</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 黑棋开局&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; self.&lt;span style="color: #800080;"&gt;__currentPieceState&lt;/span&gt; =&lt;span style="color: #000000;"&gt; ChessboardState.BLACK</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 初始化 pygame&lt;/span&gt;</p>
<p>&lt;span style="color: #000000;"&gt;&nbsp; &nbsp; &nbsp; &nbsp; pygame.init()</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; pygame.display.set_mode((width, height), flags, depth) &lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; self.&lt;span style="color: #800080;"&gt;__screen&lt;/span&gt; = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32&lt;span style="color: #000000;"&gt;)</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; pygame.display.set_caption(&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;五子棋AI&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; UI 资源&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; self.&lt;span style="color: #800080;"&gt;__ui_chessboard&lt;/span&gt; = pygame.image.load(IMAGE_PATH + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;chessboard.jpg&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;).convert()</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__ui_piece_black&lt;/span&gt; = pygame.image.load(IMAGE_PATH + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;piece_black.png&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;).convert_alpha()</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__ui_piece_white&lt;/span&gt; = pygame.image.load(IMAGE_PATH + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;piece_white.png&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;).convert_alpha()&lt;/pre&gt;&nbsp;</p>
<p>&nbsp;&lt;/div&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;render类嘛,各种draw了,对不对,确实是。不过这里有一个问题。&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;之前的逻辑类里我们定义了一个二维数组chessMap还记得吗?看看逻辑类GoBang的定义:&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;div class="cnblogs_code"&gt;&nbsp;</p>
<p>&nbsp; &lt;pre&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; GoBang(object):</p>
<p>&nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;def&lt;/span&gt; &lt;span style="color: #800080;"&gt;__init__&lt;/span&gt;&lt;span style="color: #000000;"&gt;(self):</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__chessMap&lt;/span&gt; = [[ChessboardState.EMPTY &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; j &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; range(N)] &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; i &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; range(N)]</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__currentI&lt;/span&gt; = -1&lt;span style="color: #000000;"&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__currentJ&lt;/span&gt; = -1&lt;span style="color: #000000;"&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__currentState&lt;/span&gt; = ChessboardState.EMPTY&lt;/pre&gt;&nbsp;</p>
<p>&nbsp;&lt;/div&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;我们先思考一个问题,chessMap里的坐标,和咱们棋盘的坐标怎么对应呢,chessMap里 i,j 就是0到14,0到14;咱们棋盘上,render的时候,那可是按像素来的啊,棋盘可是0到540像素呢,严格的说,是540减去两个边缘,22到518像素,得先对应吧。好,做个坐标变换,把棋子下标 i,j 变成像素 x,y。从边缘开始计算,每相邻一个棋子,加一个格子的大小GRID,那如果我们的棋子要摆上去的话,要摆到棋子中间,所以 x,y 分别再减去半个棋子的大小,代码就2行,比较清晰了:&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;div class="cnblogs_code"&gt;&nbsp;</p>
<p>&nbsp; &lt;pre&gt;&nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;def&lt;/span&gt;&lt;span style="color: #000000;"&gt; coordinate_transform_map2pixel(self, i, j):&nbsp; &nbsp;&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 从 chessMap 里的逻辑坐标到 UI 上的绘制坐标的转换&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; MARGIN + j * GRID - PIECE / 2, MARGIN + i * GRID - PIECE / 2&lt;/pre&gt;&nbsp;</p>
<p>&nbsp;&lt;/div&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;好,这下我们可以从逻辑类里读状态出来绘制了,再考虑一下,坐标变换嘛,还需不需要反过来变。是,确实需要,下棋落子的时候,实际是在UI上给得到 x,y 对吧,我们得去set一下逻辑类里的状态吧,所以这时候又需要把 x,y 坐标变换成 i,j 的,怎么算就不详细展开了,相似的逻辑。&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;这里咱们偷个懒的话,前一个映射函数不是有式子了么:&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;x =&amp;nbsp;MARGIN + j * GRID - PIECE / 2&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;y =&amp;nbsp;MARGIN + i * GRID - PIECE / 2&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;做个位移,推导一下等式的两边, 把 j 用 x 来表达一下, i 用 y 来表达一下,就可以了:&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;i =&amp;nbsp;(y -&amp;nbsp;MARGIN + PIECE / 2) / GRID&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;j = (x -&amp;nbsp;MARGIN + PIECE / 2) / GRID&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;这里细心的小伙伴们发现了,i 和 j 可能不是整数哦,首先获得的坐标当然是通过鼠标来,这个本来就有偏差,不会那么刚刚好,并且GRID好像也不是整数,除一下,都不知道是多少了,OK,那咱们Round一下咯。&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;又有小伙伴说了,不是棋盘有边缘么,那个MARGIN就时刻提醒我们,有个边缘,要是我在边缘上点击,会不会出现负值,或者大于N的值。对,考虑得很好,得判断一下边界,这下应该差不多了,可以写代码了:&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;div class="cnblogs_code"&gt;&nbsp;</p>
<p>&nbsp; &lt;pre&gt;&nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;def&lt;/span&gt;&lt;span style="color: #000000;"&gt; coordinate_transform_pixel2map(self, x, y):&nbsp; &nbsp;&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 从 UI 上的绘制坐标到 chessMap 里的逻辑坐标的转换&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; i , j = int(round((y - MARGIN + PIECE / 2) / GRID)), int(round((x - MARGIN + PIECE / 2) /&lt;span style="color: #000000;"&gt; GRID))</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 有MAGIN, 排除边缘位置导致 i,j 越界&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; i &amp;lt; 0 &lt;span style="color: #0000ff;"&gt;or&lt;/span&gt; i &amp;gt;= N &lt;span style="color: #0000ff;"&gt;or&lt;/span&gt; j &amp;lt; 0 &lt;span style="color: #0000ff;"&gt;or&lt;/span&gt; j &amp;gt;=&lt;span style="color: #000000;"&gt; N:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; None, None</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; i, j&lt;/pre&gt;&nbsp;</p>
<p>&nbsp;&lt;/div&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;好了,到现在,坐标的映射也搞定了,终于可以draw、draw、draw了,好吧,那就draw,先画棋盘再画棋子,棋子是啥颜色就画啥颜色,空白的就跳过:&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;div class="cnblogs_code"&gt;&nbsp;</p>
<p>&nbsp; &lt;pre&gt;&nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;def&lt;/span&gt;&lt;span style="color: #000000;"&gt; draw_chess(self):</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 棋盘&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; self.&lt;span style="color: #800080;"&gt;__screen&lt;/span&gt;.blit(self.&lt;span style="color: #800080;"&gt;__ui_chessboard&lt;/span&gt;&lt;span style="color: #000000;"&gt;, (0,0))</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 棋子&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; i &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; range(0, N):</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; j &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; range(0, N):</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x,y &lt;/span&gt;=&lt;span style="color: #000000;"&gt; self.coordinate_transform_map2pixel(i,j)</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; state &lt;/span&gt;= self.&lt;span style="color: #800080;"&gt;__gobang&lt;/span&gt;&lt;span style="color: #000000;"&gt;.get_chessboard_state(i,j)</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; state ==&lt;span style="color: #000000;"&gt; ChessboardState.BLACK:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__screen&lt;/span&gt;.blit(self.&lt;span style="color: #800080;"&gt;__ui_piece_black&lt;/span&gt;&lt;span style="color: #000000;"&gt;, (x,y))</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;elif&lt;/span&gt; state ==&lt;span style="color: #000000;"&gt; ChessboardState.WHITE:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__screen&lt;/span&gt;.blit(self.&lt;span style="color: #800080;"&gt;__ui_piece_white&lt;/span&gt;&lt;span style="color: #000000;"&gt;, (x,y))</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;: &lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; ChessboardState.EMPTY&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;pass&lt;/span&gt;&lt;/pre&gt;&nbsp;</p>
<p>&nbsp;&lt;/div&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;为了下棋的时候体验稍微好一点呢,我们在鼠标上是不是最好也画一个棋子,这样感觉点上去就能落子,好像会好一点:&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;div class="cnblogs_code"&gt;&nbsp;</p>
<p>&nbsp; &lt;pre&gt;&nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;def&lt;/span&gt;&lt;span style="color: #000000;"&gt; draw_mouse(self):</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 鼠标的坐标&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; x, y =&lt;span style="color: #000000;"&gt; pygame.mouse.get_pos()</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 棋子跟随鼠标移动&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; self.&lt;span style="color: #800080;"&gt;__currentPieceState&lt;/span&gt; ==&lt;span style="color: #000000;"&gt; ChessboardState.BLACK:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__screen&lt;/span&gt;.blit(self.&lt;span style="color: #800080;"&gt;__ui_piece_black&lt;/span&gt;, (x - PIECE / 2, y - PIECE / 2&lt;span style="color: #000000;"&gt;))</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__screen&lt;/span&gt;.blit(self.&lt;span style="color: #800080;"&gt;__ui_piece_white&lt;/span&gt;, (x - PIECE / 2, y - PIECE / 2))&lt;/pre&gt;&nbsp;</p>
<p>&nbsp;&lt;/div&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;如果出现连续的5颗同色棋子,要显示赢棋的结果,那就再来个draw:&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;div class="cnblogs_code"&gt;&nbsp;</p>
<p>&nbsp; &lt;pre&gt;&nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;def&lt;/span&gt;&lt;span style="color: #000000;"&gt; draw_result(self, result):</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; font &lt;/span&gt;= pygame.font.Font(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;/Library/Fonts/Songti.ttc&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;, 50&lt;span style="color: #000000;"&gt;)</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; tips &lt;/span&gt;= u&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000;"&gt;本局结束:&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; result ==&lt;span style="color: #000000;"&gt; ChessboardState.BLACK :</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tips &lt;/span&gt;= tips + u&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000;"&gt;黑棋胜利&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;elif&lt;/span&gt; result ==&lt;span style="color: #000000;"&gt; ChessboardState.WHITE:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tips &lt;/span&gt;= tips + u&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000;"&gt;白棋胜利&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tips &lt;/span&gt;= tips + u&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000;"&gt;平局&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; text &lt;/span&gt;= font.render(tips, True, (255&lt;span style="color: #000000;"&gt;, 0, 0))</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__screen&lt;/span&gt;.blit(text, (WIDTH / 2 - 200, HEIGHT / 2 - 50))&lt;/pre&gt;&nbsp;</p>
<p>&nbsp;&lt;/div&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;想想还差啥?&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;对,下棋的逻辑还没做吧,鼠标点击,在棋盘上放颗棋子,我们刚刚draw棋子的时候其实是读取的逻辑类里的chessMap,那下棋的时候,去set对应的状态:&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;div class="cnblogs_code"&gt;&nbsp;</p>
<p>&nbsp; &lt;pre&gt;&nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;def&lt;/span&gt;&lt;span style="color: #000000;"&gt; one_step(self):</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; i, j &lt;/span&gt;=&lt;span style="color: #000000;"&gt; None, None</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 鼠标点击&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; mouse_button =&lt;span style="color: #000000;"&gt; pygame.mouse.get_pressed()</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 左键&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; mouse_button[0]:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x, y &lt;/span&gt;=&lt;span style="color: #000000;"&gt; pygame.mouse.get_pos()</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i, j &lt;/span&gt;=&lt;span style="color: #000000;"&gt; self.coordinate_transform_pixel2map(x, y)</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;not&lt;/span&gt; i &lt;span style="color: #0000ff;"&gt;is&lt;/span&gt; None &lt;span style="color: #0000ff;"&gt;and&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;not&lt;/span&gt; j &lt;span style="color: #0000ff;"&gt;is&lt;/span&gt;&lt;span style="color: #000000;"&gt; None:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 格子上已经有棋子&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; self.&lt;span style="color: #800080;"&gt;__gobang&lt;/span&gt;.get_chessboard_state(i, j) !=&lt;span style="color: #000000;"&gt; ChessboardState.EMPTY:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; False</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__gobang&lt;/span&gt;.set_chessboard_state(i, j, self.&lt;span style="color: #800080;"&gt;__currentPieceState&lt;/span&gt;&lt;span style="color: #000000;"&gt;)</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; True</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; False&lt;/pre&gt;&nbsp;</p>
<p>&nbsp;&lt;/div&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;现在不是还没AI嘛,我们一不做二不休,先搞一个人人对弈,那就再加一个切换颜色的函数:&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;div class="cnblogs_code"&gt;&nbsp;</p>
<p>&nbsp; &lt;pre&gt;&nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;def&lt;/span&gt;&lt;span style="color: #000000;"&gt; change_state(self):</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; self.&lt;span style="color: #800080;"&gt;__currentPieceState&lt;/span&gt; ==&lt;span style="color: #000000;"&gt; ChessboardState.BLACK:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__currentPieceState&lt;/span&gt; =&lt;span style="color: #000000;"&gt; ChessboardState.WHITE</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__currentPieceState&lt;/span&gt; = ChessboardState.BLACK&lt;/pre&gt;&nbsp;</p>
<p>&nbsp;&lt;/div&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;好了,还差啥?好像作为render的话,感觉差不多,那就来个main函数溜一溜代码试试,新建一个 game.py,这里我们 main 函数里先给AI留个接口,至少留个框架咯 :&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;div class="cnblogs_code"&gt;&nbsp;</p>
<p>&nbsp; &lt;pre&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt; pygame</p>
<p>&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; pygame.locals &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; *</p>
<p>&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; sys &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt; exit</p>
<p>&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; consts &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; *</p>
<p>&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; gobang &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt; GoBang</p>
<p>&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; render &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt; GameRender</p>
<p>&lt;/span&gt;&lt;span style="color: #008000;"&gt;#from gobang_ai import GobangAI</p>
<p>&nbsp;</p>
<p>&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; &lt;span style="color: #800080;"&gt;__name__&lt;/span&gt; == &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;__main__&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&nbsp;</p>
<p>&nbsp; &nbsp; gobang &lt;/span&gt;=&lt;span style="color: #000000;"&gt; GoBang()</p>
<p>&nbsp; &nbsp; render &lt;/span&gt;=&lt;span style="color: #000000;"&gt; GameRender(gobang)</p>
<p>&nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;先给AI留个接口&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;ai = GobangAI(gobang, ChessboardState.WHITE)&lt;/span&gt;</p>
<p>&nbsp; &nbsp; result =&lt;span style="color: #000000;"&gt; ChessboardState.EMPTY</p>
<p>&nbsp; &nbsp; enable_ai &lt;/span&gt;=&lt;span style="color: #000000;"&gt; False</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; True:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 捕捉pygame事件&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; event &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; pygame.event.get():</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;# &lt;/span&gt;&lt;span style="color: #008000;"&gt;退出程序&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; event.type ==&lt;span style="color: #000000;"&gt; QUIT:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exit()</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;elif&lt;/span&gt; event.type ==&lt;span style="color: #000000;"&gt;&nbsp; MOUSEBUTTONDOWN:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 成功着棋&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; render.one_step():</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result &lt;/span&gt;=&lt;span style="color: #000000;"&gt; gobang.get_chess_result()</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; result !=&lt;span style="color: #000000;"&gt; ChessboardState.EMPTY:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; enable_ai:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;ai.one_step()&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result =&lt;span style="color: #000000;"&gt; gobang.get_chess_result()</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; render.change_state()</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 绘制&lt;/span&gt;</p>
<p>&lt;span style="color: #000000;"&gt;&nbsp; &nbsp; &nbsp; &nbsp; render.draw_chess()</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; render.draw_mouse()</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; result !=&lt;span style="color: #000000;"&gt; ChessboardState.EMPTY:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; render.draw_result(result)</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 刷新&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; pygame.display.update()&lt;/pre&gt;&nbsp;</p>
<p>&nbsp;&lt;/div&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;好了,跑一下试试,没有AI就拉两个小伙伴来对弈,实在不行先左手和右手来一把,好像还行,逻辑没问题:&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&lt;img src="http://images2017.cnblogs.com/blog/17518/201711/17518-20171114221733702-519923396.png" alt="" width="588" height="612" /&gt;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;整理一下完整版的 render.py :&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;div class="cnblogs_code"&gt;&nbsp;</p>
<p>&nbsp; &lt;pre&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;coding:utf-8&lt;/span&gt;</p>
<p>&nbsp;</p>
<p>&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt; pygame</p>
<p>&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; pygame.locals &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; *</p>
<p>&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; consts &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; *</p>
<p>&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; gobang &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt; GoBang</p>
<p>&nbsp;</p>
<p>&lt;/span&gt;&lt;span style="color: #008000;"&gt;#IMAGE_PATH&lt;/span&gt;&lt;span style="color: #008000;"&gt; = '/Users/phantom/Projects/AI/gobang/UI/'&lt;/span&gt;</p>
<p>IMAGE_PATH = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;UI/&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;</p>
<p>&nbsp;</p>
<p>WIDTH &lt;/span&gt;= 540&lt;span style="color: #000000;"&gt;</p>
<p>HEIGHT &lt;/span&gt;= 540&lt;span style="color: #000000;"&gt;</p>
<p>MARGIN &lt;/span&gt;= 22&lt;span style="color: #000000;"&gt;</p>
<p>GRID &lt;/span&gt;= (WIDTH - 2 * MARGIN) / (N - 1&lt;span style="color: #000000;"&gt;)</p>
<p>PIECE &lt;/span&gt;= 32</p>
<p>&nbsp;</p>
<p>&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; GameRender(object):</p>
<p>&nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;def&lt;/span&gt; &lt;span style="color: #800080;"&gt;__init__&lt;/span&gt;&lt;span style="color: #000000;"&gt;(self, gobang):</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 绑定逻辑类&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; self.&lt;span style="color: #800080;"&gt;__gobang&lt;/span&gt; =&lt;span style="color: #000000;"&gt; gobang</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 黑棋开局&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; self.&lt;span style="color: #800080;"&gt;__currentPieceState&lt;/span&gt; =&lt;span style="color: #000000;"&gt; ChessboardState.BLACK</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 初始化 pygame&lt;/span&gt;</p>
<p>&lt;span style="color: #000000;"&gt;&nbsp; &nbsp; &nbsp; &nbsp; pygame.init()</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; pygame.display.set_mode((width, height), flags, depth) &lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; self.&lt;span style="color: #800080;"&gt;__screen&lt;/span&gt; = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32&lt;span style="color: #000000;"&gt;)</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; pygame.display.set_caption(&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;五子棋AI&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; UI 资源&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; self.&lt;span style="color: #800080;"&gt;__ui_chessboard&lt;/span&gt; = pygame.image.load(IMAGE_PATH + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;chessboard.jpg&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;).convert()</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__ui_piece_black&lt;/span&gt; = pygame.image.load(IMAGE_PATH + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;piece_black.png&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;).convert_alpha()</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__ui_piece_white&lt;/span&gt; = pygame.image.load(IMAGE_PATH + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;piece_white.png&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;).convert_alpha()</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;def&lt;/span&gt;&lt;span style="color: #000000;"&gt; coordinate_transform_map2pixel(self, i, j):&nbsp; &nbsp;&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 从 chessMap 里的逻辑坐标到 UI 上的绘制坐标的转换&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; MARGIN + j * GRID - PIECE / 2, MARGIN + i * GRID - PIECE / 2</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;def&lt;/span&gt;&lt;span style="color: #000000;"&gt; coordinate_transform_pixel2map(self, x, y):&nbsp; &nbsp;&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 从 UI 上的绘制坐标到 chessMap 里的逻辑坐标的转换&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; i , j = int(round((y - MARGIN + PIECE / 2) / GRID)), int(round((x - MARGIN + PIECE / 2) /&lt;span style="color: #000000;"&gt; GRID))</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 有MAGIN, 排除边缘位置导致 i,j 越界&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; i &amp;lt; 0 &lt;span style="color: #0000ff;"&gt;or&lt;/span&gt; i &amp;gt;= N &lt;span style="color: #0000ff;"&gt;or&lt;/span&gt; j &amp;lt; 0 &lt;span style="color: #0000ff;"&gt;or&lt;/span&gt; j &amp;gt;=&lt;span style="color: #000000;"&gt; N:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; None, None</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; i, j</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;def&lt;/span&gt;&lt;span style="color: #000000;"&gt; draw_chess(self):</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 棋盘&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; self.&lt;span style="color: #800080;"&gt;__screen&lt;/span&gt;.blit(self.&lt;span style="color: #800080;"&gt;__ui_chessboard&lt;/span&gt;&lt;span style="color: #000000;"&gt;, (0,0))</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 棋子&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; i &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; range(0, N):</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; j &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; range(0, N):</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x,y &lt;/span&gt;=&lt;span style="color: #000000;"&gt; self.coordinate_transform_map2pixel(i,j)</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; state &lt;/span&gt;= self.&lt;span style="color: #800080;"&gt;__gobang&lt;/span&gt;&lt;span style="color: #000000;"&gt;.get_chessboard_state(i,j)</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; state ==&lt;span style="color: #000000;"&gt; ChessboardState.BLACK:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__screen&lt;/span&gt;.blit(self.&lt;span style="color: #800080;"&gt;__ui_piece_black&lt;/span&gt;&lt;span style="color: #000000;"&gt;, (x,y))</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;elif&lt;/span&gt; state ==&lt;span style="color: #000000;"&gt; ChessboardState.WHITE:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__screen&lt;/span&gt;.blit(self.&lt;span style="color: #800080;"&gt;__ui_piece_white&lt;/span&gt;&lt;span style="color: #000000;"&gt;, (x,y))</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;: &lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; ChessboardState.EMPTY&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;pass&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</p>
<p>&nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;def&lt;/span&gt;&lt;span style="color: #000000;"&gt; draw_mouse(self):</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 鼠标的坐标&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; x, y =&lt;span style="color: #000000;"&gt; pygame.mouse.get_pos()</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 棋子跟随鼠标移动&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; self.&lt;span style="color: #800080;"&gt;__currentPieceState&lt;/span&gt; ==&lt;span style="color: #000000;"&gt; ChessboardState.BLACK:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__screen&lt;/span&gt;.blit(self.&lt;span style="color: #800080;"&gt;__ui_piece_black&lt;/span&gt;, (x - PIECE / 2, y - PIECE / 2&lt;span style="color: #000000;"&gt;))</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__screen&lt;/span&gt;.blit(self.&lt;span style="color: #800080;"&gt;__ui_piece_white&lt;/span&gt;, (x - PIECE / 2, y - PIECE / 2&lt;span style="color: #000000;"&gt;))</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;def&lt;/span&gt;&lt;span style="color: #000000;"&gt; draw_result(self, result):</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; font &lt;/span&gt;= pygame.font.Font(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;/Library/Fonts/Songti.ttc&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;, 50&lt;span style="color: #000000;"&gt;)</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; tips &lt;/span&gt;= u&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000;"&gt;本局结束:&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; result ==&lt;span style="color: #000000;"&gt; ChessboardState.BLACK :</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tips &lt;/span&gt;= tips + u&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000;"&gt;黑棋胜利&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;elif&lt;/span&gt; result ==&lt;span style="color: #000000;"&gt; ChessboardState.WHITE:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tips &lt;/span&gt;= tips + u&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000;"&gt;白棋胜利&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tips &lt;/span&gt;= tips + u&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000;"&gt;平局&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; text &lt;/span&gt;= font.render(tips, True, (255&lt;span style="color: #000000;"&gt;, 0, 0))</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__screen&lt;/span&gt;.blit(text, (WIDTH / 2 - 200, HEIGHT / 2 - 50&lt;span style="color: #000000;"&gt;))</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;def&lt;/span&gt;&lt;span style="color: #000000;"&gt; one_step(self):</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; i, j &lt;/span&gt;=&lt;span style="color: #000000;"&gt; None, None</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 鼠标点击&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; mouse_button =&lt;span style="color: #000000;"&gt; pygame.mouse.get_pressed()</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 左键&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; mouse_button[0]:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x, y &lt;/span&gt;=&lt;span style="color: #000000;"&gt; pygame.mouse.get_pos()</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i, j &lt;/span&gt;=&lt;span style="color: #000000;"&gt; self.coordinate_transform_pixel2map(x, y)</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;not&lt;/span&gt; i &lt;span style="color: #0000ff;"&gt;is&lt;/span&gt; None &lt;span style="color: #0000ff;"&gt;and&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;not&lt;/span&gt; j &lt;span style="color: #0000ff;"&gt;is&lt;/span&gt;&lt;span style="color: #000000;"&gt; None:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 格子上已经有棋子&lt;/span&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; self.&lt;span style="color: #800080;"&gt;__gobang&lt;/span&gt;.get_chessboard_state(i, j) !=&lt;span style="color: #000000;"&gt; ChessboardState.EMPTY:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; False</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__gobang&lt;/span&gt;.set_chessboard_state(i, j, self.&lt;span style="color: #800080;"&gt;__currentPieceState&lt;/span&gt;&lt;span style="color: #000000;"&gt;)</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; True</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; False</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</p>
<p>&nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;def&lt;/span&gt;&lt;span style="color: #000000;"&gt; change_state(self):</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; self.&lt;span style="color: #800080;"&gt;__currentPieceState&lt;/span&gt; ==&lt;span style="color: #000000;"&gt; ChessboardState.BLACK:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__currentPieceState&lt;/span&gt; =&lt;span style="color: #000000;"&gt; ChessboardState.WHITE</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.&lt;/span&gt;&lt;span style="color: #800080;"&gt;__currentPieceState&lt;/span&gt; = ChessboardState.BLACK&lt;/pre&gt;&nbsp;</p>
<p>&nbsp;&lt;/div&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;好了,就这样~ &amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;UI素材我打个包放这儿了:&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&lt;a href="https://files.cnblogs.com/files/erwin/Gobang_UI_Res.zip" target="_blank"&gt;点击这里下载UI素材&lt;/a&gt;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&hellip;&hellip;&hellip;&hellip;后记&hellip;&hellip;&hellip;&hellip;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;我:小伙伴们别吐槽了,明天一定开始搞AI了,因为五子棋咱们有啦~&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;小伙伴:好吧,终于。&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;我:等一下,明天?NO,我口误,下一篇一定开始搞AI了,明天不一定有时间来写博客呢 - -&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;小伙伴:再再次省去吐槽一万字!&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;我:反正每周至少写两篇嘛,OK?&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;小伙伴:那我还能怎样&hellip;&hellip;&lt;/p&gt;&nbsp;</p>
<p>&nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</p>
<p>&lt;/div&gt;</p></div>

猜你喜欢

转载自sunmon.iteye.com/blog/2405643