java五子棋(人机版),昨天买的棋子今天就用不上了(代码片段)

编程界小明哥 编程界小明哥     2023-02-21     435

关键词:

Java五子棋,老程序员也花了3天

作者简介

作者名:编程界明世隐
简介:CSDN博客专家,从事软件开发多年,精通Java、JavaScript,博主也是从零开始一步步把学习成长、深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢迎您关注,期待与您一起学习、成长、起飞!

热门专栏推荐

【1】Java小游戏(俄罗斯方块、飞机大战、植物大战僵尸等)
【2】JavaWeb项目实战(图书管理、在线考试、宿舍管理等)
【3】JavaScript精彩实例(飞机大战、贪吃蛇、验证码等)
【4】Java小白入门200例
【5】从零学Java、趣学Java
【6】Idea从零到精通

系列目录

1. Java俄罗斯方块
2. 老Java程序员花2天写了个连连看
3. 老Java程序员花一天时间写了个飞机大战
4. Java植物大战僵尸
5. Java消消乐(天天爱消除)
6. Java贪吃蛇小游戏
7. Java扫雷小游戏
8. Java坦克大战

效果图

实现思路

1.创建运行窗口并添加背景色。
2.绘制棋盘。
3.用二维数组来控制起码落子位置、绘制指示器。
4.鼠标在落子位置处点击可落子。
5.落子后检查是否获得胜利。
6.机器判断下一步,并落子。
7.机器判断是否获得胜利。

代码实现

创建窗口

首先创建一个游戏窗体类GameFrame,继承至JFrame,用来显示在屏幕上(window的对象),每个游戏都有一个窗口,设置好窗口标题、尺寸、布局等就可以。

/*
 * 游戏窗体类
 */
public class GameFrame extends JFrame 
	
	public GameFrame() 
		setTitle("五子棋");//设置标题
		setSize(620, 670);//设定尺寸
		getContentPane().setBackground(new Color(209,146,17));//添加背景色
		setLayout(new BorderLayout());
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//点击关闭按钮是关闭程序
        setLocationRelativeTo(null);   //设置居中
    	setResizable(false); //不允许修改界面大小
	

创建面板容器GamePanel继承至JPanel


import javax.swing.JFrame;
import javax.swing.JPanel;

/*
 * 画布类
 */
public class GamePanel extends JPanel 
	private static final long serialVersionUID = 1L;
	GamePanel gamePanel=this;
	private JFrame mainFrame=null;
	
	//构造里面初始化相关参数
	public GamePanel(JFrame frame)
		this.setLayout(null);
		this.setOpaque(false);
		mainFrame = frame;
		
		mainFrame.requestFocus();
		mainFrame.setVisible(true);
	
	

再创建一个Main类,来启动这个窗口。

public class Main 
	//主类
	public static void main(String[] args) 
		GameFrame frame = new GameFrame();
		GamePanel gamePanel = new GamePanel(frame);
		frame.add(gamePanel);
		frame.setVisible(true);//设定显示
	

右键执行这个Main类,窗口建出来了

创建菜单及菜单选项

创建菜单

private void  initMenu()
	// 创建菜单及菜单选项
	jmb = new JMenuBar();
	JMenu jm1 = new JMenu("游戏");
	jm1.setFont(new Font("思源宋体", Font.BOLD, 18));// 设置菜单显示的字体
	JMenu jm2 = new JMenu("帮助");
	jm2.setFont(new Font("思源宋体", Font.BOLD, 18));// 设置菜单显示的字体
	
	JMenuItem jmi1 = new JMenuItem("开始新游戏");
	JMenuItem jmi2 = new JMenuItem("退出");
	jmi1.setFont(new Font("思源宋体", Font.BOLD, 18));
	jmi2.setFont(new Font("思源宋体", Font.BOLD, 18));
	
	JMenuItem jmi3 = new JMenuItem("操作说明");
	jmi3.setFont(new Font("思源宋体", Font.BOLD, 18));
	JMenuItem jmi4 = new JMenuItem("成功/失败判定");
	jmi4.setFont(new Font("思源宋体", Font.BOLD, 18));
	
	jm1.add(jmi1);
	jm1.add(jmi2);
	
	jm2.add(jmi3);
	jm2.add(jmi4);
	
	jmb.add(jm1);
	jmb.add(jm2);
	mainFrame.setJMenuBar(jmb);// 菜单Bar放到JFrame上
	jmi1.addActionListener(this);
	jmi1.setActionCommand("Restart");
	jmi2.addActionListener(this);
	jmi2.setActionCommand("Exit");
	
	jmi3.addActionListener(this);
	jmi3.setActionCommand("help");
	jmi4.addActionListener(this);
	jmi4.setActionCommand("lost");

