Java实现五子棋(附源码)

news2024/12/23 17:35:29

在这里插入图片描述

文章目录

    • 一、游戏介绍
    • 二、效果展示
    • 三、代码展示
      • 1、登录页面
      • 2、算法程序
      • 3、棋盘实现
    • 四、资源下载
    • 五、文末总结


一、游戏介绍

今天给大家分享一个用java写的小游戏——《五子棋》 (完整代码可在【资源下载】目录查看) 。五子棋是一种两人对弈的纯策略型棋类游戏,棋具与围棋通用,是起源于中国古代的传统黑白棋种之一。发展于日本,流行于欧美。容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。

二、效果展示

image-20221112100933387

三、代码展示

1、登录页面

运行程序后需注册账号使用,也可使用我注册过的账号(账号:liangdianjun,密码:123456),可在项目文档user.xls查看。

image-20221112101516923

image-20221112101909702

话不多说,直接上代码

用户登录

private static final long servialVersionUID = 1L;

final JLabel logoLabel = new JLabel("开心五子棋");
final JLabel logo = new JLabel();
final JButton loginButton = new JButton("                  登   陆                  ");
final JLabel registerLabel = new JLabel("立即注册");
final JLabel userLabel = new JLabel("账号:");
final JLabel passwordLabel = new JLabel("密码:");
final static JTextField userjt = new JTextField(11);
final JPasswordField passwordjt = new JPasswordField(11);
final JCheckBox rememberPasswordjcb = new JCheckBox();
final JLabel rememberPasswordjl = new JLabel("记住密码");
final JCheckBox automaticLoginjcb = new JCheckBox();
final JLabel automaticLoginjl = new JLabel("自动登录");
final JLabel promptPasswordFalse = new JLabel("密码错误!");
final JLabel promptRegister = new JLabel("该账号还未注册!");
final JLabel promptUserNameEmpty = new JLabel("请输入账号!");
final JLabel prompPasswordEmpty = new JLabel("请输入密码!");
final Color color = new Color(255, 218, 185);
final FileOperation read = new FileOperation();//创建文件对象
final FileOperation f = new FileOperation();
public Main() {
	setTitle("开心五子棋");
	setBounds(200, 200, 500, 500);
	setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	setVisible(true);
	
	//基本布局设置
	SpringLayout springLayout = new SpringLayout();//使用弹簧布局管理器
	Container c = getContentPane();//创建容器
	c.setBackground(new Color(255, 218, 185));
	c.setLayout(springLayout);
	
	userjt.setFont(new Font("微软雅黑", 0, 18 ));
	userjt.setText(Register.userName);
	passwordjt.setFont(new Font("微软雅黑", 0, 18));
	passwordjt.setText(Register.password);
	logoLabel.setFont(new Font("微软雅黑", 1, 48));
	logoLabel.setForeground(Color.pink);
	ImageIcon logoimage = new ImageIcon(Main.class.getResource("/image/logo5.jpg"));
	logoimage.setImage(logoimage.getImage().getScaledInstance(260, 130, Image.SCALE_DEFAULT));
	logo.setIcon(logoimage);
	userLabel.setFont(new Font("微软雅黑", 1, 20));
	passwordLabel.setFont(new Font("微软雅黑", 1, 20));
	rememberPasswordjl.setFont(new Font("微软雅黑", 0, 14));
	rememberPasswordjl.setForeground(Color.gray);
	automaticLoginjl.setFont(new Font("微软雅黑", 0, 14));
	automaticLoginjl.setForeground(Color.gray);
	loginButton.setFont(new Font("微软雅黑", 1, 16));
	registerLabel.setFont(new Font("微软雅黑", 1, 13));
	registerLabel.setForeground(Color.gray);
	promptPasswordFalse.setFont(new Font("微软雅黑", 0, 13));
	promptPasswordFalse.setForeground(Color.red);
	promptUserNameEmpty.setFont(new Font("微软雅黑", 0, 13));
	promptUserNameEmpty.setForeground(Color.red);
	prompPasswordEmpty.setFont(new Font("微软雅黑", 0, 13));
	prompPasswordEmpty.setForeground(Color.red);
	promptRegister.setFont(new Font("微软雅黑", 0, 13));
    promptRegister.setForeground(Color.red);
    rememberPasswordjcb.setBackground(new Color(255, 218, 185));
    automaticLoginjcb.setBackground(new Color(255, 218, 185));
    
    c.add(logo);//首页图标
    springLayout.putConstraint(springLayout.NORTH, logo, 40, springLayout.NORTH, c);
    springLayout.putConstraint(springLayout.WEST, logo, 115, springLayout.WEST, c);
	c.add(logoLabel);//标题“开心五子棋”
	springLayout.putConstraint(springLayout.NORTH, logoLabel, 100, springLayout.NORTH, c);
	springLayout.putConstraint(springLayout.WEST, logoLabel, 120, springLayout.WEST, c);
	logoLabel.setVisible(false);
	
	c.add(userLabel);//用户名
	springLayout.putConstraint(springLayout.NORTH, userLabel, 35, springLayout.SOUTH, logoLabel);
	springLayout.putConstraint(springLayout.WEST, userLabel, 110, springLayout.WEST, c);
	c.add(userjt);
	springLayout.putConstraint(springLayout.NORTH, userjt, 35, springLayout.SOUTH, logoLabel);
	springLayout.putConstraint(springLayout.WEST, userjt, 10, springLayout.EAST, userLabel);
	
	c.add(passwordLabel);//密码
	springLayout.putConstraint(springLayout.NORTH, passwordLabel, 10, springLayout.SOUTH, userLabel);
	springLayout.putConstraint(springLayout.WEST, passwordLabel, 110, springLayout.WEST, c);
	c.add(passwordjt);
	springLayout.putConstraint(springLayout.NORTH, passwordjt, 10, springLayout.SOUTH, userjt);
	springLayout.putConstraint(springLayout.WEST, passwordjt, 10, springLayout.EAST, passwordLabel);
	
	c.add(rememberPasswordjcb);//复选框
	springLayout.putConstraint(springLayout.NORTH, rememberPasswordjcb, 10, springLayout.SOUTH, passwordLabel);
	springLayout.putConstraint(springLayout.WEST, rememberPasswordjcb, 175, springLayout.WEST, c);
	c.add(rememberPasswordjl);
	springLayout.putConstraint(springLayout.NORTH, rememberPasswordjl, 10, springLayout.SOUTH, passwordjt);
	springLayout.putConstraint(springLayout.WEST, rememberPasswordjl, 5, springLayout.EAST, rememberPasswordjcb);
	c.add(automaticLoginjcb);
	springLayout.putConstraint(springLayout.NORTH, automaticLoginjcb, 10, springLayout.SOUTH, passwordjt);
	springLayout.putConstraint(springLayout.WEST, automaticLoginjcb, 30, springLayout.EAST, rememberPasswordjl);
	c.add(automaticLoginjl);
	springLayout.putConstraint(springLayout.NORTH, automaticLoginjl, 10, springLayout.SOUTH, passwordjt);
	springLayout.putConstraint(springLayout.WEST, automaticLoginjl, 5, springLayout.EAST, automaticLoginjcb);
	
	c.add(loginButton);//登陆按钮
	springLayout.putConstraint(springLayout.NORTH, loginButton, 20, springLayout.SOUTH, rememberPasswordjl);
	springLayout.putConstraint(springLayout.WEST, loginButton, 110, springLayout.WEST, c);
	c.add(registerLabel);//注册按钮
	springLayout.putConstraint(springLayout.NORTH, registerLabel, 5, springLayout.SOUTH, loginButton);
	springLayout.putConstraint(springLayout.WEST, registerLabel, 320, springLayout.WEST, c);
	
	c.add(promptRegister);//账号未注册提示
	promptRegister.setVisible(false);
    springLayout.putConstraint(springLayout.NORTH, promptRegister, 41, springLayout.SOUTH, logoLabel);
	springLayout.putConstraint(springLayout.WEST, promptRegister, 5, springLayout.EAST, userjt);
	c.add(promptUserNameEmpty);//请输入账号
	promptUserNameEmpty.setVisible(false);
    springLayout.putConstraint(springLayout.NORTH, promptUserNameEmpty, 41, springLayout.SOUTH, logoLabel);
	springLayout.putConstraint(springLayout.WEST, promptUserNameEmpty, 5, springLayout.EAST, userjt);
	
	c.add(promptPasswordFalse);//密码错误提示
	promptPasswordFalse.setVisible(false);
	springLayout.putConstraint(springLayout.NORTH, promptPasswordFalse, 20, springLayout.SOUTH, promptRegister);
	springLayout.putConstraint(springLayout.WEST, promptPasswordFalse, 5, springLayout.EAST, passwordjt);
	c.add(prompPasswordEmpty);//密码为空提示
	prompPasswordEmpty.setVisible(false);
	springLayout.putConstraint(springLayout.NORTH, prompPasswordEmpty, 20, springLayout.SOUTH, promptRegister);
	springLayout.putConstraint(springLayout.WEST, prompPasswordEmpty, 5, springLayout.EAST, passwordjt);
	
	//设置文本框鼠标点击事件
	userjt.addMouseListener(new MouseAdapter() {//文本框
		public void mouseClicked(MouseEvent e) {
			userjt.setText("");
		}
	});
	passwordjt.addMouseListener(new MouseAdapter() {//密码框
		public void mouseClicked(MouseEvent e) {
			passwordjt.setText("");
		}
	});
	
	//设置登陆按钮单击事件
	loginButton.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			String userName = userjt.getText().trim();//获取用户输入的账号和密码
			String Password = new String(passwordjt.getPassword()).trim();
			//判断账号和密码
		    if(userName.length() != 0) {//用户名不为空
		    	promptUserNameEmpty.setVisible(false);//关闭账号为空显示
		    	if(Password.length() != 0) {//密码不为空
		    		if(f.readData("user.xls", userName) && Password.equals(f.backData("user.xls", userName, "password"))) {//用户输入的账号和密码正确
						promptRegister.setVisible(false);//隐藏提示信息
						promptPasswordFalse.setVisible(false);
						prompPasswordEmpty.setVisible(false);
						loginButton.setText("                登 陆 中...               ");
						new Chessboard();//跳转到五子棋棋盘页面
						dispose();//销毁当前页面
					}
		    		else if( f.readData("user.xls", userName) && !Password.equals(f.backData("user.xls", userName, "password"))) {//用户输入密码错误
						promptPasswordFalse.setVisible(true);//显示密码错误提示
						promptRegister.setVisible(false);
						prompPasswordEmpty.setVisible(false);
						passwordjt.setText("");//密码框清空
						passwordjt.requestFocus();//光标定位到密码框
					}else {//账号还未注册
						promptRegister.setVisible(true);
				    	promptPasswordFalse.setVisible(false);
						prompPasswordEmpty.setVisible(false);
					}
		        }
		        else {//密码为空
		        	if(userName.equals("admin")) {//用户名已经注册, 提示输入密码
		        		prompPasswordEmpty.setVisible(true);
			        	promptUserNameEmpty.setVisible(false);
			        	promptRegister.setVisible(false);
				    	promptPasswordFalse.setVisible(false);
		        	}else {//用户名未注册
		        		prompPasswordEmpty.setVisible(false);
			        	promptUserNameEmpty.setVisible(false);
			        	promptRegister.setVisible(true);
				    	promptPasswordFalse.setVisible(false);
		        	}
		        	
		        }
		    }else {//用户名为空
		    	promptUserNameEmpty.setVisible(true);//提示输入账号
		    	promptRegister.setVisible(false);
		    	promptPasswordFalse.setVisible(false);
		    	prompPasswordEmpty.setVisible(false);
		    	passwordjt.setText("");//将密码框置为空
		    	if(Password.length() == 0) {//密码为空
		    		prompPasswordEmpty.setVisible(true);
		    		promptRegister.setVisible(false);
			    	promptPasswordFalse.setVisible(false);
		    	}
		    }
		}
	});
	
	//注册标签监听器
	registerLabel.addMouseListener(new MouseListener() {
		public void mouseClicked(MouseEvent e) {
               dispose();
			new Register();
		}
		public void mouseEntered(MouseEvent e) {
			registerLabel.setForeground(Color.red);;
		}
		public void mouseExited(MouseEvent e) {
		    registerLabel.setForeground(Color.black);
		}
		public void mousePressed(MouseEvent e) {}
		public void mouseReleased(MouseEvent e) {}
	});
}
public static void main(String[] args) {
	// TODO 自动生成的方法存根
       new Main();
}

