<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>http://test.largeq.cn/index.php?action=history&amp;feed=atom&amp;title=JAVA%E5%AE%9E%E7%8E%B0%E5%9B%B4%E6%A3%8B%E6%8F%90%E5%AD%90</id>
	<title>JAVA实现围棋提子 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://test.largeq.cn/index.php?action=history&amp;feed=atom&amp;title=JAVA%E5%AE%9E%E7%8E%B0%E5%9B%B4%E6%A3%8B%E6%8F%90%E5%AD%90"/>
	<link rel="alternate" type="text/html" href="http://test.largeq.cn/index.php?title=JAVA%E5%AE%9E%E7%8E%B0%E5%9B%B4%E6%A3%8B%E6%8F%90%E5%AD%90&amp;action=history"/>
	<updated>2026-04-20T20:30:36Z</updated>
	<subtitle>本wiki的该页面的版本历史</subtitle>
	<generator>MediaWiki 11.45.14</generator>
	<entry>
		<id>http://test.largeq.cn/index.php?title=JAVA%E5%AE%9E%E7%8E%B0%E5%9B%B4%E6%A3%8B%E6%8F%90%E5%AD%90&amp;diff=452&amp;oldid=prev</id>
		<title>IVEN：创建页面，内容为“&lt;div style=&quot;color:red;font-size:24px&quot;&gt;相关老师请注意：此文章为&lt;span style=&quot;background:gold&quot;&gt;王贺青&lt;/span&gt;同学原创。如果发现王贺青同学提…”</title>
		<link rel="alternate" type="text/html" href="http://test.largeq.cn/index.php?title=JAVA%E5%AE%9E%E7%8E%B0%E5%9B%B4%E6%A3%8B%E6%8F%90%E5%AD%90&amp;diff=452&amp;oldid=prev"/>
		<updated>2020-06-27T09:14:27Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“&amp;lt;div style=&amp;quot;color:red;font-size:24px&amp;quot;&amp;gt;相关老师请注意：此文章为&amp;lt;span style=&amp;quot;background:gold&amp;quot;&amp;gt;王贺青&amp;lt;/span&amp;gt;同学原创。如果发现王贺青同学提…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;div style=&amp;quot;color:red;font-size:24px&amp;quot;&amp;gt;相关老师请注意：此文章为&amp;lt;span style=&amp;quot;background:gold&amp;quot;&amp;gt;王贺青&amp;lt;/span&amp;gt;同学原创。如果发现王贺青同学提交的相关文章与此文章有雷同，是正常现象。为防止老师在查重时在互联网上搜索到这篇文章而误认为王贺青同学抄袭，特此声明。请认准王贺青同学使用的邮箱admin@large.cn与本网站一级域名largeq.cn。&amp;lt;/div&amp;gt;&lt;br /&gt;