实现ActionListener并重写方法actionPerformed

此时GamePanel是报错的,重写actionPerformed方法。

actionPerformed方法的实现

@Override
public void actionPerformed(ActionEvent e) 
	String command = e.getActionCommand();
	System.out.println(command);
	UIManager.put("OptionPane.buttonFont", new FontUIResource(new Font("思源宋体", Font.ITALIC, 18)));
	UIManager.put("OptionPane.messageFont", new FontUIResource(new Font("思源宋体", Font.ITALIC, 18)));
	if ("Exit".equals(command)) 
		Object[] options =  "确定", "取消" ;
		int response = JOptionPane.showOptionDialog(this, "您确认要退出吗", "",
				JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE, null,
				options, options[0]);
		if (response == 0) 
			System.exit(0);
		 
	else if("Restart".equals(command))
		if(!"end".equals(gamePanel.gameFlag))
			JOptionPane.showMessageDialog(null, "正在游戏中无法重新开始!",
					"提示!", JOptionPane.INFORMATION_MESSAGE); 
		else
			if(gamePanel!=null) 
				gamePanel.restart();
			
		
	else if("help".equals(command))
		JOptionPane.showMessageDialog(null, "鼠标在指示器位置点下,则落子!",
				"提示!", JOptionPane.INFORMATION_MESSAGE);
	else if("lost".equals(command))
		JOptionPane.showMessageDialog(null, "五子连珠方获得胜利!",
				"提示!", JOptionPane.INFORMATION_MESSAGE);
	

此时的GamePanel代码如下:

package main;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.plaf.FontUIResource;

/*
 * 画布类
 */