2、算法程序

该程序实现了对五子棋分数的计算,计算竖横斜黑子和白子数量,谁先达成五分(即五子)则胜利。

返回棋盘上某个空点的分数

public static int countScore(int map[][], int X, int Y, int computerColor) {
	int sum = 0;
	int count = 0;
	int value[] = new int[] {0, 0, 0, 0};
	int upcount[] = new int[] {0, 0, 0, 0};
	int downcount[] = new int[] {0, 0, 0, 0};
	int upflag[] = new int[] {0, 0, 0, 0};
	int downflag[] = new int[] {0, 0, 0, 0};
	for(int color = 1; color <= 2; color++) {//计算双方的分数
		
		map[X][Y] = color;//先将该点放白子
		/*******************************************计算横向棋子***********************/
		for(int i = X - 1; i >=0; i--) {//计算左边棋子数量
			if(map[i][Y] == color) {
				upcount[0]++;
			}else if(map[i][Y] != 0 && map[i][Y] != color) {//表示有对方棋子
				upflag[0] = -1;
				break;
			}else {//表示为空
				upflag[0] = 1;
				if(i - 1 >= 0 && map[i][Y] == 0) {
					upflag[0] = 2;//表示两个空格
				}else {
					break;
				}
				if(i - 2 >= 0 && map[i][Y] == 0) {
					upflag[0] = 3;//表示有三个空格
				}else {
					break;
				}
				break;
			}
		}
		for(int j = X + 1; j <= 14; j++) {//计算右边棋子数量
			if(map[j][Y] == color) {
				downcount[0]++;
			}else if(map[j][Y] != 0 && map[j][Y] != color) {
				downflag[0] = -1;
				break;
			}else {//表示为空
				downflag[0] = 1;
				if(j + 1 <= 14 && map[j][Y] == 0) {
					downflag[0] = 2;
				}else {
					break;
				}
				if(j + 2 <= 14 && map[j][Y] == 0) {
					downflag[0] = 3;
				}else {
					break;
				}
				break;
			}
		}

		/******************************************************计算列项棋子***************************************/
		for(int i = Y - 1; i >= 0; i--) {//计算方向向上
			if(map[X][i] == color) {
				upcount[1]++;
			}else if(map[X][i] != 0 && map[X][i] != color) {//表示该点是对方棋子
				upflag[1] = -1;
				break;
			}else {//表示为空
				upflag[1] = 1;
				if(i - 1 >= 0 && map[X][i] == 0) {
					upflag[1] = 2;
				}else {
					break;
				}
				if(i - 2 >= 0 && map[X][i] == 0) {
				    upflag[1] = 3;
				}else {
					break;
				}
				break;
			}
		}
		for(int j = Y + 1; j <= 14; j++) {//计算方向向下
			if(map[X][j] == color) {
				downcount[1]++;
			}else if(map[X][j] != 0 && map[X][j] != color) {//表示该点是对方棋子
				downflag[1] = -1;
				break;
			}else {//表示为空
				downflag[1] = 1;
				if(j + 1 >= 0 && map[X][j] == 0) {
					downflag[1] = 2;
				}else {
					break;
				}
				if(j + 2 >= 0 && map[X][j] == 0) {
				    downflag[1] = 3;
				}else {
					break;
				}
				break;
			}
		}
		
		/****************************************************计算斜向下棋子*********************************************/
		int i = 0;
		int j = 0;
		for(i = X - 1, j = Y - 1; i >= 0 && j >= 0; i--, j--) {//计算斜向上
			if(map[i][j] == color) {
				upcount[2]++;
			}else if(map[i][j] != 0 && map[i][j] != color) {
				upflag[2] = -1;
				break;
			}else {//为空
				upflag[2] = 1;
				if(i - 1 >= 0 && j - 1 >= 0 && map[i][j] == 0) {
					upflag[2] = 2;
				}else {
					break;
				}
				if(i - 2 >= 0 && j - 2 >= 0 && map[i][j] == 0) {
					upflag[2] = 3;
				}else {
					break;
				}
				break;
			}
		}
		for(i = X + 1, j = Y + 1; i <= 14 && j <= 14; i++, j++) {//计算斜向下
			if(map[i][j] == color) {
				downcount[2]++;
			}else if(map[i][j] != 0 && map[i][j] != color) {
				downflag[2] = -1;
				break;
			}else {//为空
				downflag[2] = 1;
				if(i + 1 <= 14 && j + 1 <= 14 && map[i][j] == 0) {
					downflag[2] = 2;
				}else {
					break;
				}
				if(i + 2 <= 14 && j + 2 <= 14 && map[i][j] == 0) {
					downflag[2] = 3;
				}else {
					break;
				}
				break;
			}
		}
		
		/****************************************************计算斜向上棋子*************************************************/
		for(i = X + 1, j = Y - 1; i <= 14 && j >= 0; i++, j--) {
			if(map[i][j] == color) {
				upcount[3]++;
			}else if(map[i][j] != 0 && map[i][j] != color) {
				upflag[3] = -1;
				break;
			}else {
				upflag[3] = 1;
				if(i + 1 <= 14 && j - 1 >= 0 && map[i][j] == 0) {
					upflag[3] = 2;
				}else {
					break;
				}
				if(i + 2 <= 14 && j - 2 >= 0 && map[i][j] == 0) {
					upflag[3] = 3;
				}else {
					break;
				}
				break;
			}
		}
		for(i = X - 1, j = Y + 1; i >= 0 && j <= 14; i--, j++) {//计算斜向下
			if(map[i][j] == color) {
				downcount[3]++;
			}else if(map[i][j] != 0 && map[i][j] != color) {
				downflag[3] = -1;
				break;
			}else {//为空
				downflag[3] = 1;
				if(i - 1 >= 0 && j + 1 <= 14 && map[i][j] == 0) {
					downflag[3] = 2;
				}else {
					break;
				}
				if(i - 2 >= 0 && j + 2 <= 14 && map[i][j] == 0) {
					downflag[3] = 3;
				}else {
					break;
				}
				break;
			}
		}
		//数据处理
		if(map[X][Y] == computerColor) {//如果是电脑方的话分数要高一点
			for(i =0; i < 4; i++) {
				count = upcount[i] + downcount[i] + 1;
				if(count == 5) {//成五
					value[i] = 40000;
				}else if(count == 4) {
					if(upflag[i] >= 1 && downflag[i] >= 1) {//活四
						value[i] = 19000;
					}
					if((upflag[i] >= 1 && downflag[i] == -1) || (upflag[i] == -1 && downflag[i] >= 1)) {//眠四
						value[i] = 3000;
					}
					if(upflag[i] == -1 && downflag[i] == -1) {//死四
						value[i] = -50;
					}
					
				}else if(count == 3) {
					if((upflag[i] >= 2 && downflag[i] >= 1) || (upflag[i] >= 1 && downflag[i] >= 2)) {//活三
						value[i] = 4000;
					}
					if((upflag[i] >= 2 && downflag[i] == -1) || (upflag[i] == -1 && downflag[i] >= 2) ||
							(upflag[i] == 1 && downflag[i] == 1)){//眠三
						value[i] = 800;
					}
					if(upflag[i] == -1 && downflag[i] == -1) {//死三
						value[i] = -50;
					}
				}else if(count == 2) {
					if((upflag[i] >= 1 && downflag[i] >= 3) || (upflag[i] >=2 && downflag[i] >= 2) || 
							(upflag[i] >= 3 && downflag[i] >= 1)) {//活二
						value[i] = 1050;
					}
					if((upflag[i] == -1 && downflag[i] >= 3) || (upflag[i] >= 3 && downflag[i] == -1) ||
							(upflag[i] == 2 && downflag[i] == 1) || (upflag[i] == 1 && downflag[i] == 2)) {//眠二
						value[i] = 350;
					}
					if(upflag[i] == -1 && downflag[i] == -1) {//死二
						value[i] = -50;
					}
				}else {
					if((upflag[i] >= 2 && downflag[i] >= 3) || (upflag[i] >= 3 && downflag[i] >= 2)) {//活1
						value[i] = 80;
					}
					if((upflag[i] == 2 && downflag[i] == 2) || (upflag[i] == 1 && downflag[i] == 3) ||
							(upflag[i] == 3 && downflag[i] == 1)) {//眠1
						value[i] = 20;
					}
					if((upflag[i] <= 1 && downflag[i] <= 2) || (upflag[i] <= 2 && downflag[i] <= 1)) {
						value[i] = -50;
					}
				}
			}
		}else {
			for(i =0; i < 4; i++) {
				count = upcount[i] + downcount[i] + 1;
				if(count == 5) {//成五
					value[i] = 30000;
				}else if(count == 4) {
					if(upflag[i] >= 1 && downflag[i] >= 1) {//活四
						value[i] = 15000;
					}
					if((upflag[i] >= 1 && downflag[i] == -1) || (upflag[i] == -1 && downflag[i] >= 1)) {//眠四
						value[i] = 2500;
					}
					if(upflag[i] == -1 && downflag[i] == -1) {//死四
						value[i] = -50;
					}
					
				}else if(count == 3) {
					if((upflag[i] >= 2 && downflag[i] >= 1) || (upflag[i] >= 1 && downflag[i] >= 2)) {//活三
						value[i] = 3000;
					}
					if((upflag[i] >= 2 && downflag[i] == -1) || (upflag[i] == -1 && downflag[i] >= 2) ||
							(upflag[i] == 1 && downflag[i] == 1)){//眠三
						value[i] = 500;
					}
					if(upflag[i] == -1 && downflag[i] == -1) {//死三
						value[i] = -50;
					}
				}else if(count == 2) {
					if((upflag[i] >= 1 && downflag[i] >= 3) || (upflag[i] >=2 && downflag[i] >= 2) || 
							(upflag[i] >= 3 && downflag[i] >= 1)) {//活二
						value[i] = 650;
					}
					if((upflag[i] == -1 && downflag[i] >= 3) || (upflag[i] >= 3 && downflag[i] == -1) ||
							(upflag[i] == 2 && downflag[i] == 1) || (upflag[i] == 1 && downflag[i] == 2)) {//眠二
						value[i] = 150;
					}
					if((upflag[i] == -1 && downflag[i] == -1) || (upflag[i] == 1 && downflag[i] == 1) ||
							(upflag[i] == -1 && downflag[i] == 2) || (upflag[i] == 2 && downflag[i] == -1)) {//死二
						value[i] = -50;
					}
				}else {
					if((upflag[i] >= 2 && downflag[i] >= 3) || (upflag[i] >= 3 && downflag[i] >= 2)) {//活1
						value[i] = 50;
					}
					if((upflag[i] == 2 && downflag[i] == 2) || (upflag[i] == 1 && downflag[i] == 3) ||
							(upflag[i] == 3 && downflag[i] == 1)) {//眠1
						value[i] = 10;
					}
					if((upflag[i] <= 1 && downflag[i] <= 2) || (upflag[i] <= 2 && downflag[i] <= 1)||
							(upflag[i] <= 3 && downflag[i] == -1)|| (upflag[i] == -1 && downflag[i] <= 3)) {
						value[i] = -50;
					}
				}
			}
		}
		for(i = 0; i < 4; i++) {
			sum += value[i];
			value[i] = 0;
			upcount[i] = 0;
			downcount[i] = 0;
			upflag[i] = 0;
			downflag[i] = 0;
		}	
	}
	map[X][Y] = 0;
	return sum;
}

