当前位置: 首页 > 编程笔记 >

Java五子棋单机版源码分享

洪光霁
2023-03-14
本文向大家介绍Java五子棋单机版源码分享,包括了Java五子棋单机版源码分享的使用技巧和注意事项,需要的朋友参考一下

初学JavaGUI编程,就写了一个小游戏–五子棋。

目前只实现了单机版,任何事情都是从简制作的,有问题请大牛们不吝指教啊。

此处的棋盘和棋子都未用图片,全部都是使用Java中的Graphics画出来的。

源码已提交至GitHub,点击此处GitHub源码

以下列出其中的五子棋类:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class FiveInARow extends JFrame implements MouseListener {
 Vector v = new Vector(); //所有的每步走棋信息
 Vector white = new Vector(); //白方走棋信息
 Vector black = new Vector(); //黑方走棋信息
 boolean b; //用来判断白旗还是黑棋
 int whiteCount, blackCount; //计算悔棋步数
 int w = 25; //间距大小
 int px = 100, py = 100; //棋盘的大小
 int pxw = px + w, pyw = py + w;
 int width = w * 16, height = w * 16;
 int vline = width + px; //垂直线的长度
 int hline = height + py; //水平线的长度

 /**
  * 构造方法
  */
 public FiveInARow() {
  super("单机版五子棋");
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭按钮
  Container con = this.getContentPane();
  con.setLayout(new BorderLayout());
  this.addMouseListener(this);//添加监听
  this.setSize(600, 600);//设置窗体大小
  this.setBackground(Color.orange);
  this.setVisible(true);
 }

 /**
  * 画棋盘和棋子
  * @param e
  */
 public void paint(Graphics g) {
  g.clearRect(0, 0, this.getWidth(), this.getHeight());//清除画板
  g.setColor(Color.BLACK);//绘制网格颜色
  g.drawRect(px, py, width, height);//网格大小
  g.drawString("单机版五子棋小游戏,右击可以悔棋,欢迎使用", 180, 70);

  for (int i=0; i<15; i++) {
   g.drawLine(pxw+i*w, py, pxw+i*w, hline);//每条横线和竖线
   g.drawLine(px, pyw+i*w, vline, pyw+i*w);
  }

  for (int x=0; x<v.size(); x++) {
   String str = (String)v.get(x);
   String tmp[] = str.split("-");
   int a = Integer.parseInt(tmp[0]);
   int b = Integer.parseInt(tmp[1]);
   a = a * w + px;
   b = b * w + py;
   if (x%2 == 0) {
    g.setColor(Color.WHITE);
   } else {
    g.setColor(Color.BLACK);
   }
   g.fillArc(a-w/2, b-w/2, w, w, 0, 360);
  }
 }

 @Override
 public void mouseClicked(MouseEvent e) {
  if (e.getButton() == e.BUTTON1) {
   int x = e.getX();
   int y = e.getY();
   x = (x - x % w) + (x % w > w / 2 ? w : 0);
   y = (y - y % w) + (y % w > w / 2 ? w : 0);
   x = (x - px) / w;
   y = (y - py) / w;

   if (x >= 0 && y >= 0 && x <= 16 && y <= 16) {
    if (v.contains(x+"-"+y)) {
     System.out.println("已经有棋了!");
    } else {
     v.add(x+"-"+y);
     this.repaint();
     if (v.size() % 2 == 0) {
      black.add(x+"-"+y);
      this.victory(x, y, black);
//      System.out.println("黑棋");
     } else {
      white.add(x+"-"+y);
      this.victory(x, y, white);
//      System.out.println("白棋");
     }
//     System.out.println(e.getX()+"-"+e.getY());
    }
   } else {
//    System.out.println(e.getX()+"-"+e.getY()+"|"+x+"-"+y+"\t超出边界了");
   }
  }

  if (e.getButton() == e.BUTTON3) { //右击悔棋的方法
//   System.out.println("鼠标右击--悔棋");
   if (v.isEmpty()) {
    JOptionPane.showMessageDialog(this, "没有棋可悔");
   } else {
    if (v.size() % 2 == 0) { //判断是白棋悔棋,还是黑棋悔棋
     blackCount++;
     if (blackCount > 3) {
      JOptionPane.showMessageDialog(this, "黑棋已经悔了3步");
     } else {
      v.remove(v.lastElement());
      this.repaint();
     }
    } else {
     whiteCount++;
     if (whiteCount > 3) {
      JOptionPane.showMessageDialog(this, "白棋已经悔了3步");
     } else {
      v.remove(v.lastElement());
      this.repaint();
     }
    }
   }
  }
 }

 /**
  * 判断胜利的方法
  * @param x
  * @param y
  * @param contain
  */
 private void victory(int x, int y, Vector contain) {
  int cv = 0; //垂直方向棋子数量
  int ch = 0; //水平方向棋子数量
  int ci1 = 0; //斜面方向棋子数量1
  int ci2 = 0; //斜面方向棋子数量2

  //计算水平方向棋子数量
  for (int i=1; i<5; i++) {
   if (contain.contains((x+i)+"-"+y)) {
    ch++;
   } else {
    break;
   }
  }
  for (int i=1; i<5; i++) {
   if (contain.contains((x-i)+"-"+y)) {
    ch++;
   } else {
    break;
   }
  }

  //计算垂直方向棋子数量
  for (int i=1; i<5; i++) {
   if (contain.contains(x+"-"+(y+i))) {
    cv++;
   } else {
    break;
   }
  }
  for (int i=1; i<5; i++) {
   if (contain.contains(x+"-"+(y-i))) {
    cv++;
   } else {
    break;
   }
  }

  //计算45°斜面方向棋子数量
  for (int i=1; i<5; i++) {
   if (contain.contains((x+i)+"-"+(y+i))) {
    ci1++;
   } else {
    break;
   }
  }
  for (int i=1; i<5; i++) {
   if (contain.contains((x-i)+"-"+(y-i))) {
    ci1++;
   } else {
    break;
   }
  }

  //计算135°斜面方向棋子数量
  for (int i=1; i<5; i++) {
   if (contain.contains((x+i)+"-"+(y-i))) {
    ci2++;
   } else {
    break;
   }
  }
  for (int i=1; i<5; i++) {
   if (contain.contains((x-i)+"-"+(y+i))) {
    ci2++;
   } else {
    break;
   }
  }

  if (ch>=4 || cv>=4 ||ci1>=4 ||ci2>=4) {
   System.out.println(v.size()+"步棋");
   if (v.size() % 2 == 0) {
    //判断是黑棋赢,还是白棋赢
    JOptionPane.showMessageDialog(null, "黑棋赢了");
   } else {
    JOptionPane.showMessageDialog(null, "白棋赢了");
   }
   this.v.clear();
   this.black.clear();
   this.white.clear();
   this.repaint();
  }
 }

 @Override
 public void mouseEntered(MouseEvent e) {
  // TODO Auto-generated method stub

 }

 @Override
 public void mouseExited(MouseEvent e) {
  // TODO Auto-generated method stub

 }

 @Override
 public void mousePressed(MouseEvent e) {
  // TODO Auto-generated method stub

 }

 @Override
 public void mouseReleased(MouseEvent e) {
  // TODO Auto-generated method stub

 }

}

