java实现单机版五子棋

这个小游戏是我和我姐们儿的JAVA课程设计,也是我做的第一个JAVA项目,适合初学者,希望能帮到那些被JAVA课设所困扰的孩纸们~~~

一、该游戏需要实现

1、设计主框架,界面。

2、利用ActionListener接口实现按钮事件的监听。

3、重新开始功能的实现。

4、悔棋功能的实现。

5、退出功能的实现。

6、棋盘中棋子点类的定义。

7、利用MouseListener接口实现事件监听,并实现接口里的所有方法。

8、当鼠标移动到棋盘上的交点上,且该点上无棋子时能够变成小手形状。

9、点击棋盘时,利用if语句判断该点是否点在交点上,并利用foreach语句和棋子类中的getX(),getY()方法遍历每一个棋子的位置判断该点是否有棋子。

10、当判断到可以在所点击的点上下子时,画棋子时利用for循环遍历已有的每一个点并利用Graphics类的setColor设置颜色,利用Graphics类的fillOval方法设置形状大小。

11、当画完棋子时要及时判断输赢,用棋子所在索引和for循环遍历最后一个棋子的各个方向,如果有在同一条直线上的棋子个数大于等于五的即当前棋子所代表的那方赢。

12、胜负已定的时候,能够弹出相应的信息。

二、功能代码实现

2.1进入游戏

public static void main(String[] args) {
  StartChessJFrame f=new StartChessJFrame();//创建主框架
  f.setVisible(true);//显示主框架
 }

2.2初始化,定义一些要用到的量。

private ChessBoard chessBoard;//对战面板
 private Panel toolbar;//工具条面板
 private Button startButton;//设置开始按钮
 private Button backButton;//设置悔棋按钮
 private Button exitButton;//设置退出按钮

2.3界面的构造方法(游戏的框架)

public StartChessJFrame(){
  setTitle("单机版五子棋");//设置标题
  chessBoard=new ChessBoard();//初始化面板对象,创建和添加菜单
  MyItemListener lis=new MyItemListener();//初始化按钮事件监听器内部类
  toolbar=new Panel();//工具面板栏实例化
  startButton=new Button("重新开始");
  backButton=new Button("悔棋");
  exitButton=new Button("退出");//三个按钮初始化
  toolbar.setLayout(new FlowLayout(FlowLayout.LEFT));//将工具面板按钮用FlowLayout布局
  toolbar.add(backButton);
  toolbar.add(startButton);
  toolbar.add(exitButton);//将三个按钮添加到工具面板上
  startButton.addActionListener(lis);
  backButton.addActionListener(lis);
  exitButton.addActionListener(lis);//将三个按钮事件注册监听事件
  add(toolbar,BorderLayout.SOUTH);//将工具面板布局到界面南方也就是下面
  add(chessBoard);//将面板对象添加到窗体上
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置界面关闭事件
  pack();//自适应大小
 }

2.4按钮的实现与监听(构造方法内部)

MyItemListener lis=new MyItemListener();//初始化按钮事件监听器内部类
  toolbar=new Panel();//工具面板栏实例化
  startButton=new Button("重新开始");
  backButton=new Button("悔棋");
  exitButton=new Button("退出");//三个按钮初始化
  toolbar.setLayout(new FlowLayout(FlowLayout.LEFT));//将工具面板按钮用FlowLayout布局
  toolbar.add(backButton);
  toolbar.add(startButton);
  toolbar.add(exitButton);//将三个按钮添加到工具面板上
  startButton.addActionListener(lis);
  backButton.addActionListener(lis);
  exitButton.addActionListener(lis);//将三个按钮事件注册监听事件

2.5按钮事件的监听

private class MyItemListener implements ActionListener{
  public void actionPerformed(ActionEvent e) {
   Object obj=e.getSource();//获取事件源
   if(obj==startButton){
    System.out.println("重新开始...");//重新开始
    //JFiveFrame.this内部类引用外部类
    chessBoard.restartGame();
   }else if(obj==exitButton){
    System.exit(0);//结束应用程序
   }else if(obj==backButton){
    System.out.println("悔棋...");//悔棋
    chessBoard.goback();
   }
  }
 }