估值算法,返回一个数组,用于记录坐标

public static int[] evalute(int map[][], int depth, int computerColor) {
	int maxscore = 0;
	Random r = new Random();
	int pos[][] = new int[10][2];{
		for(int i = 0; i < pos.length; i++) {
			for(int j = 0; j < pos[i].length; j++) {
				pos[i][j] = 0;
			}
		}
	}
	int FLAG = 0;
	int score[][] = new int[15][15];{//初始化计分数组
		for(int i = 0; i < 15; i++) {
			for(int j = 0; j < 15; j++) {
				score[i][j] = 0;
			}
		}
	}
	int position[] = new int[]{0, 0};//初始化位置坐标数组
	for(int i = 6 - depth; i <= 8 + depth && i <= 14; i++) {//搜索横坐标
		for(int j = 6 - depth; j <= 8 + depth && j <= 14; j++) {//搜索纵坐标
			if(map[i][j] == 0) {//表示该点在棋盘上面为空
				score[i][j] = countScore(map, i, j, computerColor);
				if(maxscore < score[i][j]) {
					maxscore = score[i][j];//记录当前棋盘分数的最大值
				}
			}
		}
	}
	for(int i = 6 - depth; i <= 8 + depth && i <= 14; i++) {
		for(int j = 6 - depth; j <= 8 + depth && j <= 14; j++) {
			if(score[i][j] == maxscore) {
				pos[FLAG][0] = i;
				pos[FLAG++][1] = j;
			}
		}
	}
	int m = r.nextInt(FLAG);
	position[0] = pos[m][0];
	position[1] = pos[m][1];
	return position;
}

