小言_互联网的博客

模仿五子棋类似小游戏升级版(含界面)

297人阅读  评论(0)

模仿五子棋类似小游戏(升级版含界面)

运行截图

代码

Wzq.java

package com.zjw20200221;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

// 继承JFrame来一个背景图片,那么,我们最快捷的操作,是让类,继承JFrame
public class Wzq extends JFrame{
   
	public static int[][] qp = new int[15][15];
	public static int flag = 1; // 0是白旗 1黑旗


	// 先来创建JFrame
	public void start() {
   
		// this this指向,指当前对象 ——> Wzq ——> extends JFrame  ——> JFrame
		this.setTitle("五子棋");
		this.setSize(768, 796);
		this.setResizable(false);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setIconImage(
				Toolkit.getDefaultToolkit().getImage(
						Wzq.class.getResource("/image/yc.png")));

		// 可见
		this.setVisible(true);

		// 获取到绘图对象
		Graphics g = this.getGraphics();

		// 添加鼠标的点击事件
		this.addMouseListener(new MouseAdapter() {
   
			@Override
			public void mouseClicked(MouseEvent e) {
   
				// 得到我们的坐标位置 在我们数组里面,x代表行,y代表列 ,与坐标抽的xy恰恰相反
				int x = (e.getY() - 38) / 50;
				int y = (e.getX() - 10) / 50;
				// System.out.println(x + "-" + y);

				// 每次下棋先判断一下,这个地方有没有被下过
				if (qp[x][y] != 0) {
    // Wzq.this   ->  this  this的应用指向
					JOptionPane.showMessageDialog(Wzq.this, "此处已经有子", "警告", JOptionPane.WARNING_MESSAGE);
					return; // 不让代码继续往下了
				}

				// 如果没有子了,那就开始下棋
				if (flag == 1) {
    // 说明是白子
					qp[x][y] = 1;
					g.setColor(Color.WHITE);
				} else {
   
					qp[x][y] = 2;
					g.setColor(Color.BLACK);
				}
				// 开始画图,还是上面说的,xy跟我们的xy是相反的
				g.fillOval(y * 50 + 10, x * 50 +38, 50, 50);

				// 
				if (isWin(x, y)) {
   
					// 胜利
					String str = flag == 1 ? "白子" : "黑子";// 三元运算符
					int index = JOptionPane.showConfirmDialog(Wzq.this,
							"游戏结束," + str + "获取胜利!\n是否再来一局", "游戏结束",
							JOptionPane.YES_NO_OPTION);
					if (index == 1) {
   
						// 1代表否
						System.exit(0); // 强行终止程序
					}
					// 再来一局
					flag = 2;
					// 数组全部改成0
					for (int i = 0; i < qp.length; i++) {
   
						for (int j = 0; j < qp[i].length; j++) {
   
							qp[i][j] = 0;
						}
					}
					// 重绘棋盘
					Wzq.this.repaint();
				}
				// 没有赢,则继续,换另一个玩家下棋
				flag = flag % 2 + 1;
			}
		});
	}

	// 判断输赢
	private static boolean isWin(int x, int y) {
   
		// 如何判断赢了
		// 以自身为原点,向上,向下,向左,向右,都扩4列,最极限的情况下,我们下的位置,是第五子
		// 先看横的
		int count = 0;
		for (int i = y - 4; i <= y + 4; i++) {
   
			// i 不能小于0 	i 不能大于等于12 	不能超过边界
			if (i < 0 || i >= qp[0].length) {
   
				continue;
			}
			// 判断,是否有连的5个值
			if (qp[x][i] == flag) {
   
				count ++;
				if (count >= 5) {
   
					// 胜利
					return true;
				}
			} else {
   
				// 中间制药有一个不相等,累积就清空,变成0
				count = 0;
			}
		}
		// 接着判断竖的
		for (int i = x - 4; i <= x + 4; i++) {
   
			// i 不能小于0 	i不能大于等于12 	不能超过边界
			if (i < 0 || i >= qp.length) {
   
				continue;
			}
			if (qp[i][y] == flag) {
   
				count ++;
				if (count >= 5) {
   
					// 胜利
					return true;
				}
			} else {
   
				// 中间只要有一个不相等, 累积就清空,变成0
				count = 0;
			}
		}

		// 二个对角,襒 	重点: x , y 都要改变
		for (int i = x - 4, j = y - 4 ; i <= y + 4 && j <= y + 4; i++, j++) {
   
			if (i < 0 || i >= qp.length || j < 0 || j >= qp[0].length) {
   
				continue;
			}
			if (qp[i][j] == flag) {
   
				count ++;
				if (count >= 5) {
   
					// 胜利
					return true;
				}
			} else {
   
				// 中间只要有一个不相等, 累积就清空,变成0
				count = 0;
			}
		}

		count = 0;

		// 捺
		for (int i = x + 4, j = y - 4; i >= x - 4 && j <= y + 4; i--, j++) {
   
			if (i < 0 || i >= qp.length || j < 0 || j > qp[0].length) {
   
				continue;
			}
			if (qp[i][j] == flag) {
   
				count ++;
				if (count >= 5) {
   
					// 胜利
					return true;
				}
			} else {
   
				// 中间只要有一个不相等,累积就清空,变成0
				count = 0;
			}
		}

		return false;
	}
	
	// 继承JFrame,那么,在创建的时候,会自动的调用这个方法
	public void paint(Graphics g) {
   
		// 定义背景图片
		Image bgImage = Toolkit.getDefaultToolkit().getImage(
				Wzq.class.getResource("/image/chessboard.jpg"));
		// 画图
		g.drawImage(bgImage, 4, 32, 760, 760, this);

		g.dispose();

	}
}


Test.java

package com.zjw20200221;

public class Test {
   
	public static void main(String[] args) {
   
		// 实例化对象
		Wzq wzq = new Wzq();
		// 调用这个对象里面的方法
		wzq.start();
	}
}

gitee源代码下载:https://gitee.com/zhangjiawei88/wuziqi.git


转载:https://blog.csdn.net/qq_43414422/article/details/109919860
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场