2.6重新开始按钮的功能实现

public void restartGame(){//清除棋子
  for(int i=0;i<chessList.length;i++)
   chessList[i]=null;
  /*恢复游戏相关的变量值*/
  isBack=true;
  gameOver=false;//游戏是否结束
  chessCount=0;//当前棋盘的棋子个数
  repaint();
 }

2.7悔棋按钮的功能实现

public void goback(){
  if(chessCount==0)
   return ;
  chessList[chessCount-1]=null;
  chessCount--;
  if(chessCount>0){
   xIndex=chessList[chessCount-1].getX();
   yIndex=chessList[chessCount-1].getY();
  }
  isBack=!isBack;
  repaint();
 }

2.8当棋盘根据需要变大或变小时窗口应随之发生改变

//Dimension:矩形ChessBoard类内部
 public Dimension getPreferredSize(){
  return new Dimension(MARGIN*2+GRID_SPAN*COLS,MARGIN*2+GRID_SPAN*ROWS);
 }
pack();//自适应大小StartChessBoard类内部

2.9定义棋子类

import java.awt.*;
public class Point {
 private int x;//棋子在棋盘中的x索引值
 private int y;//棋子在棋盘中的y索引值
 private Color color;//颜色
 public static int DIAMETER=30;//直径
 public Point(int x,int y,Color color){
  this.x=x;
  this.y=y;
  this.color=color;
 }
 //得到棋子在棋盘中的x索引值
 public int getX(){
  return x;
 }
 //得到棋子在棋盘中的y索引值
 public int getY(){
  return y;
 }
 //得到棋子颜色
 public Color getColor(){
  return color;
 }
}

三、功能部分代码实现

3.1初始化,定义一些要用到的量。

public static int MARGIN=30;//边距
 public static int GRID_SPAN=35;//网格间距
 public static int ROWS=18;//棋盘行数
 public static int COLS=18;//棋盘列数
 Point[] chessList=new Point[(ROWS+1)*(COLS+1)];//初始化每个数组元素为null
 boolean isBack=true;//默认开始是黑棋先下
 boolean gameOver=false;//游戏是否结束
 int chessCount;//当前棋盘的棋子个数
 int xIndex,yIndex;//当前刚下棋子的索引

3.2棋盘对象的构造方法

public ChessBoard(){
  setBackground(Color.LIGHT_GRAY);//设置背景颜色为灰色
  addMouseListener(this);//添加事件监听器
  addMouseMotionListener(new MouseMotionListener() {//匿名内部类 

   @Override
   public void mouseMoved(MouseEvent e) {
    int x1=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN;
    int y1=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//将鼠标单击的坐标位置转化为网格索引
    if(x1<0||x1>ROWS||y1<0||y1>COLS||gameOver||findChess(x1,y1)){//游戏已经结束,不能下;落在棋盘外,不能下;x,y位置已经有棋子存在,不能下
     setCursor(new Cursor(Cursor.DEFAULT_CURSOR));//设置成默认形状
    }else{
     setCursor(new Cursor(Cursor.HAND_CURSOR));//设置成手型
    }
   }
   @Override
   public void mouseDragged(MouseEvent e) {
   }
  });
 }

3.3设置鼠标监听器,变小手(在构造方法内部)

addMouseMotionListener(new MouseMotionListener() {//匿名内部类 

   @Override
   public void mouseMoved(MouseEvent e) {
    int x1=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN;
    int y1=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//将鼠标单击的坐标位置转化为网格索引
    if(x1<0||x1>ROWS||y1<0||y1>COLS||gameOver||findChess(x1,y1)){//游戏已经结束,不能下;落在棋盘外,不能下;x,y位置已经有棋子存在,不能下
     setCursor(new Cursor(Cursor.DEFAULT_CURSOR));//设置成默认形状
    }else{
     setCursor(new Cursor(Cursor.HAND_CURSOR));//设置成手型
    }
   }
   @Override
   public void mouseDragged(MouseEvent e) {
   }
  });