//极大极小值算法
public int minimax(int map[][], int chessColor) {
	return chessColor;
	
}

//alpha beta剪枝
public void alphaBetaCutting(int map[][], int chessColor){
	
}

3、棋盘实现

该算法按照五子棋规则,实现了最基本的打子,棋盘布局等功能。电脑可以计算玩家的棋子位置,严防死守(我完全没有机会赢😃,胜利的小伙伴可评论炫一波🧐),最终连成五子则结束。(此代码较多,展示部分代码,可下载完整版查看学习)

电脑下棋函数

private void tuntoComputer() {//电脑下棋
	if(depth >= 7) {
		depth = 6;
	}
	position = Algorithm.evalute(map, depth, computerColor);//调用估值函数
	map[position[0]][position[1]] = computerColor;
	imapflag[flag] = position[0];//将坐标存放在悔棋标记数组中
	jmapflag[flag] = position[1];
	newchessX = position[0];//新棋子标记记录坐标
	newchessY = position[1];
	int a = Math.max(Math.abs(position[0] - 7), Math.abs(position[1] - 7));//计算该点到中心的最大的距离
	depth = Math.max(depth, a);//不断更新depth的值
	flag ++;
	chessboardEmpty = 1;//棋盘标记为有棋子
	player = 1;//玩家下棋标志置0
	computer = 0;//电脑下棋标志为1
	judgeFlag = 1;
	repaint();
}

