??Java??实现“五子棋”小游戏??

2021/9/18 17:05:31

本文主要是介绍??Java??实现“五子棋”小游戏??,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

五子棋游戏程序源代码以及实现页面

需要各种小游戏源程序(贪吃蛇,火柴人,五子棋,手机界面空调等等二十款小游戏),私信我!!!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.要求
(1)对局双方各执一色棋子。
(2)空棋盘开局。
(3)交替下子,每次只能下一子。
(4)棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动,不得从棋盘上拿掉或拿起另落别处。
(5)第一枚棋子可下在棋盘任意交叉点上。
2.工作负荷
(1)具有菜单界面。
(2)空棋盘开局。
(3)交替下子,每次只能下一子。
(4)棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动,不得从棋盘上拿掉或拿起另落别处。
(5)第一枚棋子可下在棋盘任意交叉点上。
(6)五子连线后能判断输赢

3.程序描述
设计棋子坐标及大小代码
package game;

import java.awt.Color;//提供用于颜色空间的类。
import java.awt.Graphics;//该类是所有图形上下文的抽象基础类,允许应用程序绘制到在各种设备上实现的组件以及屏幕外图像上。
import java.awt.Graphics2D;//该类扩展了图形类,以提供对几何形状、坐标转换、色彩管理和文本布局的更复杂的控制。
import java.awt.RadialGradientPaint;//该类提供了一种用圆形径向色梯度图案填充形状的方法。用户可以指定 2 种或更多梯度颜色,此油漆将在每个颜色之间提供插值。
import java.awt.RenderingHints;//该类定义和管理密钥集合和相关值,允许应用程序为执行渲染和图像操作服务的其他类别使用的算法选择提供输入。

public class Chess {//定义棋类的属性
	Chessboard cp; 	//棋盘
	int row;		//横坐标
	int col;		//纵坐标
	Color color;	//棋子颜色
	
	public Chess(Chessboard cp, int col, int row, Color color) {
		this.cp = cp;
		this.col = col;
		this.row = row;
		this.color = color;
	}//构造方法 画棋子

	public Color getColor() {//返回颜色
		return color;
	}

	public void setColor(Color color) {//修改颜色
		this.color = color;
	}

	public int getRow() {//返回横坐标
		return row;
	}

	public void setRow(int row) {//修改横坐标
		this.row = row;
	}

	public int getCol() {//返回纵坐标
		return col;
	}

	public void setCol(int col) {//修改纵坐标
		this.col = col;
	}

	public static final int BANJING = 18;//定义静态变量半径
	
    public void draw(Graphics g) {
		//定义棋子圆心
		Graphics2D g2d = (Graphics2D) g;//强制将Graphics的g的值转换为Graphics2D的值
		int xPos = col * 20 + 15;
		int yPos = row * 20 + 15;//棋子落点的x坐标与y坐标
        RadialGradientPaint paint = null;
		Color[] c = { Color.WHITE, Color.black };//棋的颜色分为两种,黑色和白色
		float[] f = { 0f, 1f };//提供一个 float 数组,用于指定如何沿渐变分布颜色。这些值的范围从 0.0 到 1.0,其作用与沿渐变的关键帧类似(它们标记渐变应完全变为某种特定颜色的位置)。
		int x = xPos + 3 ;
		int y = yPos + 3; //使棋子位于棋盘交叉线上
		if (color == Color.WHITE) {
			paint = new RadialGradientPaint(x, y, BANJING * 3, f, c);
		} else {
			paint = new RadialGradientPaint(x, y, BANJING, f, c);
		}
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);//消除锯齿
		g2d.setPaint(paint);//赋予棋子颜色
		g2d.fillOval(xPos - BANJING / 2, yPos - BANJING / 2, BANJING, BANJING);
		//使棋子画在棋谱上,xPos-BANJING/2,yPos-BANJING/2指的是填充椭圆的左上角的x与y坐标(变),BANJING, BANJING决定了棋子大小(不变)
	}
}

4程序2(标识符)设计说明
4.1程序描述
定义棋盘大小,棋子步数,棋子位置,判断胜利,判断棋盘上是否存在棋子,棋子是否下在合理位置上,提示什么棋子该下(黑子下完提示白子下,且落子为白子),修改棋盘颜色,修改棋盘线条颜色,设置文字大小及颜色,显示文字提示,定义重新开始游戏动作与悔棋动作。
package game;