3.4点击棋盘时的鼠标按压事件

public void mousePressed(MouseEvent e) {//鼠标按键在组件上按下时调用
  if(gameOver)//游戏已经结束,不能下
   return ;
  String colorName=isBack ? "黑棋" : "白棋";
  xIndex=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN;
  yIndex=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//将鼠标单击的坐标位置转化为网格索引
  if(xIndex<0||xIndex>ROWS||yIndex<0||yIndex>COLS)//棋子落在棋盘外,不能下
   return ;
  if(findChess(xIndex,yIndex))//x,y位置已经有棋子存在,不能下
   return ;
  Point ch=new Point(xIndex,yIndex,isBack ? Color.black : Color.white);
  chessList[chessCount++]=ch;
  repaint();//通知系统重新绘制
  if(isWin()){
   String msg=String.format("恭喜,%s赢啦~", colorName);
   JOptionPane.showMessageDialog(this, msg);
   gameOver=true;
  }
  else if(chessCount==(COLS+1)*(ROWS+1))
  {
   String msg=String.format("棋鼓相当,棒棒哒~");
   JOptionPane.showMessageDialog(this,msg);
   gameOver=true;
  }
  isBack=!isBack;
 }

3.5绘制棋盘,棋子还有红框框

public void paintComponent(Graphics g){
  super.paintComponent(g);//画棋盘
  for(int i=0;i<=ROWS;i++){//画横线
   g.drawLine(MARGIN, MARGIN+i*GRID_SPAN, MARGIN+COLS*GRID_SPAN, MARGIN+i*GRID_SPAN);
  }
  for(int i=0;i<=COLS;i++){//画直线
   g.drawLine(MARGIN+i*GRID_SPAN, MARGIN, MARGIN+i*GRID_SPAN,MARGIN+ROWS*GRID_SPAN);
  }
  /*画棋子*/
  for(int i=0;i<chessCount;i++){
   int xPos=chessList[i].getX()*GRID_SPAN+MARGIN;//网格交叉的x坐标
   int yPos=chessList[i].getY()*GRID_SPAN+MARGIN;//网格交叉的y坐标
   g.setColor(chessList[i].getColor());//设置颜色
   g.fillOval(xPos-Point.DIAMETER/2, yPos-Point.DIAMETER/2, Point.DIAMETER, Point.DIAMETER);
   if(i==chessCount-1){
    g.setColor(Color.red);//标记最后一个棋子为红色
    g.drawRect(xPos-Point.DIAMETER/2, yPos-Point.DIAMETER/2, Point.DIAMETER, Point.DIAMETER);
   }
  }
 }

3.6判断输赢

/*判断哪方赢*/
 private boolean isWin(){
  int continueCount=1;//连续棋子的个数
  for(int x=xIndex-1;x>=0;x--){//横向向左寻找
   Color c=isBack ? Color.black : Color.white;
   if(getChess(x,yIndex,c)!=null){
    continueCount++;
   }else
    break;
  }
  for(int x=xIndex+1;x<=ROWS;x++){//横向向右寻找
   Color c=isBack ? Color.black : Color.white;
   if(getChess(x,yIndex,c)!=null){
    continueCount++;
   }else
    break;
  }
  if(continueCount>=5){//判断记录数大于等于五,即表示此方获胜
   return true;
  }else
   continueCount=1;
  //
  for(int y=yIndex-1;y>=0;y--){//纵向向上寻找
   Color c=isBack ? Color.black : Color.white;
   if(getChess(xIndex,y,c)!=null){
    continueCount++;
   }else
    break;
  }
  for(int y=yIndex+1;y<=ROWS;y++){//纵向向下寻找
   Color c=isBack ? Color.black : Color.white;
   if(getChess(xIndex,y,c)!=null){
    continueCount++;
   }else
    break;
  }
  if(continueCount>=5){//判断记录数大于等于五,即表示此方获胜
   return true;
  }else
   continueCount=1;
  //
  for(int x=xIndex+1,y=yIndex-1;y>=0&&x<=COLS;x++,y--){//右下寻找
   Color c=isBack ? Color.black : Color.white;
   if(getChess(x,y,c)!=null){
    continueCount++;
   }else
    break;
  }
  for(int x=xIndex-1,y=yIndex+1;y<=ROWS&&x>=0;x--,y++){//左上寻找
   Color c=isBack ? Color.black : Color.white;
   if(getChess(x,y,c)!=null){
    continueCount++;
   }else
    break;
  }
  if(continueCount>=5){//判断记录数大于等于五,即表示此方获胜
   return true;
  }else
   continueCount=1;
  //
  for(int x=xIndex-1,y=yIndex-1;y>=0&&x>=0;x--,y--){//左下寻找
   Color c=isBack ? Color.black : Color.white;
   if(getChess(x,y,c)!=null){
    continueCount++;
   }else
    break;
  }
  for(int x=xIndex+1,y=yIndex+1;y<=ROWS&&x<=COLS;x++,y++){//右上寻找
   Color c=isBack ? Color.black : Color.white;
   if(getChess(x,y,c)!=null){
    continueCount++;
   }else
    break;
  }
  if(continueCount>=5){//判断记录数大于等于五,即表示此方获胜
   return true;
  }else
   continueCount=1;
  return false;
 }