public class GamePanel extends JPanel implements ActionListener
	private static final long serialVersionUID = 1L;
	GamePanel gamePanel=this;
	private JFrame mainFrame=null;
	JMenuBar jmb=null;
	public String gameFlag="";
	
	//构造里面初始化相关参数
	public GamePanel(JFrame frame)
		this.setLayout(null);
		this.setOpaque(false);
		mainFrame = frame;
		
		//创建按钮
		initMenu();
		
		mainFrame.requestFocus();
		mainFrame.setVisible(true);
	
	
	private void  initMenu()
		// 创建菜单及菜单选项
		jmb = new JMenuBar();
		JMenu jm1 = new JMenu("游戏");
		jm1.setFont(new Font("思源宋体", Font.BOLD, 18));// 设置菜单显示的字体
		JMenu jm2 = new JMenu("帮助");
		jm2.setFont(new Font("思源宋体", Font.BOLD, 18));// 设置菜单显示的字体
		
		JMenuItem jmi1 = new JMenuItem("开始新游戏");
		JMenuItem jmi2 = new JMenuItem("退出");
		jmi1.setFont(new Font("思源宋体", Font.BOLD, 18));
		jmi2.setFont(new Font("思源宋体", Font.BOLD, 18));
		
		JMenuItem jmi3 = new JMenuItem("操作说明");
		jmi3.setFont(new Font("思源宋体", Font.BOLD, 18));
		JMenuItem jmi4 = new JMenuItem("成功/失败判定");
		jmi4.setFont(new Font("思源宋体", Font.BOLD, 18));
		
		jm1.add(jmi1);
		jm1.add(jmi2);
		
		jm2.add(jmi3);
		jm2.add(jmi4);
		
		jmb.add(jm1);
		jmb.add(jm2);
		mainFrame.setJMenuBar(jmb);// 菜单Bar放到JFrame上
		jmi1.addActionListener(this);
		jmi1.setActionCommand("Restart");
		jmi2.addActionListener(this);
		jmi2.setActionCommand("Exit");
		
		jmi3.addActionListener(this);
		jmi3.setActionCommand("help");
		jmi4.addActionListener(this);
		jmi4.setActionCommand("lost");
	
	
	//重新开始
	public void restart() 
		//游戏开始标记
		gameFlag="start";
	
	
	@Override
	public void actionPerformed(ActionEvent e) 
		String command = e.getActionCommand();
		System.out.println(command);
		UIManager.put("OptionPane.buttonFont", new FontUIResource(new Font("思源宋体", Font.ITALIC, 18)));
		UIManager.put("OptionPane.messageFont", new FontUIResource(new Font("思源宋体", Font.ITALIC, 18)));
		if ("Exit".equals(command)) 
			Object[] options =  "确定", "取消" ;
			int response = JOptionPane.showOptionDialog(this, "您确认要退出吗", "",
					JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE, null,
					options, options[0]);
			if (response == 0) 
				System.exit(0);
			 
		else if("Restart".equals(command))
			if(!"end".equals(gamePanel.gameFlag))
				JOptionPane.showMessageDialog(null, "正在游戏中无法重新开始!",
						"提示!", JOptionPane.INFORMATION_MESSAGE); 
			else
				if(gamePanel!=null) 
					gamePanel.restart();
				
			
		else if("help".equals(command))
			JOptionPane.showMessageDialog(null, "鼠标在指示器位置点下,则落子!",
					"提示!", JOptionPane.INFORMATION_MESSAGE);
		else if("lost".equals(command))
			JOptionPane.showMessageDialog(null, "五子连珠方获得胜利!",
					"提示!", JOptionPane.INFORMATION_MESSAGE);
		
	


运行一下

绘制棋盘

重写paint方法

@Override
public void paint(java.awt.Graphics g) 
	super.paint(g);

绘制横竖相交接的线
定义15行、15列

public static final int ROWS=15;
public static final int COLS=15;

绘制网格

//绘制网格
private void drawGrid(Graphics g) 
	Graphics2D g_2d=(Graphics2D)g;
	int start=26;
	int x1=start;
	int y1=20;
	int x2=586;
	int y2=20;
	for (int i = 0; i < ROWS; i++) 
		y1 = start + 40*i;
		y2 = y1;
		g_2d.drawLine(x1, y1, x2, y2);		
	
	
	y1=start查看详情  

之前学习买的资料,现在上岸了用不上了,免费送

老学姐去年毕业前自己买的资料,现在已经有工作了,所以用不上了,免费送给想学习的小伙伴,  有需要的小伙伴评论区扣1,全部免费送给大家  查看详情

人机博弈-吃子棋游戏算气

算法步骤例如以下。输入计算棋气的起始子。检查我方棋子其周边的空白,并查看此空白是否已经计算过气了。假设没有计算过气加一,假设已经计算则略过。进而递归调用计算我方棋子上下左右子的气,最后算法会返回棋串的... 查看详情

《游戏学习》java实现连珠五子棋完整代码(代码片段)

游戏介绍五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏。五子棋有两种玩法。玩法一:双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜。玩... 查看详情

《游戏学习》java实现连珠五子棋完整代码(代码片段)

游戏介绍五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏。五子棋有两种玩法。玩法一:双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜。玩... 查看详情

批处理实现的五子棋人机对战游戏