import java.awt.BasicStroke;//该类定义了图形原始图轮廓的基本渲染属性集,这些属性由图形2D对象呈现,其笔画属性设置为此属性。描述由笔沿着形状轮廓绘制的标记的形状和在路径段的末端和连接上应用的装饰物所定义的渲染属性。
import java.awt.Color;
import java.awt.Font;//设置字体的类
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;//MouseAdapter的类是一个抽象类(适配器)用于接收鼠标事件。这个类的所有方法都是空的。这个类是方便的类创建侦听器对象。
import java.awt.event.MouseEvent;//表示鼠标操作发生在组件中的事件。如果并且仅当鼠标光标在操作发生时超出组件边界的未遮挡部分时,则鼠标操作应被视为发生在特定组件中。对于轻量级组件(如 Swing 的组件),仅在组件上启用了鼠标事件类型时,才会将鼠标事件发送到组件。鼠标事件类型通过将基于鼠标的相应鼠标添加到组件(鼠标列表或鼠标运动听器)或调用组件启用。启用具有相应掩码参数(或)的"启用事件(长)"。如果组件上未启用鼠标事件类型,则将相应的鼠标事件发送到启用鼠标事件类型的第一个祖先。
import javax.swing.JOptionPane;//它提供标准方法来弹出值的标准对话框或通知用户某些内容。
import javax.swing.JPanel;//JFrame 用来设计类似于 Windows 系统中窗口形式的界面。

public class Chessboard extends JPanel {
	public static final int MARGIN = 15;
	public static final int SPAN = 20;
	public static final int ROWS = 19;
	public static final int COLS = 19;
	Chess[] chessList = new Chess[20 * 20]; //表示棋子位置
	int chessCount = 0;//代表所下棋子步数
	boolean iso = false;
	boolean isBlack = true;
	String message = "请开始";//提示信息
	private boolean isWin(int col, int row) {//判断胜利的函数
		boolean result = false;
		int CountCh = 1;
		Color c = null;
		if (isBlack) {
			c = Color.BLACK;
		} else {
			c = Color.WHITE;
		}

		// 水平向左连接
		for (int x = col - 1; x >= 0; x--) {
			if (exist(x, row, c)) {//判断某位置是否已经存在棋子
				CountCh++;
			} else {
				break;
			}
		}
		// 水平向右连接
		for (int x = col + 1; x <= 19; x++) {
			if (exist(x, row, c)) {
				CountCh++;
			} else {
				break;
			}
		}
		// 水平连接取胜
		if (CountCh >= 5) {
			result = true;
			message = "游戏结束";
		} else {
			result = false;
			CountCh = 1;
		}
		// 竖直向上连接
		for (int y = row - 1; y >= 0; y--) {
			if (exist(col, y, c)) {
				CountCh++;
			} else {
				break;
			}
		}
		// 竖直向下连接
		for (int y = row + 1; y <= 19; y++) {
			if (exist(col, y, c)) {
				CountCh++;
			} else {
				break;
			}
		}
		// 竖直连接取胜
		if (CountCh >= 5) {
			result = true;
			message = "游戏结束";
		} else {
			result = false;
			CountCh = 1;
		}
		// 斜向连接右上
		for (int x = col + 1, y = row - 1; x <= 19 && y >= 0; x++, y--) {
			if (exist(x, y, c)) {
				CountCh++;
			} else {
				break;
			}
		}
		// 斜向连接左下
		for (int x = col - 1, y = row + 1; x >= 0 && y <= 19; x--, y++) {
			if (exist(x, y, c)) {
				CountCh++;
			} else {
				break;
			}
		}
		// 斜向连接取胜
		if (CountCh >= 5) {
			result = true;
			message = "游戏结束";
		} else {
			result = false;
			CountCh = 1;
		}
		// 斜向连接左上
		for (int x = col - 1, y = row - 1; x >= 0 && y >= 0; x--, y--) {
			if (exist(x, y, c)) {
				CountCh++;
			} else {
				break;
			}
		}
		// 斜向连接右下
		for (int x = col + 1, y = row + 1; x <= 19 && y <= 19; x--, y--) {
			if (exist(x, y, c)) {
				CountCh++;
			} else {
				break;
			}
		}
		// 斜向连接取胜
		if (CountCh >= 5) {
			result = true;
			message = "游戏结束";
		} else {
			result = false;
			CountCh = 1;
		}

		return result;
	}
	
	
	private boolean exist(int col, int row) {//用于判断棋盘上某位置是否已经存在棋子,存在则返回true
		boolean result = false;
		for (int i = 0; i < chessCount; i++) {
			Chess cc = chessList[i];
			if (cc != null && cc.getCol() == col && cc.getRow() == row) {
				return true;
			}
		}
		return result;
	}
	