3.7弹出相应消息框(在鼠标按压函数内部)

if(isWin()){
   String msg=String.format("恭喜,%s赢啦~", colorName);
   JOptionPane.showMessageDialog(this, msg);
   gameOver=true;
  }
  else if(chessCount==(COLS+1)*(ROWS+1))//平局
  {
   String msg=String.format("棋鼓相当,棒棒哒~");
   JOptionPane.showMessageDialog(this,msg);
   gameOver=true;
  }

3.8上面用到的一个判断某点是否有棋子的函数

private boolean findChess(int x,int y){
  for(Point c:chessList){
   if(c!=null&&c.getX()==x&&c.getY()==y)
    return true;
  }
  return false;
 }

3.9因为该棋盘类实现了鼠标监听接口MonseListener,所以要重写该接口内的所有方法,其它方法如下

@Override
 public void mouseClicked(MouseEvent e) {//鼠标按键在组件上单击(按下并释放)时调用
 }
 @Override
 public void mouseReleased(MouseEvent e) {////鼠标按键在组件上释放时调用
 }
 @Override
 public void mouseEntered(MouseEvent e) {//鼠标进入组件时调用
 }
 @Override
 public void mouseExited(MouseEvent e){//鼠标离开组件时调用
 }

四、运行结果


五、代码汇总

该游戏总共建了三个类,一个是界面StartChessJFrame,一个是棋盘类ChessBoard,一个是棋子类Point

5.1StartChessJFrame类

package chess.lcc.com;
import javax.swing.*; 

import java.awt.event.*;
import java.awt.*;
/*
 * 五子棋的主框架,程序启动类
 */
public class StartChessJFrame extends JFrame {
 private ChessBoard chessBoard;//对战面板
 private Panel toolbar;//工具条面板
 private Button startButton;//设置开始按钮
 private Button backButton;//设置悔棋按钮
 private Button exitButton;//设置退出按钮 

 public StartChessJFrame(){
  setTitle("单机版五子棋");//设置标题
  chessBoard=new ChessBoard();//初始化面板对象,创建和添加菜单
  MyItemListener lis=new MyItemListener();//初始化按钮事件监听器内部类
  toolbar=new Panel();//工具面板栏实例化
  startButton=new Button("重新开始");
  backButton=new Button("悔棋");
  exitButton=new Button("退出");//三个按钮初始化
  toolbar.setLayout(new FlowLayout(FlowLayout.LEFT));//将工具面板按钮用FlowLayout布局
  toolbar.add(backButton);
  toolbar.add(startButton);
  toolbar.add(exitButton);//将三个按钮添加到工具面板上
  startButton.addActionListener(lis);
  backButton.addActionListener(lis);
  exitButton.addActionListener(lis);//将三个按钮事件注册监听事件
  add(toolbar,BorderLayout.SOUTH);//将工具面板布局到界面南方也就是下面
  add(chessBoard);//将面板对象添加到窗体上
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置界面关闭事件
  pack();//自适应大小
 }
 private class MyItemListener implements ActionListener{
  public void actionPerformed(ActionEvent e) {
   Object obj=e.getSource();//获取事件源
   if(obj==startButton){
    System.out.println("重新开始...");//重新开始
    //JFiveFrame.this内部类引用外部类
    chessBoard.restartGame();
   }else if(obj==exitButton){
    System.exit(0);//结束应用程序
   }else if(obj==backButton){
    System.out.println("悔棋...");//悔棋
    chessBoard.goback();
   }
  }
 }
 public static void main(String[] args) {
  StartChessJFrame f=new StartChessJFrame();//创建主框架
  f.setVisible(true);//显示主框架
 }
}

