用java实现简单五子棋人人对战
程序员文章站
2022-05-23 11:08:21
...
用java实现简单五子棋人人对战,对于初学者还是比较好玩的。
接下来 看下我写的五子棋程序
我们将它分为三个类
1.主窗体类
2.鼠标事件处理器
3.判断一方是否胜利
比较简单,望大家多多指正
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;
}
}
}
}
}
/**************************************************************************************************************************************/
接下来 看下我写的五子棋程序
我们将它分为三个类
1.主窗体类
2.鼠标事件处理器
3.判断一方是否胜利
比较简单,望大家多多指正
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;
}
}
}
}
}
/**************************************************************************************************************************************/
上一篇: 玫瑰花怎么保存的时间长,玫瑰花不止可以看,还可以吃呢
下一篇: 快速排序