	private boolean exist(int col, int row, Color c) {//重载exist函数
		Boolean result = false;
		for (int i = 0; i < chessCount; i++) {
			Chess ch = chessList[i];
			if (ch != null && ch.getCol() == col && ch.getRow() == row && ch.getColor() == c) {
				result = true;
			}
		}
		return result;
	}
	public Chessboard() {
		this.addMouseListener(new MouseAdapter() {//使用组件的 addMouseListener 方法将从该类所创建的侦听器对象向该组件注册。当按下、释放或单击(按下并释放)鼠标时会生成鼠标事件,让棋子出现在棋盘上

		        public void mousePressed(MouseEvent dianji) {//mousePressed指的是鼠标按键在组件上按下时调用。
				if (iso) {
					return;
				}
				int col, row;
				col = (dianji.getX() - 15 + 10) /20;
				row = (dianji.getY() - 15 + 10) / 20;

				if (col > 19 || col < 0 || row > 19 || row < 0) {
					return;//点击非棋盘上的地方不做出响应
				} else {
					if (exist(col, row)) {
						return;//已经存在棋子的地方不能再下棋子
					} else {
						Color yanse = Color.BLACK;//最开始黑棋先下
						if (isBlack) {
							yanse = Color.BLACK;
							message = "轮到白棋";//黑棋下完显示白棋下
						} else {
							yanse = Color.WHITE;
							message = "轮到黑棋";//白棋下完提示黑棋下
						}
						Chess location = new Chess(Chessboard.this, col, row, yanse);//新建一个用例表示棋子的位置
						chessList[chessCount++] = location;//实现用例,让位置在棋盘上显示出来
						repaint();//刷新

						if (isWin(col, row)) {//isWin是判断胜利的函数
							if (yanse == Color.BLACK) {
								JOptionPane.showMessageDialog(Chessboard.this, "黑棋获胜!");
							} else if (yanse == Color.WHITE) {
								JOptionPane.showMessageDialog(Chessboard.this, "白棋获胜!");//指表示出消息对话框
							}
							iso = true;
							return;
						}
						isBlack = !isBlack;
					}
				}
			}
		});
	}

	public void paint(Graphics qipan) {
		qipan.setColor(Color.blue);//修改棋盘颜色
		qipan.fillRect(0, 0, 410, 460);//在画布上绘制已填充的矩形
		qipan.setColor(Color.pink);//修改棋盘线的颜色
		for (int i = 0; i < 20; i++) {
			qipan.drawLine(MARGIN, MARGIN + SPAN * i, MARGIN + 19 * 20, MARGIN + 20 * i);
		}
		for (int i = 0; i < 20; i++) {
		    qipan.drawLine(15 + SPAN * i, 15, 15 + SPAN * i, 15 + 19 * 20);
		}

		qipan.fillRect(73, 73, 5, 5);
		qipan.fillRect(193,73, 5, 5);
		qipan.fillRect(313, 73, 5, 5);
		qipan.fillRect(73, 193, 5, 5);
		qipan.fillRect(193, 193, 5, 5);
		qipan.fillRect(313, 193, 5, 5);
		qipan.fillRect(73, 313, 5, 5);
		qipan.fillRect(193, 313, 5, 5);
		qipan.fillRect(313, 313, 5, 5);//显示棋谱中的9颗星

		Graphics2D tu = (Graphics2D) qipan;
		tu.setStroke(new BasicStroke(3f));
		tu.drawLine(10, 10, 10, 400);
		tu.drawLine(10, 10, 400, 10);
		tu.drawLine(400, 10, 400, 400);
		tu.drawLine(10, 400, 400, 400);

		for (int i = 0; i < chessCount; i++) {
			chessList[i].draw(qipan);//将棋子绘制在棋盘上
		}
		qipan.setFont(new Font("黑体", Font.BOLD, 15));
		qipan.drawString("游戏提示:" + message, 20, 420);//显示文字提示
	}

	
	    public void againGame() {//重新开始游戏动作
		for (int i = 0; i < chessList.length; i++) {
			chessList[i] = null;
		}//清除棋盘上所有棋子的位置信息
		chessCount = 0;
		iso = false;
		message = "请开始";
		repaint();//刷新页面效果
	}

	public void huiqi() {//悔棋动作
		if (iso) {
			return;
		}
		chessList[chessCount - 1] = null;//让棋盘上最近所下棋子位置信息被清除
		chessCount--;//清楚一个棋子位置信息后,棋子数(步数)减一
		if (isBlack) {
			message = "白棋悔棋";
		} else {
			message = "黑棋悔棋";
		}
		isBlack = !isBlack;
		repaint();//刷新界面效果
	}
}