判断棋子是否连成五个

public void judge() {
	for(t = newchessX,s = newchessY,count = 0; t >=0 && s >= 0 && count <= 4; t--,s--,count++) {
		comeX = t;
		comeY = s;
	}
	for(t = newchessX, s = newchessY, count = 0; t <=14 && s >= 0 && count <= 4; t++, s--, count++) {
		toX = t;
		toY = s;
	}
	if(winFLAG == 0) {
		for(int ch = 1; ch <=2; ch++) {
			CHESSCOLOR = ch;
			//判断横向棋子
			for(s = (newchessX - 4) >=0 ? (newchessX - 4) : 0 ; s <= newchessX; s++) {//表示玩家获胜
			    t = newchessY;
				if(map[s][t] == CHESSCOLOR && s < 11) {//行棋子数量计算
					if(map[s + 1][t] == CHESSCOLOR) {
						if(map[s + 2][t] == CHESSCOLOR) {
							if(map[s + 3][t] == CHESSCOLOR) {
								if(map[s + 4][t] == CHESSCOLOR) {
									winX = s;
									winY = t;
									winWay = 1;
									if(CHESSCOLOR == 1) {//白棋
										winFLAG = 1;
									}else {//黑棋
										winFLAG = 2;
									}
									break;
								}
							}
						}
					}
				}
			}
			if(winFLAG != 0) {//如果某一方赢了就直接退出
				break;
			}
		//判断列项棋子
			for(t = (newchessY - 4) >=0 ? (newchessY - 4) : 0 ; t <= newchessY; t ++) {
				s = newchessX;
				if(map[s][t] == CHESSCOLOR && t < 11) {//列棋子数量计算
					if(map[s][t + 1] == CHESSCOLOR) {
						if(map[s][t + 2] == CHESSCOLOR) {
							if(map[s][t + 3] == CHESSCOLOR) {
								if(map[s][t + 4] == CHESSCOLOR) {
									winX = s;
									winY = t;
									winWay = 2;
									if(CHESSCOLOR == 1) {//白棋
										winFLAG = 1;
									}else {//黑棋
										winFLAG = 2;
									}
									break;
								}
							}
						}
					}
				}
			}
			if(winFLAG != 0) {//如果某一方赢了就直接退出
				break;
			}
		//判断左上到右下棋子
			for(s = comeX, t = comeY; s <= newchessX && t <= newchessY; s ++, t++) {
				if(map[s][t] == CHESSCOLOR && s < 11 && t < 11) {//斜下棋子数量计算
					if(map[s + 1][t + 1] == CHESSCOLOR) {
						if(map[s + 2][t + 2] == CHESSCOLOR) {
							if(map[s + 3][t + 3] == CHESSCOLOR) {
								if(map[s + 4][t + 4] == CHESSCOLOR) {
									winX = s;
									winY = t;
									winWay = 3;
									if(CHESSCOLOR == 1) {//白棋
										winFLAG = 1;
									}else {//黑棋
										winFLAG = 2;
									}
									break;
								}
							}
						}
					}
				}
			}
			if(winFLAG != 0) {//如果某一方赢了就直接退出
				break;
			}
		//判断右上到左下棋子
			for(s = toX, t = toY; s >= newchessX && t <= newchessY; s --, t++) {
				if(map[s][t] == CHESSCOLOR && s >= 4 && t < 11) {//斜上棋子数量计算
					if(map[s - 1][t + 1] == CHESSCOLOR) {
						if(map[s - 2][t + 2] == CHESSCOLOR) {
							if(map[s - 3][t + 3] == CHESSCOLOR) {
								if(map[s - 4][t + 4] == CHESSCOLOR) {
									winX = s;
									winY = t;
									winWay = 4;
									if(CHESSCOLOR == 1) {//白棋
										winFLAG = 1;
									}else {//黑棋
										winFLAG = 2;
									}
									break;
								}
							}
						}
					}
				}
			}
			if(winFLAG != 0) {//如果某一方赢了就直接退出
				break;
			}
		}
	}
}