PS:打算再写个网络版的五子棋,可惜对Java中网络不太清楚,得学习一段时间后再继续完成了,检验下个人学习成果。

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

 类似资料:
  • 本文向大家介绍java实现单机版五子棋,包括了java实现单机版五子棋的使用技巧和注意事项,需要的朋友参考一下 这个小游戏是我和我姐们儿的JAVA课程设计,也是我做的第一个JAVA项目,适合初学者,希望能帮到那些被JAVA课设所困扰的孩纸们~~~ 一、该游戏需要实现 1、设计主框架,界面。 2、利用ActionListener接口实现按钮事件的监听。 3、重新开始功能的实现。 4、悔棋功能的实现。

  • 五子棋单机版: 规则:5子连成一线者胜 特色: 1、单人游戏,对于人机对战此款小游戏具备一定的智能性。 2、双人对战,更支持多人混战 3、棋盘残局保存功能 1、游戏主界面 2、设置界面 可以设置棋盘的相关属性,棋盘行列数,玩家数目,棋盘背景,游戏难易度,等。 3、残局恢复 (1)单击选择曾经的游戏日期,当天的所有游戏记录会显示到列表中。 (2)双击游戏对应的游戏记录,即可恢复至对应的棋局。

  • 本文向大家介绍Java棋类游戏实践之单机版五子棋,包括了Java棋类游戏实践之单机版五子棋的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java实现的五子棋游戏代码,分享给大家供大家参考,具体代码如下 一、实践目标     1.掌握JavaGUI界面设计        2.掌握鼠标事件的监听(MouseListener,MouseMotionListener) 二、实践内容      

  • 本文向大家介绍java实现单人版五子棋游戏,包括了java实现单人版五子棋游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java实现的五子棋游戏代码,分享给大家供大家参考,具体代码如下 效果图: 以上所述就是本文的全部内容了,希望能够对大家熟练掌握java有所帮助。

  • 本文向大家介绍Java实现五子棋网络版,包括了Java实现五子棋网络版的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Java实现五子棋网络版的具体代码,供大家参考,具体内容如下 需求分析: 对于网络五子棋而言,在普通五子棋的基础上需要添加以下功能: 1.拥有服务器端和客户端,用户通过客户端登录服务器后可与其他登录的用户进行对弈 2.服务器支持多组用户同时进行对弈 3.用户可以在服务

  • 本文向大家介绍java绘制五子棋棋盘,包括了java绘制五子棋棋盘的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java绘制五子棋棋盘的具体代码,供大家参考,具体内容如下 源码: 效果图: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。