5.主程序
程序描述
用于实现游戏。
package game;

import java.awt.BorderLayout;//布局管理器
import java.awt.Button;//按钮组件
import java.awt.Color;
import java.awt.Dimension;//该类将组件的宽度和高度(整数精度)封装在单个对象中。该类与组件的某些属性相关联。
import java.awt.FlowLayout;//组件按照加入的先后顺序按照设置的对齐方式从左向右排列,一行排满到下一行开始继续排列
import java.awt.Font;//该类表示字体,这些字体用于以可见的方式呈现文本。字体提供将字符序列映射到字形序列以及渲染字形序列和对象所需的信息。
import java.awt.GridLayout;//GridLayout布局管理器将容器分割成纵横分割的网格
import java.awt.event.ActionEvent;//表示发生组件定义操作的语义事件。当组件特定操作发生(如按下)时,此高级事件由组件生成(例如 a)。该事件将传递给使用组件方法注册接收此类事件的每一个对象。
import java.awt.event.ActionListener;//ActionListener是Java中关于事件处理的一个接口
import java.awt.event.MouseAdapter;//类,用于实现MouseListener
import java.awt.event.MouseEvent;//指示组件中发生鼠标操作的事件

import javax.swing.JDialog;//用于创建对话窗口的主类。
import javax.swing.JFrame;//是屏幕上window的对象,能够最大化、最小化、关闭。
import javax.swing.JLabel;//可以显示文本、图像或同时显示二者。
import javax.swing.JMenu;//实现一个弹出窗口
import javax.swing.JMenuBar;//创建菜单栏的对象
import javax.swing.JMenuItem;//往菜单中添加内容的类
import javax.swing.JPanel;//是一种中间层容器,它能容纳组件并将组件组合在一起,但它本身必须添加到其他容器中使用。

public class GameMain extends JFrame {

	Chessboard qpan;

	public GameMain() {
		qpan = new Chessboard();
		JMenuBar menubar = new JMenuBar();// 创建一个菜单

		JMenu menu = new JMenu("游戏(G)"); 
		JMenuItem item1 = new JMenuItem("新游戏");
		JMenuItem item2 = new JMenuItem("退出");//在菜单中加入文字
		menu.add(item1);
		menu.addSeparator();//在菜单中填加的菜单项之间产生一个分割线
		menu.add(item2);
		menubar.add(menu);//菜单条上添加菜单


		JPanel button = new JPanel();//创建了一个 JPanel对象表示面板
		button.setBackground(Color.yellow);//设置背景面板颜色色
		button.setLayout(new GridLayout(5, 4));//设置按钮布局大小
		Button button1 = new Button("重开");
		Button button2 = new Button("悔棋");//设置按钮提示字
		button.add(button1);
		button.add(button2);//应用按钮
		BorderLayout bl = new BorderLayout();//创建窗口
		this.setTitle("帅气五子棋");//设置窗口名字
		this.setSize(480, 490);//设置窗口大小
		this.setLocationRelativeTo(null);//窗口居中
		this.setVisible(true);//允许JVM可以根据数据模型开始画图并显示到屏幕上了
		this.setResizable(true);//设置窗口大小可改变
		this.add(menubar, bl.NORTH);
		this.add(qpan, bl.CENTER);
		this.add(button, bl.EAST);//菜单设置在图形上边,棋盘设置在图形中间,按钮设置在图形右边

		button1.addMouseListener(new MouseAdapter() {

			
			public void mouseClicked(MouseEvent a) {
				
				qpan.againGame();
			}//点击button1按钮后,调用againGame动作

		});
	    button2.addMouseListener(new MouseAdapter() {

			public void mouseClicked(MouseEvent b) {
				qpan.huiqi();
			}//点击button2按钮后,调用huiqi动作
			});

	     item1.addActionListener(new ActionListener() {
         
	    	 public void actionPerformed(ActionEvent c) {
				qpan.againGame();
			}
		});//点击item1后触发againGame动作

		
		item2.addActionListener(new ActionListener() {

		public void actionPerformed(ActionEvent d) {
				System.exit(0);
			}
		});//点击item2后触发退出游戏动作

	}

	public static void main(String[] args) {
		
		new GameMain();
	}

调整程序变换棋盘颜色
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述



这篇关于??Java??实现“五子棋”小游戏??的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程