围棋中，有一个概念叫做“提子”。要实现提子的功能，就必须要知道提子是什么。根据围棋的规则，普通的19路棋盘有19横19纵的线，线与线交叉叫做点，点上可以落子，一个棋盘共361个点。所以我们可以把抽象成为一个又一个的点，每个点都有三种状态：有白子、有黑子、无子。对于棋盘上的点，我们都可以找到由线连接、并且相邻的两个（角落）、三个（边）或四个点（其它的全部）。当一个点有一个棋子落下时，与这个棋子所在的点所有相邻没有子的点就成为了这个棋子的“气”。如果两枚同色棋子相邻，则它们的气是共享的。当一片相邻的同色棋子的气全部被另一色棋子占据时，则这一片棋子应该被从棋盘上移除，称做“提子”。&lt;br /&gt;
&lt;br /&gt;
要实现提子功能，则一个点必需能够获得相邻点的状态，每一个点都需要四个指向相邻点的指针。在JAVA中，由于对象通过地址传值，即你把一个实例化的对象赋给一个变量时，实际上保存的是对象的地址。那么我们在用JAVA实现Dot类，也就是棋盘的点时，只需要为它添加四个Dot类型的属性，表示相邻的点。然后我们还需要为它添加一个表示状态的属性，具体如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class Dot extends JButton{&lt;br /&gt;
	public Dot leftDot;&lt;br /&gt;
	public Dot rightDot;&lt;br /&gt;
	public Dot upDot;&lt;br /&gt;
	public Dot downDot;&lt;br /&gt;
	private int now;//当前状态:-1黑棋0无子1白子&lt;br /&gt;
	// 点的类型，主要用于界面而非功能实现。&lt;br /&gt;
	// 这不是这篇文章的重点&lt;br /&gt;
	private int type;&lt;br /&gt;
	//这个是是否被检查过的标记，用于提子功能实现，后面会讲到&lt;br /&gt;
	public boolean checked=false;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
在创建棋盘时，我们只需要声明一个19*19、Dot类型的二维数组，然后再手动为它们添加上相邻点的指针就可以了~~如果是角落或者靠边的点，直接把不存在的相邻点设置成null即可。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class GameWindow extends JFrame implements ComponentListener{&lt;br /&gt;
	Dot[][] dot=new Dot[19][19];&lt;br /&gt;
	//论如何用JAVA实现窗体不是本文的重点&lt;br /&gt;
	ControlPanel controlPanel=new ControlPanel();&lt;br /&gt;
	// 中间省略几十行代码&lt;br /&gt;
	for(int i=0;i&amp;lt;19;i++){&lt;br /&gt;
			for(int j=0;j&amp;lt;19;j++){&lt;br /&gt;
				//this.setTitle(&amp;quot;小青棋棋by王贺青（正在绘制棋盘： &amp;quot;+i+&amp;quot;,&amp;quot;+j+&amp;quot;）&amp;quot;);&lt;br /&gt;
				//this.dot[i][j]=new Dot();&lt;br /&gt;
				&lt;br /&gt;
				this.dot[i][j].leftDot=(i&amp;gt;0)?this.dot[i-1][j]:null;&lt;br /&gt;
				this.dot[i][j].upDot=(j&amp;gt;0)?this.dot[i][j-1]:null;&lt;br /&gt;
				this.dot[i][j].rightDot =(i&amp;lt;18)?this.dot[i+1][j]:null;&lt;br /&gt;
				this.dot[i][j].downDot=(j&amp;lt;18)?this.dot[i][j+1]:null;&lt;br /&gt;
				//论如何用JAVA实现窗体不是计算机导论的重点&lt;br /&gt;
				this.dot[i][j].setSize(dotsWidth/20, dotsWidth/20);&lt;br /&gt;
				this.dot[i][j].setLocation(i*dotsWidth/20, j*dotsWidth/20);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
// 后面省略几十行代码&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
棋盘实现了，接下来就要实现提子功能了。在具体进行提子功能时，我写的程序需要执行的步骤大致有三步：1.检索出没气的子并对相应点做标记2.对被标记的点的状态进行修改，把它们改成无子。3.将所有被标记的点的标记取消。&lt;br /&gt;
上述三个步骤都用到了深度优先搜索遍历。深度优先搜索遍历的原理是：从当前结点开始，先检查第一个相邻结点是否符合条件，若不符合条件则检查第二个相邻结点，若符合条件则做一个标记，并对其相邻结点重复上述步骤。若遇到被标记的结点则忽略。&lt;br /&gt;
在实现时，深度优先搜索遍历是通过递归函数实现的。这个函数的返回类型为一个boolean类型。符合条件则返回true，不符合条件则返回false。我本来想把这些步骤写出来以便更好地凑够字数，但我发现语言描述不是我的强项。以后我有时间会慢慢完善这篇文章，我先把代码贴出来：&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//检查本子与其相连的子是否有气。被检查的子的checked属性通通会被设置为true&lt;br /&gt;
public boolean hasArea() {&lt;br /&gt;
   int checkColor=this.now;&lt;br /&gt;
   if(this.checked==true){&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   this.checked=true;&lt;br /&gt;
   if((this.leftDot!=null&amp;amp;&amp;amp;this.leftDot.getNow()==0)||(this.rightDot !=null&amp;amp;&amp;amp;this.rightDot.getNow()==0)||&lt;br /&gt;
         (this.upDot!=null&amp;amp;&amp;amp;this.upDot.getNow()==0)||(this.downDot!=null&amp;amp;&amp;amp;this.downDot.getNow()==0)){&lt;br /&gt;
      return true;&lt;br /&gt;
   }else if((this.leftDot!=null&amp;amp;&amp;amp;this.leftDot.getNow()!=checkColor)&amp;amp;&amp;amp;(this.rightDot !=null&amp;amp;&amp;amp;this.rightDot.getNow()!=checkColor)&amp;amp;&amp;amp;&lt;br /&gt;
         (this.upDot!=null&amp;amp;&amp;amp;this.upDot.getNow()!=checkColor)&amp;amp;&amp;amp;(this.downDot!=null&amp;amp;&amp;amp;this.downDot.getNow()!=checkColor)){&lt;br /&gt;
      return false;&lt;br /&gt;
   }else {&lt;br /&gt;
      if(this.leftDot!=null&amp;amp;&amp;amp;this.leftDot.now==checkColor){&lt;br /&gt;
         if(this.leftDot.hasArea()){&lt;br /&gt;
            return true;&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
      if(this.rightDot !=null&amp;amp;&amp;amp;this.rightDot.now==checkColor){&lt;br /&gt;
         if(this.rightDot.hasArea()){&lt;br /&gt;
            return true;&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
      if(this.upDot!=null&amp;amp;&amp;amp;this.upDot.now==checkColor){&lt;br /&gt;
         if(this.upDot.hasArea()){&lt;br /&gt;
            return true;&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
      if(this.downDot!=null&amp;amp;&amp;amp;this.downDot.now==checkColor){&lt;br /&gt;
         if(this.downDot.hasArea()){&lt;br /&gt;
            return true;&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
public void move() {&lt;br /&gt;
   int checkColor=this.now;&lt;br /&gt;
   if(this.checked==true){&lt;br /&gt;
      this.setChess(0);&lt;br /&gt;
      this.checked=false;&lt;br /&gt;
      if(this.leftDot!=null&amp;amp;&amp;amp;this.leftDot.getNow()==checkColor){&lt;br /&gt;
         this.leftDot.move();&lt;br /&gt;
      }&lt;br /&gt;
      if(this.rightDot !=null&amp;amp;&amp;amp;this.rightDot.getNow()==checkColor){&lt;br /&gt;
         this.rightDot.move();&lt;br /&gt;
      }&lt;br /&gt;
      if(this.upDot!=null&amp;amp;&amp;amp;this.upDot.getNow()==checkColor){&lt;br /&gt;
         this.upDot.move();&lt;br /&gt;
      }&lt;br /&gt;
      if(this.downDot!=null&amp;amp;&amp;amp;this.downDot.getNow()==checkColor){&lt;br /&gt;
         this.downDot.move();&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
public void clearChackedValue() {&lt;br /&gt;
   int checkColor=this.now;&lt;br /&gt;
   if(this.checked){&lt;br /&gt;
      this.checked=false;&lt;br /&gt;
      if(this.leftDot!=null&amp;amp;&amp;amp;this.leftDot.getNow()==checkColor){&lt;br /&gt;
         this.leftDot.clearChackedValue();&lt;br /&gt;
      }&lt;br /&gt;
      if(this.rightDot !=null&amp;amp;&amp;amp;this.rightDot.getNow()==checkColor){&lt;br /&gt;
         this.rightDot.clearChackedValue();&lt;br /&gt;
      }&lt;br /&gt;
      if(this.upDot!=null&amp;amp;&amp;amp;this.upDot.getNow()==checkColor){&lt;br /&gt;
         this.upDot.clearChackedValue();&lt;br /&gt;
      }&lt;br /&gt;
      if(this.downDot!=null&amp;amp;&amp;amp;this.downDot.getNow()==checkColor){&lt;br /&gt;
         this.downDot.clearChackedValue();&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
这里面还有一些坑要注意，比如要检测相邻点是否为null，否则在具体实现时会引发 空指针异常。&lt;br /&gt;
最后，这个提子功能在每次落子时都要用到。因为根据围棋规则，子不能落在没有气的点上，除非能提起对手的子。所以在每次落子前，要对落子点或落子点相邻被对手占据的点做气的检测，至于落子功能本身则很简单，只是将点改了个状态。最后我做出来的效果是这样的：&lt;br /&gt;
[[文件:小青棋棋.png|缩略图]]&lt;br /&gt;
其实还有一些功能，比如循环劫检测、计算有效占据点数（用来计算胜负）等功能，受到本人水平所限（编程与围棋水平都有所不足），未能实现。本人将在有空的时候实现它。&lt;/div&gt;</summary>
		<author><name>IVEN</name></author>
		
	</entry>
</feed>