根本就没有教怎么制作五子棋棋盘打印盘的

五子棋最好的开局方式是什么? - 知乎5057被浏览905414分享邀请回答2.6K92 条评论分享收藏感谢收起41134 条评论分享收藏感谢收起查看更多回答9 个回答被折叠()博客分类:
java学习ing——五子棋的制作(人人对战)
自从上次完成了一次画图板,接下来的一个小项目的制作就是五子棋。包括了人人对战还有就是人机对战。这一片文章就先说一下人人对战,人机之后再来完善
先附一张效果图哈~
先来制定一个制作五子棋大体的一个思路吧:
1.要先有个窗体,有棋盘。
2.要能在上面画出棋子(也就是下棋),并且要完成黑白交替的下棋。
3.要能够判断输赢,判断是否有某个颜色的棋子五个相连。
人人的比较简单,基本的思路就是这样,然后再来一步步的完成。
制作前期的准备工作
我们可以先定义一个存放五子棋他各个属性的一个接口,这样在创建棋盘等等的地方就可以通过直接调用这个接口中的静态属性来完成。这样的好处就是在修改某一参数的时候就能够直接通过修改这个接口中的属性的数值来完成。
* 五子棋相关属性的类
public interface WZQ_config {
*设置棋盘网格行数列数为15
public static final int Row = 15;
public static final int Column = 15;
* 设置棋盘初始位置坐标
public static final int X = 30;
public static final int Y = 60;
* 设置棋子大小
public static final int Chess_size = 40;
* 设置棋盘格子大小
public static final int WZQ_JianJu = 40;
窗体界面的实现
实现五子棋界面的方法可能也是蛮多的,我知道的呢有一种是在一个窗体上面分别在指定的位置使用循环绘制横竖15条线来形成一个棋盘的网格。第二种方法是直接在一个窗体上面添加一个棋盘完整的图片,这种比较简单省事儿吧。~~但。我自己用的是绘制网格线的方法。
import java.awt.C
import java.awt.D
import java.awt.G
import javax.swing.JF
import javax.swing.JP
public class WZQ_Board extends JFrame {
public static WZQ_B
* 重载构造方法
public WZQ_Board() {
this.initUI();
* 初始化界面的方法
void initUI() {
* 设置棋盘属性
this.setTitle("吉吉的五子棋");
this.setSize(new Dimension(650, 650));
this.setResizable(false);
this.setDefaultCloseOperation(3);
this.setLocationRelativeTo(null);
this.setLayout(null);
* 添加一块棋盘
this.setLayout(null);
JPanel jp = new JPanel() {
* (non-Javadoc)定义一个匿名内部类重写paint方法
* @see javax.swing.JComponent#paint(java.awt.Graphics)
public void paint(Graphics g) {
g.setColor(Color.BLACK);
super.paint(g);
for (int i = 0; i & 15; i++) {
g.drawLine(20, 20 + i * WZQ_config.WZQ_JianJu, 20
+ (WZQ_config.Column - 1) * WZQ_config.WZQ_JianJu,
20 + i * WZQ_config.WZQ_JianJu);
for (int i = 0; i & 15; i++) {
g.drawLine(20 + i * WZQ_config.WZQ_JianJu, 20, 20 + i
* WZQ_config.WZQ_JianJu, 20
+ (WZQ_config.Column - 1) * WZQ_config.WZQ_JianJu);
g.setColor(Color.BLACK);
g.fillOval(133, 133, 15, 15);
g.fillOval(293, 133, 15, 15);
g.fillOval(453, 133, 15, 15);
g.fillOval(133, 293, 15, 15);
g.fillOval(293, 293, 15, 15);
g.fillOval(453, 293, 15, 15);
g.fillOval(133, 453, 15, 15);
g.fillOval(293, 453, 15, 15);
g.fillOval(453, 453, 15, 15);
// 重绘棋子
for (int i = 0; i & 650; i++) {
for (int j = 0; j & 650; j++) {
if (WZQ_listener.array[i][j] == "black") {
g.setColor(Color.BLACK);
g.fillOval(i, j, WZQ_config.Chess_size,
WZQ_config.Chess_size);
} else if (WZQ_listener.array[i][j] == "white") {
g.setColor(Color.WHITE);
g.fillOval(i, j, WZQ_config.Chess_size,
WZQ_config.Chess_size);
jp.setBackground(new Color(209, 167, 78));
jp.setBounds(10, 10, 602, 602);
this.add(jp);
this.setVisible(true);
g = jp.getGraphics();
* 添加监听器
WZQ_listener lis = new WZQ_listener(g);
jp.addMouseListener(lis);
这里绘制棋盘的方法是重写在他的重绘方法当中。在JFrame窗体上新建了一个带有颜色的JPanel,再在这个panel上面进行画线,这样呢就使得自己的棋盘变得~~美观些吧!
棋子的实现
下棋功能的实现需要考虑的地方也蛮多的:
1.首先想到下棋就是使用一个监听器来监听之前创建的panel棋盘,在鼠标释放的时候执行画园儿的操作。
2.怎么完成黑白交替着下
3.怎么使得棋子都下在正确的位置(网格线的相交点上)
4.怎么使得一个位置上只能存在一个棋子
啊~~我们再来一条一条的完善。
第一步很简单了,创建一个监听器来继承MouseAdapter这个抽象类。至于为什么不是实现MouseListener这个接口呢,原因很简单a~
因为实现MouseAdapter这个抽象类我们只需再重写我们需要用到的方法就可以了,而实现一个接口就要把他所有的抽象方法都要实现。这个五子棋的我们只用到的就是MouseReleased鼠标释放这一个,所以继承MouseAdapter显然更为简单。
然后重写其中MouseReleased方法,在鼠标释放的时候获取该点的xy坐标,在panel上获取画布:getGraphics(); 后就可以在上面画棋子了~~这样第一步也就完成了。
实现黑白交替呢~这里只需要一个控制变量,我使用的是一个boolean值state用来存储,true的时候表示该下黑子了,false的时候表示改下白子了。我们只需判断
if(state){
这样就完成了黑白子交替着下的功能~~
下一步是让棋子正位,我使用的方法是又自定义了一个坐标修正的函数。
* 下棋位置坐标修正的方法
public int correctXY(int x) {
x = x / 40;
return x * 40;
我就是用这样一个correctXY方法,在获取所点位置的xy坐标的时候进行一个修正,例如:
int x = correctXY(e.getX());
这样就把所获得到的点通过这个方法给修正了,看似好像除以四十又返回一个乘以四十好像没有变化,但这样是使得每一个获取到的坐标都是四十的倍数,也就是在正确的位置上。
下棋的最后一步就是使得一个点位只能下一个棋子,这个就是很简单了,只要我们定义一个二维数组,行列均为15,也就是这个棋盘的行列数,在每一个位置下棋后都在二维数组的对应位置中存入下的什么棋子,例如下的黑棋则在那个位置附上1,白子则附为-1。所以只要在下棋的时候不只只是判定state的true或者false,同时在判定所下位置二维数组是否为0,若不为0则说明该位置有棋子则不执行下棋操作。so easy~~~
这样我们就可以在这个棋盘上面下棋了~~
最后一步~就是判段输赢的方法了
使用的方法就是每在我们下棋的时候都应该判定一次,通过获得每次所下棋子的位置来向四周八个方向分别判断是否已经有五个棋子相连了。如果有则返回一个true。然后在用一个方法来当有判断五连的方法有返回true的话,就看当前点的棋子是什么颜色的,黑子的话就是黑子五连了,否则就是白子五连。
监听器中的所有代码都放在一起啦:
import java.awt.C
import java.awt.G
import java.awt.P
import java.awt.event.MouseA
import java.awt.event.MouseE
import java.util.R
import javax.swing.JP
public class WZQ_listener extends MouseAdapter {
* 设置黑白棋标识 true表示黑子,false表示白子
public static boolean state =
public int x,
public static String[][] array = new String[700][700];
public static int[][] array_win = new int[15][15];
public static int[][] array_pve = new int[15][15];
public static int count_
public static int count_where = 0;
public static R
public static L
* 重载他·的构造方法
public WZQ_listener(Graphics g) {
// this.panel =
* 鼠标释放执行的方法
public void mouseReleased(MouseEvent e) {
x = correctXY(e.getX());
y = correctXY(e.getY());
System.out.println("x:"+x+"
* 判定为人人对战
if (ActListener.GameModel == 1) {
if (x & 582 && x &= 0 && y & 582 && y &= 0) {
if (state && array[x][y] == null) {
g.setColor(Color.BLACK);
g.fillOval(x, y, WZQ_config.Chess_size,
WZQ_config.Chess_size);
array[x][y] = "black";
array_win[getXY(y)][getXY(x)] = 1;
} else if (array[x][y] == null) {
g.setColor(Color.WHITE);
g.fillOval(x, y, WZQ_config.Chess_size,
WZQ_config.Chess_size);
array[x][y] = "white";
array_win[getXY(y)][getXY(x)] = -1;
if (Win(getXY(y), getXY(x)) == 1) {
result = new Result(1);
result.initUI();
} else if (Win(getXY(y), getXY(x)) == -1) {
result = new Result(-1);
result.initUI();
for (int i = 0; i & 15; i++) {
for (int j = 0; j & 15; j++) {
System.out.print(array_win[i][j] + "
System.out.println("");
System.out.println("");
* 人机对战
else if (ActListener.GameModel == 2) {
if (x & 582 && x & 10 && y & 582 && y & 10 && array[x][y] == null) {
g.setColor(Color.BLACK);
g.fillOval(x - WZQ_config.Chess_size / 2, y
- WZQ_config.Chess_size / 2, WZQ_config.Chess_size,
WZQ_config.Chess_size);
array[x][y] = "black";
array_win[getXY(y)][getXY(x)] = 1;
array_pve[getXY(y)][getXY(x)] = 0;
for (int i = 0; i & 15; i++) {
for (int j = 0; j & 15; j++) {
System.out.print(array_pve[i][j] + "
System.out.println("");
System.out.println("");
* 下棋位置坐标修正的方法
public int correctXY(int x) {
x = x / 40;
return x * 40;
public int getXY(int x) {
x = x / 40;
* 判赢方法
* 判定横向五个相连
public boolean winRow(int row, int column) {
int count = 1;
for (int i = column + 1; i & 15; i++) {// 向右查找
if (array_win[row][column] == array_win[row][i]) {
for (int i = column - 1; i &= 0; i--) {// 向左查找
if (array_win[row][column] == array_win[row][i]) {
if (count &= 5) {
* 判定竖向五个相连
public boolean winColumn(int row, int column) {
int count = 1;
for (int i = row + 1; i & 15; i++) {// 向右查找
if (array_win[row][column] == array_win[i][column]) {
for (int i = row - 1; i &= 0; i--) {// 向左查找
if (array_win[row][column] == array_win[i][column]) {
if (count &= 5) {
* 判定斜向右下五个相连
public boolean winRightDown(int row, int column) {
int count = 1;
for (int i = column + 1, j = row + 1; i & 15 && j & 15; i++, j++) {// 向右查找
if (array_win[row][column] == array_win[j][i]) {
for (int i = column - 1, j = row - 1; i &= 0 && j &= 0; i--, j--) {// 向左查找
if (array_win[row][column] == array_win[j][i]) {
if (count &= 5) {
* 判定斜向左下五个相连
public boolean winLeftDown(int row, int column) {
int count = 1;
for (int i = column - 1, j = row + 1; i &=0 && j & 15; i--, j++) {// 向右查找
if (array_win[row][column] == array_win[j][i]) {
for (int i = column + 1, j = row - 1; i &15 && j &= 0; i++, j--) {// 向左查找
if (array_win[row][column] == array_win[j][i]) {
if (count &= 5) {
public int Win(int row, int column) {
if (winRow(row, column) || winColumn(row, column)
|| winRightDown(row, column) || winLeftDown(row, column)) {
if (array_win[row][column] == 1)
else if (array_win[row][column] == -1)
return -1;
最后还有一点可以完善的,就是我所做的是判断有五连之后又会弹出一个新的界面,上面提示某某子五连,某某子获得胜利。同时提供两个按钮选择重新开始或者退出。~
import java.awt.BorderL
import java.awt.D
import java.awt.FlowL
import java.awt.event.ActionE
import java.awt.event.ActionL
import java.awt.event.MouseA
import java.awt.event.MouseE
import javax.swing.AbstractB
import javax.swing.JB
import javax.swing.JF
import javax.swing.JL
import javax.swing.JP
public class Result extends JFrame{
public Result(int i){
* 定义一个生成界面的方法
public void initUI(){
this.setTitle("结果");
this.setSize(new Dimension(400,200));
this.setLocationRelativeTo(null);
this.setResizable(false);
this.setLayout(new BorderLayout());
this.setDefaultCloseOperation(HIDE_ON_CLOSE);
panel = new JPanel();
panel.setLayout(new FlowLayout());
this.add(panel,BorderLayout.CENTER);
if(i == 1){
JLabel lab = new JLabel("黑子五连,黑子胜!");
panel.add(lab,BorderLayout.CENTER);
else if(i == -1){
JLabel lab = new JLabel("白子五连,白子胜!");
panel.add(lab);
JPanel pal = new JPanel();
JButton btn_restart = new JButton("重新开始");
JButton btn_exit = new JButton("退出游戏");
btn_restart.setActionCommand("restart");
btn_exit.setActionCommand("exit");
ActListener al = new ActListener();
btn_restart.addActionListener(al);
btn_exit.addActionListener(al);
btn_restart.addMouseListener(al);
btn_exit.addMouseListener(al);
pal.setLayout(new FlowLayout());
this.add(pal,BorderLayout.SOUTH);
pal.add(btn_restart);
pal.add(btn_exit);
this.setVisible(true);
这样,这个人人对战的五子棋可以说是就完成了。~~人机的之后会在完善的!
有缺点不足麻烦指出~~#^_^。谢谢各位看的盆友~~~~~
最后附一张效果图哈:
浏览 19465
不错,很好
~~嘿。谢谢谢谢~
浏览: 34988 次
&div class=&quote_title ...
不错,很好
版主太强了,写的很详细,思路很清晰,方便学习
ZaneLee007 写道java有现成的借口,何必非要自己做 ...
chinahker 写道哥,你冒泡排序都没写对还说了这么多。第 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'五子棋技巧大全 开局必胜有绝技
五子棋它起源于中国这是众所周知的,是一种极具策略性的棋类益智游戏。五子棋其实非常容易上手,经常下还有助于修身养性。这篇文章讲述了关于玩五子棋的技巧,通过这篇文章学习下如何开局就能必胜吧。
五子棋入门技巧口诀
先手要攻,后手要守。 以攻为守,以守为攻。 攻守转换,慎思变化。 先行争夺,地破天惊。 守取外势,攻聚内力。 八卦易守,成角易攻。 阻断分割,稳如泰山。 不思争先,胜如登天。 初盘争二,局终抢三。 留三不冲,变化万千。 多个先手,细算次先。 五子要点,次序在前。 斜线为阴,直线为阳。 阴阳结合,防不胜防。 连三连四,易见为明。 跳三跳四,暗箭深藏。 己落一子,敌增一兵。 攻其要点,守其必争。 势已形成,败即降临。 五子精华,一子输赢。
top2:五子棋的六个防守技巧
1.靠:由于五子棋是平衡的艺术,因此原则上每步棋都应下在对方上一步棋周围贴身的八个位置上。当你不知道该怎么下时可按此考虑,特别是对方在外围远处下子时,则在其左右必有好点。可降低对方的活动能力。2.压:活动需要空间,防守主要的目的是压迫对方的活动空间,在对方棋形的上方进行挤压,使其不能抬头,限制其发展,防止敌人以几何倍数向外扩张(如果这样你肯定完了)。下在外围也能为将来自己的扩展做准备。3.托:将对方的棋形托向底线,使其失去根基,发展无望。即分割其与总体的联系,将之孤立起来,起到无为而治的目的。4.点:在情况不明的地方点一手,看对方的应手而后定。将变化走明有时是明智之举。5.穿心:功聚内力,防守就是要破坏其凝聚力,在对方集中之处的中心筋络上下子能起到事半功倍的效果。不过“心”一定要选准,否则事得其反。6.反打:争取主动是积极的防守。反打即作出活二或死三,使之能在对方活三冲四时反活三反冲四。使自己能更灵活地防守,在对方进攻时进行反打有抢先防御,争取主动的效果。
五子棋开局技巧图解
职业连珠的开局是建立在两套基本打法上的,即“直止(Direct)打法”和“斜止(Indirect)打法”。如图2.1 所示,按照职业连珠规则,黑1必须落在天元,如果像民间走法不走天元,则称之为“奇门”。之后,白2落子在天元直线侧a点为“直止打法”,落子在天元斜侧b点为“ 斜止打法 ”。
由这两种打法生出各 13 种开局,职业连珠指定开局名称繁多,不易记忆。则下面的口诀有助于记住职业开局的名称:寒星溪月疏星首,花残二月并白莲,雨月金星追黑玉,松丘新宵瑞山腥。星月长峡恒水流,白莲垂俏云浦岚,黑玉银月倚明星,斜月名月堪称朋。二十六局先弃二,直指游星斜慧星。口诀中前四句为直止,五至八句为斜止。将白 2 子比喻为白莲,将黑 1 子比喻为黑玉,很富有诗意。在开局阶段,双方主要是二的争夺。双方必须设法创造自己的连二、活二、跳二或大跳二等,同时要阻挡对方的活二。无论哪种开局,均体现出这一规律。可以说,哪一方的二做得多 ( 有两个以上的活二 ) ,或者有效地阻挡住对方的活二,那么,哪一方的胜率就比较大。另外,开局时每一个次序、每一种节奏都不能忽视,输赢就在一步之差。
五子棋技巧大全
1、留三不冲四,保留变化
2、防守活三时防在对方攻势强的方向
3、八卦马步是强防守,但不提倡用纯色八卦阵,尤其黑子,禁手制下八卦必败
4、布局时斜行、成角为强攻
5、开局时争活二,自己多做二,挡住对方的活二,并且往往挡对方的活二先,不必攻急
6、下子时考虑对方会怎么走,你再往下一子该怎么走7、开黑优局要尽快建立棋子间的联系,即“攻聚内力”。更多内容请查看:& 搜索“图”或者“tulaoshi_com”加关注,每天最新的美食、、、美妆、、手工DIY等生活小技巧,30天变身小巧妇!【扫描下图可直接关注】
点击查看更多与《》相关的文章>>
走过路过那就千万别错过了,图老师24个恋爱技巧让他更爱你频道里面有好多 精品的教程噢,你所需要的这里面都有噢!
图老师小编是堪称小百度百科呢,没有小编不知道的噢!今天按照惯例,又要教大家一个新的知识了职场人际潜规则赶紧搬起小板凳抢前排吧!
看图老师的教程,是不是要做点什么呢,爱自己、爱生活、爱图老师,小编在这里给大家推荐一个五个步骤,里面的很多好的教程,都是可以学习的哦,喜欢的朋友们请关注图老师。
发财树的寓意吉祥,是很多人首选的养殖植物。但是发财树也不是那么好养殖的,稍不注意就容易枯死。接下来图老师小编就告诉大家发财树的养殖方法和注意事项,好的栽培也是有技巧的。
图老师小编是堪称小百度百科呢,没有小编不知道的噢!今天按照惯例,又要教大家一个新的知识了职场10个技巧赶紧搬起小板凳抢前排吧!
定位停车是在平直路面上画一条停车线,边上设停车标志杆,汽车以每小时35公里的速度靠右行驶,距标志杆20米时迅速踩下制动踏板减速慢行,当车与前保险杆对正时平稳停车。
热门搜索:
手相算命 详解感情线的看法
《战争机器3》攻略 带你挑战杀戮战场
转笔高级技巧教学视频
10个要诀 让职业丽人建立职场友谊五子棋的棋盘怎么么做 - LabVIEW论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
五子棋的棋盘怎么么做
23:18:21  
做课程设计,五子棋的棋盘怎么做
助理工程师
14:33:38  
那两张横格纸,一张放在另一张下面,垂直了,然后就是五子棋棋盘了
然后在上面画点画圈.......
高中时候唯一的乐趣了.........
09:12:15  
PCB在线计价下单
板子大小:
板子数量:
PCB 在线计价
哈哈,哥们太逗了
21:30:35  
哈,哥们太逗了
等待验证会员
10:13:43  
楼上说得太有道理了
Powered by
供应链服务
商务及广告合作
Jeffery Guo
关注我们的微信
供应链服务 PCB/IC/PCBA
下载发烧友APP
版权所有 (C) 深圳华强聚丰电子科技有限公司

我要回帖

更多关于 五子棋棋盘 的文章

 

随机推荐