5.2ChessBoard类

package chess.lcc.com; 

import javax.swing.*; 

import java.awt.*;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseEvent;
/*五子棋-棋盘类*/
public class ChessBoard extends JPanel implements MouseListener{
 public static int MARGIN=30;//边距
 public static int GRID_SPAN=35;//网格间距
 public static int ROWS=15;//棋盘行数
 public static int COLS=15;//棋盘列数
 Point[] chessList=new Point[(ROWS+1)*(COLS+1)];//初始化每个数组元素为null
 boolean isBack=true;//默认开始是黑棋先下
 boolean gameOver=false;//游戏是否结束
 int chessCount;//当前棋盘的棋子个数
 int xIndex,yIndex;//当前刚下棋子的索引
 public ChessBoard(){
  setBackground(Color.LIGHT_GRAY);//设置背景颜色为黄色
  addMouseListener(this);//添加事件监听器
  addMouseMotionListener(new MouseMotionListener() {//匿名内部类 

   @Override
   public void mouseMoved(MouseEvent e) {
    int x1=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN;
    int y1=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//将鼠标单击的坐标位置转化为网格索引
    if(x1<0||x1>ROWS||y1<0||y1>COLS||gameOver||findChess(x1,y1)){//游戏已经结束,不能下;落在棋盘外,不能下;x,y位置已经有棋子存在,不能下
     setCursor(new Cursor(Cursor.DEFAULT_CURSOR));//设置成默认形状
    }else{
     setCursor(new Cursor(Cursor.HAND_CURSOR));//设置成手型
    }
   } 

   @Override
   public void mouseDragged(MouseEvent e) {
   }
  });
 }
 /*绘制*/
 public void paintComponent(Graphics g){
  super.paintComponent(g);//画棋盘
  for(int i=0;i<=ROWS;i++){//画横线
   g.drawLine(MARGIN, MARGIN+i*GRID_SPAN, MARGIN+COLS*GRID_SPAN, MARGIN+i*GRID_SPAN);
  }
  for(int i=0;i<=COLS;i++){//画直线
   g.drawLine(MARGIN+i*GRID_SPAN, MARGIN, MARGIN+i*GRID_SPAN,MARGIN+ROWS*GRID_SPAN);
  }
  /*画棋子*/
  for(int i=0;i<chessCount;i++){
   int xPos=chessList[i].getX()*GRID_SPAN+MARGIN;//网格交叉的x坐标
   int yPos=chessList[i].getY()*GRID_SPAN+MARGIN;//网格交叉的y坐标
   g.setColor(chessList[i].getColor());//设置颜色
   g.fillOval(xPos-Point.DIAMETER/2, yPos-Point.DIAMETER/2, Point.DIAMETER, Point.DIAMETER);
   if(i==chessCount-1){
    g.setColor(Color.red);//标记最后一个棋子为红色
    g.drawRect(xPos-Point.DIAMETER/2, yPos-Point.DIAMETER/2, Point.DIAMETER, Point.DIAMETER);
   }
  }
 } 