四、资源下载

更多源码下载链接

  • 百度网盘:链接:https://pan.baidu.com/s/19F19h1RlWhdp_7qzqpOotg?pwd=gzxn
    提取码:gzxn

  • CSDN下载:(需要VIP)https://download.csdn.net/download/CSDN_anhl/86967552

  • GitHub获取:(感谢点星的小伙伴)https://github.com/liangdianjun/game/tree/main/Temp

五、文末总结

通过学习《五子棋》游戏的实现,让我对swing的相关知识有了进一步的了解,对java这门语言也有了比以前更深刻的认识。java的一些基本语法,比如数据类型、运算符、程序流程控制和数组等,理解更加透彻。java最核心的核心就是面向对象思想,对于这一个概念,又多了更深层次的领悟。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/5126.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中缀表达式转后缀表达式

1 后缀表达式 一种不需要括号的表达式方法&#xff0c;也把它称为 逆波兰表达式&#xff0c;是波兰逻辑学家卢卡西维奇&#xff08;Lukasiewicz)发明的一种表示表达式的方法。 2 中缀表达式 中缀表达式也就是我们常见的表达式书写方法&#xff0c;比如“8(2-1)352”就是一个中…

HTML期末大作业——游戏介绍(HTML+CSS+JavaScript) web前端开发技术 web课程设计网页规划与设计 Web大学生网页成品

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

