电子的电脑么
消费电子产品市场上,线上教育的兴起引发了平板电脑的热潮。然而,柏铭科技发现当前热销的平板电脑竟成为昂贵的电子垃圾,与笔记本电脑无法相提并论。过去,iPad作为平板电脑的代表,凭借强大的性能和优化的A...
2024.09.19五子棋比起我之前写的几款游戏来说,难度提高了不少。如果是人与人对战,那么,电脑只需要判断是否赢了就可以。如果是人机对战,那你还得让电脑知道怎么下。
我们先从简单的问题来看。
开端
画棋盘
首先肯定是要画出棋盘来,用 pygame 画出一个 19 19 或 15 15 的棋盘并不是什么难事,这在之前的文章中已经多次用到,就不赘述了。
画棋子
需要说一下的是画棋子,因为没找到什么合适的棋子图片,所以只要自己来画棋子。
我们用 pygame.draw.circle 画出来的圆形是这样的:
锯齿状十分明显, pygame.draw 中有画抗锯齿直线的函数 aaline ,但是并没有 aacircle这样的函数来画一个抗锯齿的圆。
这里就需要用到 pygame.gfxdraw 啦。 pygame.gfxdraw 目前还仅是实验版本,这意味着这个 API 可能会在以后的 pygame 版本中发生变化或消失。
要绘制抗锯齿和填充形状,请首先使用函数的aa *版本,然后使用填充版本。例如:
col = (255, 0, 0)surf.fill((255, 255, 255))pygame.gfxdraw.aacircle(surf, x, y, 30, col)pygame.gfxdraw.filled_circle(surf, x, y, 30, col)我们用这个方法在棋盘上画一个棋子试试看。
加群:960410445 即可获取源码!
可以看到效果已明显改善。
落子
落子需要判断鼠标事件,当鼠标左键点击,获取鼠标点击的位置,然后根据棋盘的位置,计算出棋子落在棋盘的位置。
while True: for event in pygame.event.get(): if event.type == QUIT: sys.exit() elif event.type == MOUSEBUTTONDOWN: pressed_array = pygame.mouse.get_pressed() if pressed_array[0]: # 鼠标左键点击 mouse_pos = pygame.mouse.get_pos() click_point = _get_clickpoint(mouse_pos)胜利判定
当一子落下,如何判定是否胜利?
可以肯定的是,当某一子落下的时候,如果出现了 5 连,那么落下的这颗子必定在这条 5 连线上。那么这个问题就可以简化了,我们无需全盘扫描,只需要在落子位置上横竖撇捺扫描一下,判断是否出现 5 连即可。
我们定义一个棋盘类,类中实例化一个 19 19 的二维数组,初始值皆为 0,表示空,用 1 表示黑子,2 表示白子。这个类对外提供一个落子方法 drop ,接收参数落子方和落子坐标,如果落子后胜利,则返回胜利者,否则返回 None。
Chessman = namedtuple(‘Chessman‘, ‘Name Value Color‘)Point = namedtuple(‘Point‘, ‘X Y‘)BLACK_CHESSMAN = Chessman(‘黑子‘, 1, (45, 45, 45))WHITE_CHESSMAN = Chessman(‘白子‘, 2, (219, 219, 219))offset = [(1, 0), (0, 1), (1, 1), (1, -1)]class Checkerboard: def __init__(self, line_points): self._line_points = line_points self._checkerboard = [[0] * line_points for _ in range(line_points)] def _get_checkerboard(self): return self._checkerboard checkerboard = property(_get_checkerboard) # 判断是否可落子 def can_drop(self, point): return self._checkerboard[point.Y][point.X] == 0 def drop(self, chessman, point): """ 落子 :param chessman: 黑子/白子 :param point:落子位置 :return:若该子落下之后即可获胜,则返回获胜方,否则返回 None """ print(f‘{chessman.Name} ({point.X}, {point.Y})‘) self._checkerboard[point.Y][point.X] = chessman.Value if self._win(point): print(f‘{chessman.Name}获胜‘) return chessman # 判断是否赢了 def _win(self, point): cur_value = self._checkerboard[point.Y][point.X] for os in offset: if self._get_count_on_direction(point, cur_value, os[0], os[1]): return True def _get_count_on_direction(self, point, value, x_offset, y_offset): count = 1 for step in range(1, 5): x = point.X + step * x_offset y = point.Y + step * y_offset if 0消费电子产品市场上,线上教育的兴起引发了平板电脑的热潮。然而,柏铭科技发现当前热销的平板电脑竟成为昂贵的电子垃圾,与笔记本电脑无法相提并论。过去,iPad作为平板电脑的代表,凭借强大的性能和优化的A...
2024.09.19老兵不死。可能连Relic都没能想到,那个发售时只有区区两个阵营,而且其中一个阵营还惨遭其原型国后人抵制的《英雄连2》,居然走到了自己的第十个年头。这个发迹于2006年的传奇系列,见证了整个即时战略游...
2024.09.20文章首发于公众号支付之家网微信丨ZFZJCN网址丨WWW.ZFZJ.CN支付之家网(WWW.ZFZJ.CN) 刚过去的周末,支付行业最火的公司非盒子支付莫属。近日,贵州电视台公共频道百姓关注栏目播出了...
2024.09.19夏娃把母飞船(生态胶囊)停在了火星同步轨道的着陆点正上方,开始与亚当联络。亚当让她继续待命,继续利用微型遥感卫星搜索类似的地貌。亚当发现遥感定位的这片地貌确实很特别,洞穴层层叠叠,相互嵌套,迷宫一...
2024.09.20Java五子棋设计流程:1.创建窗口和设计一个棋盘界面2.实现鼠标点击,棋子出现,黑白棋轮流下3.能够判断输赢4.添加按钮功能import java.awt.BorderLayout;import j...
2024.09.17