 @Override
 public void mousePressed(MouseEvent e) {//鼠标按键在组件上按下时调用
  if(gameOver)//游戏已经结束,不能下
   return ;
  String colorName=isBack ? "黑棋" : "白棋";
  xIndex=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN;
  yIndex=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//将鼠标单击的坐标位置转化为网格索引
  if(xIndex<0||xIndex>ROWS||yIndex<0||yIndex>COLS)//棋子落在棋盘外,不能下
   return ;
  if(findChess(xIndex,yIndex))//x,y位置已经有棋子存在,不能下
   return ; 

  Point ch=new Point(xIndex,yIndex,isBack ? Color.black : Color.white);
  chessList[chessCount++]=ch;
  repaint();//通知系统重新绘制
  if(isWin()){
   String msg=String.format("恭喜,%s赢啦~", colorName);
   JOptionPane.showMessageDialog(this, msg);
   gameOver=true;
  }
  else if(chessCount==(COLS+1)*(ROWS+1))
  {
   String msg=String.format("棋鼓相当,棒棒哒~");
   JOptionPane.showMessageDialog(this,msg);
   gameOver=true;
  }
  isBack=!isBack;
 } 

 @Override
 public void mouseClicked(MouseEvent e) {//鼠标按键在组件上单击(按下并释放)时调用
 } 

 @Override
 public void mouseReleased(MouseEvent e) {////鼠标按键在组件上释放时调用
 } 

 @Override
 public void mouseEntered(MouseEvent e) {//鼠标进入组件时调用
 } 

 @Override
 public void mouseExited(MouseEvent e){//鼠标离开组件时调用
 } 

 private boolean findChess(int x,int y){
  for(Point c:chessList){
   if(c!=null&&c.getX()==x&&c.getY()==y)
    return true;
  }
  return false;
 } 

 /*判断那方赢*/
 private boolean isWin(){
  int continueCount=1;//连续棋子的个数
  for(int x=xIndex-1;x>=0;x--){//横向向左寻找
   Color c=isBack ? Color.black : Color.white;
   if(getChess(x,yIndex,c)!=null){
    continueCount++;
   }else
    break;
  }
  for(int x=xIndex+1;x<=ROWS;x++){//横向向右寻找
   Color c=isBack ? Color.black : Color.white;
   if(getChess(x,yIndex,c)!=null){
    continueCount++;
   }else
    break;
  }
  if(continueCount>=5){//判断记录数大于等于五,即表示此方获胜
   return true;
  }else
   continueCount=1;
  //
  for(int y=yIndex-1;y>=0;y--){//纵向向上寻找
   Color c=isBack ? Color.black : Color.white;
   if(getChess(xIndex,y,c)!=null){
    continueCount++;
   }else
    break;
  }
  for(int y=yIndex+1;y<=ROWS;y++){//纵向向下寻找
   Color c=isBack ? Color.black : Color.white;
   if(getChess(xIndex,y,c)!=null){
    continueCount++;
   }else
    break;
  }
  if(continueCount>=5){//判断记录数大于等于五,即表示此方获胜
   return true;
  }else
   continueCount=1;
  //
  for(int x=xIndex+1,y=yIndex-1;y>=0&&x<=COLS;x++,y--){//右下寻找
   Color c=isBack ? Color.black : Color.white;
   if(getChess(x,y,c)!=null){
    continueCount++;
   }else
    break;
  }
  for(int x=xIndex-1,y=yIndex+1;y<=ROWS&&x>=0;x--,y++){//左上寻找
   Color c=isBack ? Color.black : Color.white;
   if(getChess(x,y,c)!=null){
    continueCount++;
   }else
    break;
  }
  if(continueCount>=5){//判断记录数大于等于五,即表示此方获胜
   return true;
  }else
   continueCount=1;
  //
  for(int x=xIndex-1,y=yIndex-1;y>=0&&x>=0;x--,y--){//左下寻找
   Color c=isBack ? Color.black : Color.white;
   if(getChess(x,y,c)!=null){
    continueCount++;
   }else
    break;
  }
  for(int x=xIndex+1,y=yIndex+1;y<=ROWS&&x<=COLS;x++,y++){//右上寻找
   Color c=isBack ? Color.black : Color.white;
   if(getChess(x,y,c)!=null){
    continueCount++;
   }else
    break;
  }
  if(continueCount>=5){//判断记录数大于等于五,即表示此方获胜
   return true;
  }else
   continueCount=1;
  return false;
 }
 private Point getChess(int xIndex,int yIndex,Color color){
  for(Point c:chessList){
   if(c!=null&&c.getX()==xIndex&&c.getY()==yIndex&&c.getColor()==color)
    return c;
  }
  return null;
 }
 public void restartGame(){//清除棋子
  for(int i=0;i<chessList.length;i++)
   chessList[i]=null;
  /*恢复游戏相关的变量值*/
  isBack=true;
  gameOver=false;//游戏是否结束
  chessCount=0;//当前棋盘的棋子个数
  repaint();
 }
 public void goback(){
  if(chessCount==0)
   return ;
  chessList[chessCount-1]=null;
  chessCount--;
  if(chessCount>0){
   xIndex=chessList[chessCount-1].getX();
   yIndex=chessList[chessCount-1].getY();
  }
  isBack=!isBack;
  repaint();
 }
 //Dimension:矩形
 public Dimension getPreferredSize(){
  return new Dimension(MARGIN*2+GRID_SPAN*COLS,MARGIN*2+GRID_SPAN*ROWS);
 } 

}