...etbenton编写完成setli14=!li14!棋盘设计参照了batmantitle批处理五子棋setstr=###################set.=0for/l%%ain(1,1,19)do(sethe%%a=!str!&setsh%%a=!str!for/l%%bin(1,1,19)doset[%%a.%%b=0 查看详情

c#五子棋小游戏源码(人机对战)

点击查看:C#五子棋小游戏源码(人机对战)文件大小:1.3M操作系统:Windows10旗舰版开发工具:VS2019开发语言:.cs 查看详情

五子棋ai图形界面人机对战(java实现)

前言改了又改,查了又查,想了又想,我真的不知道怎样让它再聪明了,大多时候走的都是正确的,但偶尔会蹦出那么一步臭棋,全盘皆输。希望有相关经验的道友看到后可以指出原因和不足。效果图按钮... 查看详情

java项目开发----五子棋(代码片段)

java项目开发(一)----五子棋项目(一)------五子棋开发思路五子棋的要素两个用户黑白棋子棋盘游戏的几个界面---登录、模式选择、胜负弹窗、游戏界面游戏规则游戏窗口的创建创建窗口对象窗口创建思路代码... 查看详情

五子棋人机博弈游戏(cocoscreator)

...技术A参考文章:【CocosCreator实战教程(1)】——人机对战五子棋(节点事件相关)源码:goBang思考一:作为对手的系统用什么算法下棋?估值函数、搜索算法和胜负判断等博弈算法,在极大极小值搜索中应用alpha-beta剪枝智能五子棋... 查看详情

java初学者练习之五子棋游戏教程(附源码)(代码片段)

1.图形化界面的创建1.1创建JFrame窗体容器        1)JFrame窗体需要设置基本的大小、布局、默认的关闭方式,以及最重要的设置可见。1.2在JFrame上添加组件,用来绘制棋盘棋子和游戏操作。    1)棋盘棋子的... 查看详情

结对-结对编项目作业名称-需求分析

HTML版五子棋游戏需求分析  一、建立坐标点,在HTML页面内进行棋盘的绘画  二、对PVE/PVP对战进行分析    1、先进行输赢条件的分析,五子棋可以获胜的条件(横着/竖着/倾斜的五颗颜色相同的棋子连接中无对方的棋子... 查看详情

五子棋(机器人随机下棋简单版本)(代码片段)

相信大家小时候都玩过五子棋游戏,五子棋是起源于中国古代的传统黑白棋之一,在一块类似围棋的棋盘上,你和对手轮流放下黑白棋子,无论是横竖还是斜。只要有五颗相同颜色的棋子连成一线即可获得一句胜... 查看详情

c语言大一课设——不会五子棋(代码片段)

大一课程设计——不会五子棋在编写此次课程设计后,我了解到其实C语言不但可以在黑白色的命令提示符界面进行运行,还可以有很美观的窗口界面。课程设计中我完成了自学EasyX这一图形库内各种函数的使用,不仅... 查看详情

五子棋-javascript实现-人机交互

上一篇文章​​五子棋-JavaScript实现-两人对战​​我们介绍了人与人之间下棋,还挖了个坑:讲人机交互下棋。不知不觉中,把自己打包给卖了,本文就是来补坑的。我们一步步来讲解,详细的代码,请跳转到文末。基本术语我... 查看详情

人机五子棋

利用简单的算法实现一个简单五子棋:css代码:*{margin:0;padding:0}   img{      margin-left:20px;      height:630px;     &n 查看详情

c语言实现五子棋三子棋人机对战,包含电脑人工智能对战(可攻可守)(非标题党)(代码片段)

C语言——五子棋、井字棋人机对“战”针对C语言学习过程中的五子棋、三子棋实现记录五子棋人机对战C语言——五子棋、井字棋人机对“战”实际效果一、头文件(game.h)二、测试文件(test.c)三、游戏程序文... 查看详情

java实现《五子棋》游戏|csdn创作打卡(代码片段)

前言五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成5子连线者获... 查看详情