前端爱心代码跟个风

光棍节new一个对象发给Ta <!DOCTYPE html> <html><head><title></title> </head> <style>* {padding: 0;margin: 0;}html,body {height: 100%;padding: 0;margin: 0;background: rgb(2, 2, 2);}canvas {position: absolute;width: …

关于 SAP 电商云 Spartacus UI Navigation Service 执行的一些明细

第一次触发的时候&#xff0c;navigation.uid 并没有值&#xff1a; 下图&#xff1a;navigation.service 的 getNavigationNode 方法。 触发这个订阅的入口&#xff1a; <cx-navigation-ui*ngIf"data$ | async as data"[node]"node$ | async"[ngC…

【HTML实战】把爱心代码放在自己的网站上是一种什么体验?

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【HTML】 最近随着电视剧《点燃我温暖你》的火热播出&#xff0c;剧中帅气学霸李洵的炫酷爱心代码也迅速火出了圈&#xf…

【毕业设计】口罩佩戴检测系统 - opencv 卷积神经网络 机器视觉 深度学习

文章目录&#x1f6a9; 0 简介&#x1f6a9;1 课题背景&#x1f6a9; 2 口罩佩戴算法实现2.1 YOLO 模型概览2.2 YOLOv32.3 YOLO 口罩佩戴检测实现2.4 实现代码2.5 检测效果&#x1f6a9; 3 口罩佩戴检测算法评价指标3.1 准确率&#xff08;Accuracy&#xff09;3.2 精确率(Prec…

Golang学习之路5-结构体/类封装等使用

文章目录前言一、结构体1.声明结构体2.匿名结构体二、类1.封装及绑定2.继承3.多态及接口4.类访问权限总结前言 go语言支持类的操作&#xff0c;但是没有class关键字&#xff0c;使用struct来模拟类、结构体。类支持封装、绑定方法、继承等 一、结构体 结构体是由零个或多个任…

【C++进阶】map和set( 万字详解)—— 上篇

&#x1f387;C学习历程&#xff1a;进阶 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…

青少年python系列 42.面向对象-继承

青少年python系列目录_老程序员115的博客-CSDN博客 青少年python教学视频ppt源码 继承&#xff1f;继承啥&#xff1f;提起继承这两个字&#xff0c;最先能够联想到的应该就是子继父业这个成语。还记得之前在我们的课程中提及过&#xff0c;在面向对象编程时&#xff0c;是可以…

【Linux】关于进程的理解、状态、优先级和进程切换

文章目录&#x1f4dd;一、操作系统进程1.运行队列2.运行状态&#x1f4dd;二、Linux进程状态&#x1f4dd;三、两个特殊进程1.僵尸进程2.孤儿进程&#x1f4dd;四、进程优先级1.优先级概念2.查看系统进程3.PRI和NI4.top命令更改nice5.特性&#x1f4dd;五、进程切换1.并发2.进…

软件工程方法论

&#x1f430;作者简介&#xff1a;一位普通高校的在校学生&#xff0c;致力于提高自己的编程能力。 &#x1f34c;个人主页&#xff1a;比昨天强一點的博客_CSDN博客-C语言从0到精通领域博主 &#x1f34d;系列专栏&#xff1a;C语言从0到精通_比昨天强一點的博客-CSDN博客 &a…

真良心干货保姆级手把手教你Python网络编程,学不会我去你家教你

Python网络编程基本概念(计算机网络基础)IP地址与端口IP地址端口网络通信协议网络通信协议网络协议的分层TCP/UDP套接字编程socket()函数介绍UDP 编程实现UDP发送数据实现UDP先发送数据再接收数据实现UDP实现多线程聊天TFTP文件下载器基本概念下载的过程python内置模块structTC…

C/C++ Qt 标准Dialog对话框组件应用

在Qt中对话框分为两种形式&#xff0c;一种是标准对话框&#xff0c;另一种则是自定义对话框&#xff0c;在一般开发过程中标准对话框使用是最多的了&#xff0c;标准对话框一般包括 QMessageBox,QInputDialog,QFileDialog 这几种&#xff0c;这里我将总结本人在开发过程中常用…

蓝桥杯——2022年11月第十四届蓝桥杯模拟赛第一期Java

1、二进制位数 问题描述 十进制整数 2 在十进制中是 1 位数&#xff0c;在二进制中对应 10 &#xff0c;是 2 位数。 十进制整数 22 在十进制中是 2 位数&#xff0c;在二进制中对应 10110 &#xff0c;是 5 位数。 请问十进制整数 2022 在二进制中是几位数&#xff1f; 答案…

C++学习之旅 第二章 printf与cout

目录 1.printf简介 2.printf的四种用法 2.1 printf("字符串"); 2.2 printf("输出控制符",输出参数); 2.3 printf("输出控制符1 输出控制符2 ,,,,,,,, ", 输出参数1&#xff0c; 输出参数2&#xff0c;....... ); 2.4 printf("输出控制…

化妆品展示网页设计作业 静态HTML化妆品网站 DW美妆网站模板下载 大学生简单网页作品代码 个人网页制作 学生个人网页设计作业

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

C++11【智能指针详解】

智能指针&#x1f3de;️1. 为什么引入智能指针&#xff1f;&#x1f301;2. 智能指针的使用及原理&#x1f4d6;2.1 RAII思想&#x1f4d6;2.2 智能指针的原理&#x1f320;3. 常见智能指针&#x1f4d6;3.1 auto_ptr&#x1f4d6;3.2 unique_ptr&#x1f4d6;3.3 shared_ptr&…

基于深度学习的宋词生成

《自然语言处理》课程报告 摘 要 宋词是一种相对于古体诗的新体诗歌之一&#xff0c;为宋代儒客文人智慧精华&#xff0c;标志宋代文学的最高成就。宋词生成属于自然语言处理领域的文本生成模块&#xff0c;当前文本生成领域主要包括基于语言模型的自然语言生成和使用深度学习…

RK3568平台开发系列讲解(安卓适配篇)Android 源码的 device 目录

🚀返回专栏总目录 文章目录 一、device 目录简介二、Android 产品配置各种变量沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 Android 源码的 device 目录。 一、device 目录简介 Android 源码下的 device 目录是 Android 源码中对产品的描述文件夹,各…

STM32个人笔记-CAN总线通讯

笔记来源于STM32F103VET6&#xff0c;野火指南者&#xff0c;中文参考手册&#xff0c;HAL库开发手册和b站的野火指南者视频。观看过好多次了&#xff0c;但往往理解得不够全面&#xff0c;现记下小笔记&#xff0c;用来回顾。属于个人笔记。​​​​​ 大四实习那年记忆颇深…