精华内容
下载资源
问答
  • [img=https://img-bbs.csdn.net/upload/201504/28/1430221738_571629.png][/img] 如图,每下一步棋,给棋子标上数字
  • 在纵横线的交点处画棋子见标题,这是一个数学题了,不过能够做出来还蛮有成就感的了!首先是棋盘了/** * 在这个面板上一个五子棋的棋盘了 */public void chessPaint(int a,int b) { boolean isWin = ...

     在纵横线的交点处画棋子

    见标题,这是一个数学题了,不过能够做出来还蛮有成就感的了!

      

    paint()方法和paintComponent()方法的区别

     

    一般来说当你想在AWT组件上进行绘制时,你可以重新实现paint函数,像我们在Applet Canvas上绘制需要实现paint函数   
       如果想在Swing组件上进行绘制,我们往往重新实现paintComponent方法(这个方法AWT组件没有),在需要刷新的时候系统会调用paint函数
       paint函数内部又调用paintComponent函数(paint内部一共会调三个,还有一个负责边框绘制)

     

     

     

    首先是画棋盘了

     

    /**
    * 在这个面板上画一个五子棋的棋盘了
    */


     public void paintComponent(Graphics g) {
      //先画横线
      for(int i = 40;i <= 400;i += 20) {
       g.drawLine(40, i, 400, i);
      }
      
      //划竖线
      for(int j = 40;j <= 400;j += 20) {
       g.drawLine(j, 40, j, 400);
      }
      //再划棋盘上的五个特殊点
      g.fillRect(97, 97, 6, 6);
      g.fillRect(337,97,6,6);
      g.fillRect(97, 337, 6, 6);
      g.fillRect(337, 337, 6, 6);      这些数字都是要算出来的,可以找一些好计算的面板尺寸了
      g.fillRect(217, 217, 6, 6);
     }

     

    将黑白棋子写成两个内部类饿了,得填充一个椭圆,看上去就像一个棋子一样了e

     

    /**
      * 白棋子内部类
      * @author sornor
      * @version 1.0
      */
     class Chess_white extends Canvas{
      
      public Chess_white () {
       this.setSize(20,20);
      }
      
      public void paint(Graphics g) {
       g.setColor(Color.white);
       System.out.println("white");
       g.fillOval(0, 0, 14, 14);  //填充一个椭圆了
      }
     }

     

    正式画棋子了

     

     

     

     

     

    2011-05-29 16:24:15

     

    展开全文
  • 本人最近在写一个五子棋游戏,可是还没到人机对战,在开始画棋子的时候就处处碰壁,所以现在!!!希望大家一起讨论下相关的问题——————画棋子 我的方法是 用棋盘作为背景 然后在每个棋盘十字交叉点 放置一个...
  • 本人计算机小白,用easy X出五子棋盘,再用鼠标交互下棋时,怎么棋子落在交叉点上,我只可以让它落在不准确的点上
  • boolean addMark(int x,int y,int color) //添加棋子(返回值为是否添加成功,如果位置有棋子就失败) { if(marks[x+5][y+5].color!=NONE) return false; marks[x+5][y+5].color=color; return true...
  • 学习小白 最近在做用easyx和VC6.0 做一个简单的五子棋游戏,但遇到了些问题,在悔棋的时候,我下过了的棋子怎么去除?求各位大神解答。``

    学习小白 最近在做用easyx和VC6.0 做一个简单的五子棋游戏,但遇到了些问题,在悔棋的时候,我下过了的棋子怎么去除?求各位大神解答。``

    展开全文
  • 本文代码基于 python3.6 和 pygame1.9.4。...需要说一下的是画棋子,因为没找到什么合适的棋子图片,所以只要自己来画棋子。 我们用 pygame.draw.circle 出来的圆形是这样的: 锯齿状十分明显,pygame.draw
  • 五子棋比起我之前写的几款游戏来说,难度提高了不少。如果是人与人对战,那么,电脑只需要判断是否赢了就可以。如果是人机对战,那你还得让电脑知道怎么下。...需要说一下的是画棋子,因为没找到什么合适的棋子图片...

    五子棋比起我之前写的几款游戏来说,难度提高了不少。如果是人与人对战,那么,电脑只需要判断是否赢了就可以。如果是人机对战,那你还得让电脑知道怎么下。

    我们先从简单的问题来看。

    开端

    画棋盘

    首先肯定是要画出棋盘来,用 pygame 画出一个 19 × 19 或 15 × 15 的棋盘并不是什么难事,这在之前的文章中已经多次用到,就不赘述了。

    画棋子

    需要说一下的是画棋子,因为没找到什么合适的棋子图片,所以只要自己来画棋子。

    我们用 pygame.draw.circle 画出来的圆形是这样的:

    欢迎大家加入小编创建的Python行业交流群,有大牛答疑,有资源共享,有企业招人!是一个非常不错的交流基地!群号:683380553

    锯齿状十分明显, 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 <= x < self._line_points and 0 <= y < self._line_points and self._checkerboard[y][x] == value:
    count += 1
    else:
    break
    for step in range(1, 5):
    x = point.X - step * x_offset
    y = point.Y - step * y_offset
    if 0 <= x < self._line_points and 0 <= y < self._line_points and self._checkerboard[y][x] == value:
    count += 1
    else:
    break
    return count >= 5
    这里我定义了一个偏移量,我们一共要计算横竖撇捺 4 条线,任意一条线出现 5 连就算获胜。计算方法实际上是一样的,只是方向不同,所以定义一个偏移量数组,不同的偏移量表示不同的方向,这样就可以利用循环来实现了,节省了很多代码。

    电脑落子

    这就是全篇的重头戏了,要怎么教电脑下五子棋。

    首先声明,我用的是相对传统的方式,不是深度学习。

    五子棋就是要实现 5 连,所以,一开始,我的想法是:将所有连线保存在一个数组中,落子的时候选择最长的连线落子。但这样有个问题解决不掉,如何让电脑识别“三三”呢?

    后来网上看到篇文章,使用的方法是:遍历棋盘上的空位,计算每一个位置其横竖撇捺 8 个方向上是否有己方的子,有一个就加 10 分,最后选得分最高的位置落子。

    这样不太严谨,写出来的电脑估计水平很菜,但是这个思路却是对的,落子就是要找到最值得的地方,那么我们干脆对每一个可落子的地方来做一个评估,选出最优解。

    这里我们需要了解一下五子棋的几种基本棋形:连五,活四,冲四,活三,眠三,活二,眠二。

    连五

    顾名思义,五颗同色棋子连在一起,赢了。

    活四

    四颗同色棋子连在一起,并且左右两边都没有对方棋子阻挡,有两个连五点。

    冲四

    四颗同色棋子连在一起,并且一边有对方棋子阻挡,或者四颗棋子不是连的,当中有个空挡,这时只有一个连五点。

    活三、跳活三

    活三:三颗同色棋子连在一起。

    跳活三 :中间隔了一个空格的活三。

    眠三

    只能够形成冲四的三,无外乎两种情况,一是一边被挡住了,一是当中有 2 个空格。(其实我在代码中仅考虑了第一种情况,即便形成冲四,也不是什么危险局面。)

    活二和眠二

    活二,能够形成活三的二;眠二,能够形成眠三的二。这里就不放图了,参考活三眠三。

    打分机制

    理解了这些棋形,那么按我们之前的思路,就是如何打分了。

    首先,连五肯定是不存在的,出现连五胜负已分,所以只要棋局还在进行中,就不会出现连五。那么,什么优先级最高?自然就是活四了。
    其次是对方的“四”,对方活四,你防不防都一样输了,对方冲四,你就必须防守。
    再次是我方的活三或冲四,活三跟冲四其实是一个级别的,对方必须防守。
    再次是对方的活三或冲四。
    以此类推下去。我们可以总结一点规律:

    相同的棋形,我方优于对方。
    冲四跟活三一个级别,眠三跟活二一个级别。
    如果中间有空格的话,肯定是要比没空格的略微低级一点,但不至于降级。
    基本逻辑就是这样,这一块的代码我写得也不好,整个判断写了100多行,就不贴代码了,大家可以直接下源码看。

    五子棋执黑是必赢的,代码中,玩家就是执黑先手,电脑执白后手,所以,下的好是完全可以赢电脑的,不过一个小小失误也很可能被电脑翻盘。

    作者:一起学Python呀
    来源:CSDN
    原文:https://blog.csdn.net/qq_42156420/article/details/87085966
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 一个简单的C#五子棋,教你怎么画棋子 棋盘 毁棋 附有详细注释和思路文档 看会这个 可以编写简单的2d游戏
  • 内容索引:VC/C++源码,图形处理,八皇后 八皇后VC++格子图形显示演示,搞不懂是怎么一回事,有兴趣的研究一下,类似黑白棋的界面,但运行的时候发觉显然不是黑白棋,棋子按一定规则动画显示,效果图如上。
  • 故而我们应该知道,要想网格线始终存在,我们需要在后台存在一个绘制代码,一直不断的这些网格线,同样在这一个代码区将来我们下了棋子之后也要不断的在下棋的位置棋子。 那么这样的代码区在哪呢?我们知道...

    1.界面的预处理与刷新

    我们要绘制五子棋棋盘,首先必须明确一点:不管我们在棋盘上怎么操作,棋盘的网格线是不可能改变的。无论是下棋,悔棋,网格线都会在那。故而我们应该知道,要想网格线始终存在,我们需要在后台存在一个绘制代码,一直不断的画这些网格线,同样在这一个代码区将来我们下了棋子之后也要不断的在下棋的位置画上棋子。

    那么这样的代码区在哪呢?我们知道我们绘制界面的大框架是JFrame,其他的组件不断的往JFrame里加,我们查看调用可以发现,这些组件包括JFrame都继承于同一个类Component,而在这个类中正好就有我们所要找的代码区,也就是函数paint(Graphics g)与repaint()。

    paint()是提供给用户编程的,往往声明在接口之中,然后用户实现该接口,以拥有重绘的功能。若要定制某个图形组件的界面,可以重写paint()方法,记得一般习惯这样改写:

    void paint(Graphics g){ 

    super.paint(g); 

    // your code

    }

    而repaint是刷新,里面不光有调用paint()函数刷新背景,也会刷新该组件上的所有组件。当对于界面或组件执行了某类操作,改变了界面上的图象时,jvm收到界面被调整的信息,此时会调用visible是ture的图形组件的repaint()方法对界面重绘。当然,直接重绘或全部重绘是很亏的,一个是用双缓存技术,另一个是只对桌面上显示的部分重绘。双缓存是指在缓存内先模拟重绘过程,只把最后成形的结果传给显示器显示。部分重绘就是指使用repaint(Dimensionarea)及类似的方法,只重绘与需调整的部分相关的界面。幸运的是,目前jdk提供的repaint()并不是傻呼呼的就直接重绘所有组件,已经用了上述两种方法优化过了。所以即使反复调用repaint()也不会有效率的损失。

    repaint()是重要概念,它是在图形线程后追加一段重绘操作,是安全的!是系统真正调用的重绘!所以如果你需要某个部件刷新一下界面,记得调用repaint(),千万不要直接调用paint()!因为paint()只用于预处理中设定背景所用,不能被外界调用,而repaint是可以的。

    概括起来,如果想给你的界面设定一个亘古不变的背景,重写paint()函数,但如果你后期要改变界面内容,改完后用repaint()刷新。

    2.五子棋盘的绘制

    一般为了方便绘图,或者界面美观,五子棋棋盘的横线数和纵线数是相同的,界面大小也采用近似正方形的宽高比。

    首先新建一个项目,新建一个主类,并在主类里加上主函数。因为要重写界面的paint()代码,在paint()中加上绘制背景棋盘的代码,因此这个类要继承这个界面的框架——JFrame。

    下面是简单的五子棋棋盘绘制代码,你可以回去自己写出五子棋棋盘代码,长宽以及几乘几的格子都由你自己决定。

    import java.awt.Color;
    import java.awt.Graphics;
    
    import javax.swing.JFrame;
    
    
    public class Test extends JFrame {
    
    	public void initUI() {
    		this.setTitle("五子棋v0.1");
    		this.setSize(1000, 1000);
    		this.setResizable(false);//大小不可变
    		this.setLocationRelativeTo(null);//默认居中
    		this.setDefaultCloseOperation(3);//按下叉号默认关闭
    		this.getContentPane().setBackground(new Color(240, 233, 217));//修改背景颜色
    		this.setVisible(true);
    	}
    	
    	public void paint(Graphics g) {
    		super.paint(g);
    		drawChessTable(g);
    	}
    
    	public void drawChessTable(Graphics g) {
    		for (int i = 0; i < 19; i++)
    			g.drawLine(50, 50 + i * 50, 50
    					+ (19 - 1) * 50, 50 + i
    					* 50);
    		for (int j = 0; j < 19; j++)
    			g.drawLine(50 + j * 50, 50, 50 + j
    					* 50, 50 + (19 - 1)
    					* 50);
    	}
    	
    	public static void main(String args[]){
    		new Test().initUI();
    	}
    
    }
    

    运行之后结果是这样的:

    展开全文
  • 资源介绍:这个行棋游戏是我小时候常玩的一种棋类游戏,玩的时候只要找个棋友,然后在地上出棋盘,找几个小石子,就可以开始了.虽然规则很简单,但玩起来倒也得费点脑筋,玩的好的话可以自己一个棋子不丢,却把对手的棋子...
  • 但是当时一直不知道怎么去传画布所以一直没有成功把分形图像出来,好吧,那就把五子棋给写了吧,回家之前的最后一节课听强哥讲了一下五子棋的基本思想,大概就是:窗体的时候同时把棋盘好,在每点击一次棋盘的...
  • NOIP模拟题题解

    2015-11-01 10:45:58
    这套题是一位学长出的=-=关于我们热爱的小机房(但由于强行用梗,部分题意不清)...于是kkke找来了一个更大的棋盘(其实就是纸上的),在棋盘上的每个格子上都放上棋子,每个棋子有黑白两面,最初有的棋子黑色向上,
  • 八皇后VC++格子图形显示演示,搞不懂是怎么一回事,有兴趣的研究一下,类似黑白棋的界面,但运行的时候发觉显然不是黑白棋,棋子按一定规则动画显示,效果图如上。 源码下载地址:点击下载 备用下载地址:点击下载...
  • java五子棋+源码

    千次阅读 2013-03-29 18:45:49
    前天断网,闲着没事儿的时候写了个不太完美的 五子棋游戏,功能...呃,至于素材,背景是网上随便找的,棋子是自己用Fireworks的。棋子和背景素材如下: 【ps:点击右键可以下载】   源码如下: package com.
  • 用AS3.0制作五子棋

    千次阅读 2015-11-14 22:01:43
     首先讲讲棋子怎么下在棋盘上。我是自己了个12*12的棋盘并且设定好棋盘的坐标。   我这里是设置在(50,100)棋盘大小是500*500所以棋盘每个节点之间间距就是45.5,再通过对鼠标的监听获取鼠标点击屏幕位置的...
  • 五子棋java代码

    2017-09-13 12:42:35
    那么要有一个15*15的数组来存放吧,接下来我们要画棋子,那么棋子的大小也应该是固定的,对于棋盘来说,边界的间距也是固定的等等,首先我们写出了一个接口,那么接下来我们在写类的时候就可以让类去继承这个接口
  • 应用程序的壳(界面、事件驱动)与算法的关系 ...  画棋子的算法 判断输赢的算法 人机对战算法   2、每个算法怎么用计算机语言实现?  //画棋子的算法    if(e.getX()
  • 好了,那么怎么处理对称情况呢,随便一个小棋盘试一试,很容易得出是x-i+1和m-y+1。这之后就是颜色的问题了,因为题目有颜色的限制和对方耍赖这一操作,所以我们每一次放棋子的颜色也有要求。 再一个小棋盘模拟...
  • 五子棋人人对战

    2011-03-05 02:17:59
    费力我好大的劲我终于搞定五子棋人人对战了,关于五子棋人人对战对于我来说,最头疼的是斜线连珠问题,我开始用了两个for循环,可是怎么也搞不出来... 2:五子棋棋板以及画棋子,最关键的是重绘的问题,其实在这里...
  • 人机五子棋

    2014-04-28 15:42:31
    一款强大的人机五子棋,代码全开放 ... //画棋子 DrawImg(locationX, locationY, player); } if (IsWin(locationX, locationY, player)) { DrawWin(player); alert("您赢了"); return; //结束 }
  • 首先在开始执行一段代码之前要剖析这个问题,不是上手就干,这样会导致思维不够缜密,代码写了好几百航,一运行就崩溃了,我一般的解题过程是现画图,想出出想实现的过程,怎么实现,多种样例,是否都能通过这个...
  • 浅论云月局

    2011-11-07 14:39:00
    初学五子的人,往往棋局上被人砍得体无无肤后,很想找到个现成的棋谱依葫芦瓢,左手拿定式必胜棋谱,右手举棋子如挥刀,刷刷的砍杀下去, 不费神费力,还能杀个痛快。然而,如果说手里有了必胜谱就能所向披靡,...
  • 官方题解:我们依次分析每一种棋子。 ①王。 首先注意一个3*3的棋盘,开始在(1,1),问走到(3,3)谁有必胜策略。 穷举所有情况,容易发现这是后手赢。 对于NN和MM更大的情况,我们把横坐标每隔3、纵坐标每...
  • 我们依次分析每一种棋子。 ①王。 首先注意一个3*3的棋盘,开始在(1,1),问走到(3,3)谁有必胜策略。 穷举所有情况,容易发现这是后手赢。 对于NN和MM更大的情况,我们把横坐标每隔3、纵坐标每隔3的点都...
  • hdu5754各种博弈

    千次阅读 2016-07-26 19:55:13
    官方题解:我们依次分析每一种棋子。①王。首先注意一个3*3的棋盘,开始在(1,1),问走到(3,3)谁有必胜策略。穷举所有情况,容易发现这是后手赢。对于NN和MM更大的情况,我们把横坐标每隔3、纵坐标每隔3的点都出来...
  • 目录前言先一个棋盘放点棋子在上面呗所以,怎么能少了规则呢?车逻辑马逻辑象逻辑士逻辑将逻辑炮逻辑卒逻辑来到了大家会感兴趣的AI部分了实现了AI后,不能走也不行啊判断点击的位置得出选中棋子的可走路径(可落子...
  • 然后初始化显示器、键盘、鼠等输入输出设备并在屏幕上出棋盘。  (2)主循环控制模块:控制下棋顺序,当轮到某方下子时,负责将程序转到相应的模块中去,主要担当一个调度者的角色。  (3)玩家下子:当轮到玩家...
  • 我正试图在棋盘上展示棋子.问题是:如果我让“警报(img.src)”(从而创建了很多警报框……),件会在正确的位置显示,但如果我删除警报,它只显示一件在我画布的右上角.你觉得怎么样?谢谢!for (var i=1;i<9;i++){for...

空空如也

空空如也

1 2
收藏数 30
精华内容 12
关键字:

棋子怎么画