请问哪位大神可以用java做出java五子棋视频教程?还要判断输赢的!谢谢!

importjava.awt.*;importj;rtColor(color)+&赢了!;){}if(bodyArray[x1;
import java.awt.*;import java.awt.event.*;import java.applet.Aimport java.awt.Cpublic class GoBang extends Applet implements ActionListener, MouseListener,MouseMotionListener, ItemListener {int color = 0;// 旗子的颜色标识 0:白子 1:黑子boolean isStart =// 游戏开始标志int bodyArray[][] = new int[16][16]; // 设置棋盘棋子状态 0 无子 1 白子 2 黑子Button b1 = new Button(&游戏开始&);Button b2 = new Button(&重置游戏&);Label lblWin = new Label(& &);Checkbox ckbHB[] = new Checkbox[2];CheckboxGroup ckgHB = new CheckboxGroup();public void init() {setLayout(null);addMouseListener(this);add(b1);b1.setBounds(330, 50, 80, 30);b1.addActionListener(this);add(b2);b2.setBounds(330, 90, 80, 30);b2.addActionListener(this);ckbHB[0] = new Checkbox(&白子先&, ckgHB, false);ckbHB[0].setBounds(320, 20, 60, 30);ckbHB[1] = new Checkbox(&黑子先&, ckgHB, false);ckbHB[1].setBounds(380, 20, 60, 30);add(ckbHB[0]);add(ckbHB[1]);ckbHB[0].addItemListener(this);ckbHB[1].addItemListener(this);add(lblWin);lblWin.setBounds(330, 130, 80, 30);gameInit();this.resize(new Dimension(450,350));}public void itemStateChanged(ItemEvent e) {if (ckbHB[0].getState()) // 选择黑子先还是白子先{color = 0;} else {color= 1;}}public void actionPerformed(ActionEvent e) {if (e.getSource() == b1) {gameStart();} else {reStart();}}public void mousePressed(MouseEvent e) {}public void mouseClicked(MouseEvent e) {int x1, y1;x1 = e.getX();y1 = e.getY();if (e.getX() & 20 || e.getX() & 300 || e.getY() & 20 || e.getY() & 300) {}if (x1 % 20 & 10) {x1 += 20;}if (y1 % 20 & 10) {y1 += 20;}x1 = x1 / 20 * 20;y1 = y1 / 20 * 20;setDown(x1, y1);}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}public void mouseReleased(MouseEvent e) {}public void mouseDragged(MouseEvent e) {}public void mouseMoved(MouseEvent e) {}public void paint(Graphics g) {g.setColor(Color.lightGray);g.fill3DRect(10, 10, 300, 300, true);g.setColor(Color.black);for (int i = 1; i & 16; i++) {g.drawLine(20, 20 * i, 300, 20 * i);g.drawLine(20 * i, 20, 20 * i, 300);}}public void setDown(int x, int y) // 落子{if (!isStart) // 判断游戏未开始{}if (bodyArray[x / 20][y / 20] != 0) {}Graphics g = getGraphics();if (color == 1)// 判断黑子还是白子{g.setColor(Color.black);color = 0;} else {g.setColor(Color.white);color = 1;}g.fillOval(x - 10, y - 10, 20, 20);bodyArray[x / 20][y / 20] = color + 1;if (gameWin1(x / 20, y / 20)) // 判断输赢{lblWin.setText(sta
rtColor(color) + &赢了!&);isStart =}if (gameWin2(x / 20, y / 20)) // 判断输赢{lblWin.setText(startColor(color) + &赢了!&);isStart =}if (gameWin3(x / 20, y / 20)) // 判断输赢{lblWin.setText(startColor(color) + &赢了!&);isStart =}if (gameWin4(x / 20, y / 20)) // 判断输赢{lblWin.setText(startColor(color) + &赢了!&);isStart =}}public String startColor(int x) {if (x == 0) {return &黑子&;} else {return &白子&;}}public void gameStart() // 游戏开始{isStart =enableGame(false);b2.setEnabled(true);}public void gameInit() // 游戏开始初始化{isStart =enableGame(true);b2.setEnabled(false);ckbHB[0].setState(true);for (int i = 0; i & 16; i++) {for (int j = 0; j & 16; j++) {bodyArray[i][j] = 0;}}lblWin.setText(&&);}public void reStart() // 游戏重新开始{repaint();gameInit();}public void enableGame(boolean e) // 设置组件状态{b1.setEnabled(e);b2.setEnabled(e);ckbHB[0].setEnabled(e);ckbHB[1].setEnabled(e);}public boolean gameWin1(int x, int y) // 判断输赢 横{int x1, y1, t = 1;x1 =y1 =for (int i = 1; i & 5; i++) {if (x1 & 15) {}if (bodyArray[x1 + i][y1] == bodyArray[x][y]) {t += 1;} else {}}for (int i = 1; i & 5; i++) {if (x1 & 1) {}if (bodyArray[x1 - i][y1] == bodyArray[x][y]) {t += 1;} else {}}if (t & 4) {} else {}}public boolean gameWin2(int x, int y) // 判断输赢 竖{int x1, y1, t = 1;x1 =y1 =for (int i = 1; i & 5; i++) {if (x1 & 15) {}if (bodyArray[x1][y1 + i] == bodyArray[x][y]) {t += 1;} else {}}for (int i = 1; i & 5; i++) {if (x1 & 1) {}if (bodyArray[x1][y1 - i] == bodyArray[x][y]) {t += 1;} else {}}if (t & 4) {} else {}}public boolean gameWin3(int x, int y) // 判断输赢 左斜{int x1, y1, t = 1;x1 =y1 =for (int i = 1; i & 5; i++) {if (x1 & 15) {}if (bodyArray[x1 + i][y1 - i] == bodyArray[x][y]) {t += 1;} else {}}for (int i = 1; i & 5; i++) {if (x1 & 1) {}if (bodyArray[x1 - i][y1 + i] == bodyArray[x][y]) {t += 1;} else {}}if (t & 4) {} else {}}public boolean gameWin4(int x, int y) // 判断输赢 左斜{int x1, y1, t = 1;x1 =y1 =for (int i = 1; i & 5; i++) {if (x1 & 15
) {}if (bodyArray[x1 + i][y1 + i] == bodyArray[x][y]) {t += 1;} else {}}for (int i = 1; i & 5; i++) {if (x1 & 1) {}if (bodyArray[x1 - i][y1 - i] == bodyArray[x][y]) {t += 1;} else {}}if (t & 4) {} else {}}}
三亿文库包含各类专业文献、各类资格考试、专业论文、应用写作文书、文学作品欣赏、高等教育、生活休闲娱乐、JAVA五子棋代码,可以在my eclipse运行29等内容。 
 18页 免费 Java五子棋游戏源代码(人机... 18页 5财富值如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意见建议,请点击此处进行反馈。 ...  java五子棋源代码_法律资料_人文社科_专业资料。 importjava.awt.B importjava.awt.C importjava.awt.F importjava.awt.Grap ...  运用 JAVA 程序设计和 Eclipse 软件设计出一个五子棋程序。 2. 五子棋游戏的...线程运行代码 //判断是否有时间限制 if(maxTime & 0) { while(true) { 17...  JAVA 办公自动化项目方案精解[M].北京:航空工业出版社, -120 附录 //Java 编程:五子棋游戏源代码 import java.awt.*; import java.awt.event.*...  五子棋游戏源代码_计算机软件及应用_IT/计算机_专业资料。利用java编写的简单五子棋游戏源代码,直接在eclipse即可运行!JAVA 期末课题实践考察--五子棋游戏设计 import...  JAVA五子棋游戏(控制台程序)_计算机软件及应用_IT/计算机_专业资料。//===类 ...Java五子棋游戏源代码 18页 2下载券 java五子棋游戏源码 11页 免费喜欢...  五子棋(JAVA版)实习报告及原代码_IT认证_资格考试/...由于 Applet 运行速度较慢,如果在加上算法搜 索...大量现成的智能手机应用软件;5、基于 Eclipse 的...  java五子棋网络版源代码加分析_计算机软件及应用_IT/计算机_专业资料。详细的解释和源代码,Java网络版五子棋小游戏本人学会的一个五子棋网络版和单机版游戏,有老师...  JAVA实现五子棋设计源代码_表格类模板_表格/模板_应用文书。JAVA程序源代码package...(&MY WINDOWS&); b4=new Button(&\&退出\&将被判为\&输\&是否继续游戏?...欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 1774 人关注过本帖
标题:五子棋就差判断输赢了,求大神指点
来 自:山东
等 级:论坛游民
帖 子:17
专家分:14
结帖率:100%
&&问题点数:0&&回复次数:2&&&
五子棋就差判断输赢了,求大神指点
public class Main1 {
&&& public static void main(String[] args) {
&&&&&&&&// TODO Auto-generated method stub
&&&&&&&&MyFrame frm = new MyFrame(&五子棋&);
import java.awt.*;
import java.awt.event.ActionE
import javax.swing.*;
public class MyFrame extends JFrame{
&&& JPanel pane_S,
&&& GridLayout gridL//声明网格布局
&&& JButton btn[];//声明按钮数组
&&& public MyFrame(String s) {
&&&&&&&&super(s);
&&&&&&&&JDialog log1=new JDialog(frm,&欢迎进入The one五子棋&,true);
&&&&&&&&log1.setSize(300,300);
&&&&&&&&log1.setLocationRelativeTo(null);
&&&&&&&&log1.setVisible(true);
&&&&&&&&this.setVisible(false);
&&&&&&&&JDialog log2=new JDialog(frm,&The one's five chess&,true);
&&&&&&&&log2.setSize(800,700);
&&&&&&&&log2.setLocationRelativeTo(null);
&&&&&&&&pane = new JPanel();
&&&&&&&&log2.add(pane);
&&&&&&&&//setContentPane(pane);
&&&&&&&&pane.setLayout(null);
&&&&&&&&pane_S = new JPanel();
&&&&&&&&pane.add(pane_S);
&&&&&&&&//pane_S.setLayout(null);
&&&&&&&&pane_S.setBounds(40, 40, 500, 500);
&&&&&&&&//addMouseListener((MouseListener) this);
&&&&&&&&//addMouseListener(this);//给当前窗口添加鼠标事件监听
&&&&&&&&/*for(int i=0;i&20;i++)
&&&&&&&&gridLayout = new GridLayout(i,20);
&&&&&&&&}*///创建14行,14列的网格布局
&&&&&&&&gridLayout=new GridLayout(17,17);
&&&&&&&&pane_S.setLayout(gridLayout);
&&&&&&&&Draw []btn=new Draw[17*17];
&&&&&&&&for(int i=0;i&17*17;i++)
&&&&&&&&&&&&btn[i]=new Draw(&&);
&&&&&&&&for(int i=0;i&17*17;i++)
&&&&&&&&&&&&pane_S.add(btn[i]);
&&&&&&&&&&&&//btn[i].setBackground(Color.gray);
&&&&&&&&//setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
&&&&&&&&log2.setVisible(true);
import java.awt.event.*;
import javax.swing.*;
public class Draw extends JButton implements ActionListener{
&&& static boolean bl=
&&& static boolean flag=//游戏开始的标志
&&& ImageIcon i1=new ImageIcon(&C:\\Users\\Administrator\\workspace\\fivechess\\image\\bg1.png&);
&&& ImageIcon i2=new ImageIcon(&C:\\Users\\Administrator\\workspace\\fivechess\\image\\2.png&);
&&& ImageIcon i3=new ImageIcon(&C:\\Users\\Administrator\\workspace\\fivechess\\image\\1.png&);
&&& Draw(String s){
&&&&&&&&super(s);
&&&&&&&&this.setIcon(i1);
&&&&&&&&this.addActionListener(this);
&&& @Override
&&& public void actionPerformed(ActionEvent e) {
&&&&&&&&// TODO Auto-generated method stub
&&&&&&&&if(e.getSource()==this){
&&&&&&&&&&&&
&&&&&&&&&&&&if(bl==true){
&&&&&&&&&&&&&&& this.setIcon(i2);
&&&&&&&&&&&&&&& bl=//brack
&&&&&&&&&&&&&&& setEnabled(false);
&&&&&&&&&&&&&&& setDisabledIcon(i2);
&&&&&&&&&&&&}
&&&&&&&&&&&&
&&&&&&&&&&&&else if(bl==false){
&&&&&&&&&&&&&&& this.setIcon(i3);//white
&&&&&&&&&&&&&&& bl=
&&&&&&&&&&&&&&& setEnabled(false);
&&&&&&&&&&&&&&& setDisabledIcon(i3);
&&&&&&&&&&&&&&&
&&&&&&&&&&&&}
&&&&&&&&&&&&
搜索更多相关主题的帖子:
&&&&&&&&&&
等 级:新手上路
帖 子:20
我以前看到的是找到一个检测周边八个,然后继续,不知道行不行。
等 级:论坛游民
专家分:17
这个逻辑,你处理了吗?
版权所有,并保留所有权利。
Powered by , Processed in 0.067380 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved用Java实现控制台的五子棋小游戏_java 控制台五子棋_词汇网
<meta name="keywords" content="用Java实现控制台的五子棋小游戏java 控制台五子棋,菜鸟用来练练Java编程,请大神们指导!!
代码片段(," />
用Java实现控制台的五子棋小游戏
责任编辑:词汇网 发表时间: 1:34:06
菜鸟用来练练Java编程,请大神们指导!! 标签:
代码片段(3)[全屏查看所有代码] 1.[文件] Chessboard.java~869B 下载(33) package org.shmtu.public class Chessboard { //定义一个二维数组来充当棋盘private String [][]//定义棋盘大小public static final int BOARD_SIZE=22;public void initBoard(){//初始化棋盘board=new String[BOARD_SIZE][BOARD_SIZE];//把每个元素输出为“+”,在控制台输出for(int i=0;i<BOARD_SIZE;i++){for(int j=0;j<BOARD_SIZE;j++)board[i][j]="+";}}/*在控制台输出棋盘的方法*/public void printBoard(){for(int i=0;i<BOARD_SIZE;i++){for(int j=0;j<BOARD_SIZE;j++){//打印后不换行System.out.print(board[i][j]);}System.out.print("\n");}}/*给棋盘的位置赋值*/public void setBoard(int posX, int posY, String chessman){this.board[posX][posY]=}/*返回棋盘*/public String [][] getBoard(){return this.}} 2.[文件] Chessman.java~293B 下载(23) package org.shmtu.public enum Chessman { BLACK("●"),WHITE("○");private S//私有构造函数private Chessman(String chessman){this.chessman=}//返回黑棋或者白棋public String getChessman(){return this.}} 3.[文件] GobangGame.java~5KB 下载(33) package org.shmtu.import java.io.*;public class GobangGame {// 定义到达赢条件的棋子数目private final int WIN_COUNT=5;//定义用户输入的坐标private int posX=0;private int posY=0;//定义棋盘private C//构造函数public GobangGame(Chessboard chessboard){this.chessboard=}/*检查用户输入是否合理 */public boolean isValid(String inputStr){// 将用户输入的字符串以逗号(,)作为分隔,分隔成两个字符串String [] posStrArr=inputStr.split(",");try {posX=Integer.parseInt(posStrArr[0])-1;posY=Integer.parseInt(posStrArr[1])-1;} catch (NumberFormatException e) {// TODO: handle exceptionchessboard.printBoard();System.out.println("请输入(数字,数字)格式");}//检查输入的数字是否在允许范围里if(posXchessboard.BOARD_SIZE||posYchessboard.BOARD_SIZE){chessboard.printBoard();System.out.println("输入的坐标超过棋盘范围,请重新输入!");}//检查输入的位置是否有棋子String [][] board=chessboard.getBoard();if(board[posX][posY]!="+"){chessboard.printBoard();System.out.println("输入的位置已经有棋子,请输入到其他位置!");}}/** * 开始下棋 * @param true 为游戏结束 */public void start() throws Exception{boolean isOver= //isOver标记游戏是否胜利//初始化和打印棋盘chessboard.initBoard();chessboard.printBoard();//获取从键盘输入BufferedReader br=new BufferedReader(new InputStreamReader(System.in));String inputStr=while ((inputStr=br.readLine())!=null){isOver=if(!isValid(inputStr)){//如果不合法,重新输入}String chessman=Chessman.BLACK.getChessman();chessboard.setBoard(posX, posY, chessman);//判断用户是否赢了if(isWon(posX,posY,chessman)){isOver=}else//计算机的位置随机取{int[] computerPosArr=computerDo();chessman=Chessman.WHITE.getChessman();chessboard.setBoard(computerPosArr[0], computerPosArr[1], chessman);//判断是否计算机赢了if(isWon(computerPosArr[0], computerPosArr[1], chessman)){isOver=}}//如果胜者产生,是否还要继续游戏if(isOver){if(isReplay(chessman)){chessboard.initBoard();chessboard.printBoard();}}chessboard.printBoard();System.out.println("请输入您下棋的坐标,应以x,y的格式输入:");}}/** * 是否重新下棋 * @param chessman "●"为用户;"○"为计算机 * @return 开始返回true, 返回返回false; */public boolean isReplay(String chessman) throws Exception{chessboard.printBoard();String message=chessman.equals(Chessman.BLACK.getChessman())? "恭喜,你赢了":"很遗憾,你输了";System.out.println(message+"再来下一局(y/n)");BufferedReader br=new BufferedReader(new InputStreamReader(System.in));if(br.readLine().equals("y")){//开始新的一局}}/** * 计算机随机下棋 * */public int[] computerDo(){int posX=(int)(Math.random()*(chessboard.BOARD_SIZE-1));int posY=(int)(Math.random()*(chessboard.BOARD_SIZE-1));String[][] board=chessboard.getBoard();while(board[posX][posY]!="+"){ posX=(int)(Math.random()*(chessboard.BOARD_SIZE-1)); posY=(int)(Math.random()*(chessboard.BOARD_SIZE-1));}int [] result={posX,posY};}/** * 判断输赢 * @param ico 棋子类型 * @return 如果有相邻五颗棋子在一条直线上则返回true,否则返回false */public boolean isWon(int posX,int posY, String ico){ //直线起点和终点坐标int startX=0;int startY=0;int endX=chessboard.BOARD_SIZE-1;int endY=endX;//同一条直线上相邻棋子的数目int sameCount=0;int temp=0;//计算起点最小坐标temp=posX-WIN_COUNT+1;startX=temp<0?0:temp=posY-WIN_COUNT+1;startY=tempchessboard.BOARD_SIZE?chessboard.BOARD_SIZE:temp=posY+chessboard.BOARD_SIZE-1;endY=temp>chessboard.BOARD_SIZE?chessboard.BOARD_SIZE://从左到右计算相同棋子的数目String [][] board=chessboard.getBoard();for(int i=startY;i<endY;i++){if(board[posX][i]==ico&&board[posX][i+1]==ico){sameCount++;}else if(sameCount!=WIN_COUNT-1){sameCount=0;}}if (sameCount==0) {// 从上到下计算相同相邻棋子的数目for (int i=startX; i < endX; i++) {if (board[i][posY]==ico && board[i + 1][posY]==ico) {sameCount++;} else if (sameCount !=WIN_COUNT - 1) {sameCount=0;}}}if (sameCount==0) {// 从左上到右下计算相同相邻棋子的数目int j=startY;for (int i=startX; i < endX; i++) {if (j < endY) {if (board[i][j]==ico && board[i + 1][j + 1]==ico) {sameCount++;} else if (sameCount !=WIN_COUNT - 1) {sameCount=0;}j++;}}}return sameCount==WIN_COUNT-1?true:}public static void main(String[]args) throws Exception{GobangGame gb=new GobangGame(new Chessboard());gb.start();}}
上一集:没有了 下一集:
相关文章:&&&&&&&&
最新添加资讯
24小时热门资讯
附近好友搜索java学习ing——五子棋的制作(人人对战) -
- ITeye博客
博客分类:
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);
这样,这个人人对战的五子棋可以说是就完成了。~~人机的之后会在完善的!
有缺点不足麻烦指出~~#^_^。谢谢各位看的盆友~~~~~
最后附一张效果图哈:
浏览 18703
不错,很好
~~嘿。谢谢谢谢~
浏览: 33374 次
&div class=&quote_title ...
不错,很好
版主太强了,写的很详细,思路很清晰,方便学习
ZaneLee007 写道java有现成的借口,何必非要自己做 ...
chinahker 写道哥,你冒泡排序都没写对还说了这么多。第 ...

我要回帖

更多关于 java五子棋课程设计 的文章

 

随机推荐