5.3Point类

package chess.lcc.com; 

import java.awt.*; 

public class Point {
 private int x;//棋子在棋盘中的x索引值
 private int y;//棋子在棋盘中的y索引值
 private Color color;//颜色
 public static int DIAMETER=30;//直径
 public Point(int x,int y,Color color){
  this.x=x;
  this.y=y;
  this.color=color;
 }
 //得到棋子在棋盘中的x索引值
 public int getX(){
  return x;
 }
 //得到棋子在棋盘中的y索引值
 public int getY(){
  return y;
 }
 //得到棋子颜色
 public Color getColor(){
  return color;
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Java五子棋单机版源码分享
  • Java实现五子棋网络版
  • Java实现两人五子棋游戏(七) 屏幕提示信息
  • Java实现两人五子棋游戏(六) 行棋方变换
  • Java实现两人五子棋游戏(五) 判断是否有一方胜出
  • Java实现两人五子棋游戏(四) 落子动作的实现
  • Java实现两人五子棋游戏(三) 画出棋子
  • Java实现两人五子棋游戏(二) 画出棋盘
  • Java实现五子棋AI算法
  • Java编程实现五子棋人人对战代码示例
(0)

相关推荐

  • Java实现两人五子棋游戏(六) 行棋方变换

    之前的两篇文章:Java实现两人五子棋游戏(二) 画出棋盘:Java实现两人五子棋游戏(三) 画出棋子:Java实现两人五子棋游戏(四) 落子动作的实现,可以点击查看. 前面我们已经画好棋盘和棋子,并可以自由落子,且可以判断棋盘中是否有五连珠.接下来的工作是,每次落子后交换行棋方(即将下一棋子颜色由白->黑或黑->白),并将胜出判断增加颜色判断条件(棋盘上存在五连珠->棋盘上存在同色的五连珠). 主模块Main.java和棋子类Chessman.java不变,我们要对DrawChessB

  • Java编程实现五子棋人人对战代码示例

    利用Java,在控制台操作下,编写的五子棋,作为复习二维数组,面向对象等基础知识.w表示白棋,b表示黑棋 import java.util.Scanner; public class MainMethod { public static char[][] c = new char[10][10]; public static void main(String[] args) { MainMethod mainMethod = new MainMethod(); mainMethod.init()

  • Java实现两人五子棋游戏(三) 画出棋子

    上一篇文章讲的是Java实现两人五子棋游戏(二) 画出棋盘,已经画好棋盘,接下来要实现控制功能,主要功能: 1)选择棋子 2)画棋子 3)判断胜负 4)交换行棋方 先实现画棋子PART -------------画棋子代码示例如下-------------- 首先,定义一个棋子类,这个类有两个属性,棋子颜色(0-表示黑色,1-表示白色),是否落子(我计划用一个二维数组才存储棋子的落子信息) Chessman.java package xchen.test.simpleGobang; public

  • Java实现五子棋网络版

    本文实例为大家分享了Java实现五子棋网络版的具体代码,供大家参考,具体内容如下 需求分析: 对于网络五子棋而言,在普通五子棋的基础上需要添加以下功能: 1.拥有服务器端和客户端,用户通过客户端登录服务器后可与其他登录的用户进行对弈 2.服务器支持多组用户同时进行对弈 3.用户可以在服务器上创建新游戏或加入已创建的游戏 4.用户在下棋的时候可以进行聊天交流 由上可以知道需要实现的功能: ·提供服务器和客户端的功能 ·服务器将监听客户端的登录情况并允许多个客户端进行登录 ·用户通过客户端可以登录服

  • Java实现两人五子棋游戏(七) 屏幕提示信息

    之前的两篇文章:Java实现两人五子棋游戏(二) 画出棋盘:Java实现两人五子棋游戏(三) 画出棋子:Java实现两人五子棋游戏(四) 落子动作的实现:Java实现两人五子棋游戏(六) 行棋方变换,可以点击查看. 接下来我们要实现的功能是在有五连珠的时候,在屏幕上提示信息.直接在mousePressed函数的isWin部分使用showMessageDialog即可. mousePressed函数代码如下: @Override //当用户按下鼠标按钮时发生 public void mousePr

  • Java实现五子棋AI算法

    五子棋AI算法 也算是一个典型的游戏AI算法,一些棋类的AI算法都可以参考实现,下面是Java实现代码 棋盘抽象接口 import java.util.List; public interface IChessboard { //取得棋盘最大横坐标 public int getMaxX(); //最大纵坐标 public int getMaxY(); //取得当前所有空白点,这些点才可以下棋 public List<Point> getFreePoints(); } 棋子类实现 //棋子类 p

  • Java实现两人五子棋游戏(四) 落子动作的实现

    之前的两篇文章:Java实现两人五子棋游戏(二) 画出棋盘:Java实现两人五子棋游戏(三) 画出棋子 前面,我们已经画好的棋盘和棋子,接下来,我们要通过鼠标点击屏幕获取落子位置并落子(先不考虑行棋方和胜负判断). 步骤: 1)捕捉鼠标按下的位置 2)经过坐标变换(由像素位置->0-19的棋盘位置) 3)更新记录棋盘状态的二维数组 4)重新渲染绘制棋盘. -------------落子动作代码示例如下-------------- 一个棋子类Chessman.java package xchen.

  • Java实现两人五子棋游戏(二) 画出棋盘

    本文为大家分享了java画出五子棋游戏棋盘的方法,供大家参考,具体内容如下 棋盘模块: 画五子棋棋盘:19条横线.19条竖线 步骤一:显示棋盘 我有一张名为chessboard.png的棋盘,位置为根目录/res/drawable/chessboard/png,现在我要显示这张图片. DrawChessBoard.java package xchen.test.simpleGobang; import java.awt.Graphics; import java.awt.Image; impor

  • Java实现两人五子棋游戏(五) 判断是否有一方胜出

    之前的两篇文章:Java实现两人五子棋游戏(二) 画出棋盘:Java实现两人五子棋游戏(三) 画出棋子:Java实现两人五子棋游戏(四) 落子动作的实现,可以点击查看. 前面我们已经画好了棋盘.棋子并且可以自由的落子了,那么接下来要实现的功能是判断是否有五连珠(暂时不考虑行棋方). 我们采用遍历棋盘已经落子的位置,查看每个落子点,在它的上下,左右,左下右上,左上右下四个方向的任一方向上是否有五个连续的棋子. 第一步,对棋子类进行改造,之前我们的棋子类只有颜色信息和落子状态,现在要新增一个int型

  • Java五子棋单机版源码分享

    初学JavaGUI编程,就写了一个小游戏–五子棋. 目前只实现了单机版,任何事情都是从简制作的,有问题请大牛们不吝指教啊. 此处的棋盘和棋子都未用图片,全部都是使用Java中的Graphics画出来的. 源码已提交至GitHub,点击此处GitHub源码 以下列出其中的五子棋类: import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Graphics; imp

随机推荐