欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用java实现简单五子棋人人对战

程序员文章站 2022-05-23 11:08:21
...
用java实现简单五子棋人人对战,对于初学者还是比较好玩的。
接下来 看下我写的五子棋程序
我们将它分为三个类
1.主窗体类
2.鼠标事件处理器
3.判断一方是否胜利
比较简单,望大家多多指正

用java实现简单五子棋人人对战
            
    
    博客分类: java基础

  

1.主窗体类
/**************************************************************************************************************************************/
package cn.lantian.Fivezq;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;

public class WuzqFrame extends JFrame {
/**
* 五子棋
*
* @兰天
*/
//入口主函数
public static void main(String[] args) {
WuzqFrame wzq = new WuzqFrame();
wzq.init();
}

public void init() {
chushi();// 初始化棋盘
//基本设置
this.setTitle("五子棋");
this.setSize(520, 535);
this.setDefaultCloseOperation(3);
//设置居中
this.setLocationRelativeTo(null);
//用户不可调整大小
this.setResizable(false);
this.setVisible(true);
//获取窗体的画布
Graphics g = this.getGraphics();
//定义鼠标监听类
wzqListener wzql = new wzqListener(g,this);
//添加鼠标监听
this.addMouseListener(wzql);
}
    //对窗体进行重绘
public void paint(Graphics g) {
//调用父类的方法,super
super.paint(g);
//画棋盘
for (int i = 0; i < n + 1; i++) {
g.drawLine(x + i * size, y, x + i * size, y + n * size);
}
for (int i = 0; i < n + 1; i++) {
g.drawLine(x, y + i * size, x + n * size, y + i * size);
}
for (int i=0;i<n;i++)
  for (int j=0;j<n;j++)
if (s[i][j]==1){
g.fillOval(x +i* WuzqFrame.size-WuzqFrame.size/2 , y + j*WuzqFrame.size-WuzqFrame.size/2 ,
WuzqFrame.qsize, WuzqFrame.qsize);
}else if (s[i][j]==-1){
//将颜色改为白色
g.setColor(Color.WHITE);
g.fillOval(x +i* WuzqFrame.size-WuzqFrame.size/2 , y + j*WuzqFrame.size-WuzqFrame.size/2 ,
WuzqFrame.qsize, WuzqFrame.qsize);
//定义黑色为初始色
g.setColor(Color.BLACK);
}


}

    //定义起始直线坐标
public static int x = 30, y = 50;
//棋子的多少及格子大小
public static int n = 15, size = 30, qsize = 30;
//定义一个数组来存储棋子
public static int[][] s = new int[n][n];
    //初始方法,数组全赋为0
public void chushi() {
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
s[i][j] = 0;
}
}
/**************************************************************************************************************************************/




2.鼠标事件处理器
/**************************************************************************************************************************************/
package cn.lantian.Fivezq;


import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
//棋盘鼠标监听器
public class wzqListener implements MouseListener {
private Graphics g;
//用来确定下什么棋
public static int t = 1;
private WuzqFrame wzq;
    //构造器,将画布传过来
public wzqListener(Graphics g,WuzqFrame wzq) {
this.g = g;
this.wzq = wzq;
}

public void mousePressed(MouseEvent e) {
//获得要下的棋子的行和列
int x1=Math.round((float) (e.getX() - WuzqFrame.x) / WuzqFrame.size);
int y1=Math.round((float) (e.getY() - WuzqFrame.y) / WuzqFrame.size);
//判断行列是否出界,及是否放了棋子
if(x1>=0&&x1<WuzqFrame.n&&y1>=0&&y1<WuzqFrame.n&&WuzqFrame.s[x1][y1]==0){
  //棋子放在棋盘上后,数组做相应标示
  WuzqFrame.s[x1][y1] = t;
  //重绘棋盘
  wzq.repaint();
  //调用QiziPd类中的方法,来判断输赢
  QiziPd.pd(t, x1, y1,g,wzq);
  //改变棋子颜色
  t = -t;
}
}

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

}

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

}

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

}

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

}

}
/**************************************************************************************************************************************/







3.判断一方是否胜利
/**************************************************************************************************************************************/
package cn.lantian.Fivezq;

import java.awt.Graphics;

import javax.swing.JOptionPane;

//判断胜负
public class QiziPd {
// 将一些重要参数的值传过来
public static int[][] s = WuzqFrame.s;
private static int n = WuzqFrame.n;
// 构建两个移动数组(暂且这么说)
private static int[] a = { -1, -1, 0, 1, 1, 1, 0, -1 };
private static int[] b = { 0, 1, 1, 1, 0, -1, -1, -1 };

// 判断方法,z为棋子颜色的标志,x y 为下的棋子的行与列
public static void pd(int z, int x, int y, Graphics g, WuzqFrame wzq) {
// 四个方向横、竖、左斜、右斜
for (int i = 0; i < 4; i++) {
// 记录在一条直线上的棋子数(不包括下的棋子)
int temp = 0;
// 里面以棋子为界,又分两个方向
for (int j = 0; j < 2; j++) {
int x1 = x, y1 = y;
// 判断同一直线上的棋子数
while (temp < 4) {
// 算出那条直线上的棋子的坐标
x1 = x1 + a[i + 4 * j];
y1 = y1 + b[i + 4 * j];
// 如果在棋盘内,继续循环,否则退出循环
if (x1 < 0 || x1 >= n || y1 < 0 || y1 >= n)
break;
else {
// 如果这条直线上有自己颜色的棋子,则temp++,否则退出
if (s[x1][y1] == z) {
temp++;
} else
break;
}
}
// 如果连着的棋子数为4(没有包括自己,总数是五)
if (temp == 4) {
// 弹出谁赢了的提示框
if (z == 1) {
JOptionPane.showMessageDialog(null, "黑棋赢了,再来一盘吧!");
} else {
JOptionPane.showMessageDialog(null, "白棋赢了,再来一盘吧!");
}
//初始数组
wzq.chushi();
//重绘棋盘
wzq.repaint();
//先下的 棋子为黑子,t改为白子,后面的语句会改过来
wzqListener.t=-1;
break;
}
}
}

}

}
/**************************************************************************************************************************************/
  • 用java实现简单五子棋人人对战
            
    
    博客分类: java基础
  • 大小: 18.3 KB