(JAVA)国际跳棋--棋里乾坤

2023-05-16

导入

因为假期内被朋友带入坑后起了兴趣,但发现网上似乎没有什么人写过国际跳棋的相关制作过程,于是制作了一个单纯的java的国际跳棋程序,虽然没有AI,但能够实现玩家双方的任务和皮肤(目前只设置了四个国家)选择,同时也增加了相关声效。

国际跳棋的简单介绍

对局时,棋子的原始摆法为:20枚黑兵排列在已方后四排的黑格内,白方棋子同黑,黑棋摆在1到20棋位,白棋摆在31到50棋位。经过一段对局,任何一方的兵冲破重重障碍,走至并停留在对方底线,即升变为王棋,如果没有停留在对方底线不能立即成王。王棋可以用两个兵摞起来表示,也可以将兵翻转过来做王棋。
兵与王棋的走法: 对局开始,由执白棋者先行,然后由黑棋行棋;双方轮流走子,直到终局。
白、黑各走一着叫一个回合。对局开始时,出现在棋盘上的都是兵。
兵在走棋时,每步棋只能向前方邻近的空棋位上向左或向右移动一格,并且只能前进,不允许后退。
兵的吃子法是用跳的形式进行的。这和一般跳棋的走法相似,只要自己的一个兵与对方的一枚棋子相遇,并且与这两枚棋子成一斜行的、紧挨着对方棋子的棋位是空着的,那么,轮至走子的一方就要用自己的兵跳过对方的棋子,放在紧挨着对方棋子后面的空棋位上,将对方的那枚棋子吃掉。吃子时,可以象普通跳棋一样一次连跳连吃几枚棋子,但连跳时不允许以自己的棋子为桥梁,也就是说,自己的棋子不能从自己的棋子上越过去再去吃对方的棋子。兵吃子时可以后退。
王棋的走法与兵不同,它可以前进,可以后退;有些规则中,只要在一条斜线上,一次移动几格都可能。有些规则则没有这些规定,一次仍然走一格。王棋的跳吃,也比兵的跳吃自由度要大得多。有些规则中,只要在同一斜线上,不管距离多么远,都可以跳过对方的这枚棋子,停在它后面的任何一个空格里,从而将对方这枚棋子吃掉。有些规则则没有这些规定,跳吃除了可进可退和兵一样。王棋的连跳,与兵的连跳大致相同,只是有些规则不限距离;只要有机会,一次可以跳吃对方的数枚棋子。
吃子还有三条重要规则:第一,能吃子必须吃子,不能不吃;第二,能多吃子,必须多吃,不能少吃;第三,能吃子的时候必须吃到底,不许半路停下不再吃了.以上规则无论是否对自己有利都必须执行.
如果将对方的棋子吃光或者让对方没有可以走的棋了即为获胜。

相关类

大概包含7个小类用以实现不同相关功能

  1. UI
    主函数部分,主要用于调出皮肤选择功能和界面的设置功能
public class UI {
	JFrame jiemian = new JFrame();
	qipan qi = new qipan();
	Graphics g;
	int l = 1;
	JButton lun = new JButton();
	JPanel jj = new JPanel();
	int[] se = new int[2];// 双方的皮肤
	String[] guojia = { "德国", "法国", "美国", "巴西" };

	public void show() {
		xuanze k = new xuanze();
		k.startx = qi.startx;
		k.starty = qi.starty;
		k.size = qi.size;
		k.qi = qi;
		k.lun = lun;
		k.f = jiemian;
		k.qw[0] = guojia[se[0]];
		k.qw[1] = guojia[se[1]];// 对战双方的名字
		qi.se[0] = se[0];
		qi.se[1] = se[1];// 双方皮肤颜色
		lun.setText(guojia[se[0]]);
		lun.setBackground(new Color(163, 184, 204));
		lun.setFont(new Font("华文新魏", Font.PLAIN, 40));
		lun.addMouseListener(k);
		qi.addMouseListener(k);
		qi.yuchuli();// 预处理棋盘;
		jj.add(lun);
		jiemian.add(jj, BorderLayout.NORTH);
		jiemian.add(qi, BorderLayout.CENTER);
		g = qi.getGraphics();
		k.g = qi.getGraphics();
		jiemian.setSize(1000, 1000);
		jiemian.setVisible(true);
		jiemian.setLocationRelativeTo(null);
	}

	public static void main(String[] args) {
		huangfu h = new huangfu();
		h.choose();
	}
}

  1. huangfu
    用于给游玩者提供所代表的国家的选择,从而为后续棋盘棋子的绘制来传递信息
public class huangfu {
	JFrame f=new JFrame();
	JPanel g=new JPanel();
	JPanel k2=new JPanel();
	pifu gg=new pifu();
	String [] g2= {"德国","法国","美国","巴西"};
	public void choose(){
		f.setVisible(true);
		f.setSize(200, 200);
		f.add(g,BorderLayout.CENTER);
		f.add(k2,BorderLayout.NORTH);
		JButton h=new JButton();
		k2.add(h);//添加按钮
		h.setText("选择先手P1国家");
		gg.h=h;
		f.setLocationRelativeTo(null);
		gg.f=f;
		for(int i=0;i<g2.length;i++)
		{
			JButton j=new JButton(g2[i]);
			g.add(j);
			j.addActionListener(gg);
		}
	}
}

3.皮肤
主要作为huangfu类中界面添加的按钮的监听器,用来通过按钮的选择改变棋盘绘制的相关类的相关值,从而来进行皮肤选择

public class pifu implements ActionListener {
	UI u = new UI();
	JFrame f = new JFrame();
	JButton h = new JButton();
	int flag = 0;

	public void actionPerformed(ActionEvent e) {
		String a = e.getActionCommand();
		if (a.equals("德国")) {
			u.se[flag] = 0;//此数组代表的是颜色编号
			flag++;
		}
		if (a.equals("法国")) {
			u.se[flag] = 1;
			flag++;
		}
		if (a.equals("美国")) {
			u.se[flag] = 2;
			flag++;
		}
		if (a.equals("巴西")) {
			u.se[flag] = 3;
			flag++;
		}
		if (flag == 2) {
			f.setVisible(false);
			u.show();// 选择完皮肤后开始进行游戏;
		} else {
			h.setText("选择后手P2国家");
		}
	}
}

4.qipan
该类主要进行棋盘相关数据的预处理与通过重写其重绘代码来实现棋盘的实时变化

public class qipan extends JPanel {
	int[][] pan = new int[40][40];
	int[][] kk = new int[40][40];
	int[][] wan = new int[40][40];// 记录王的状态
	int startx = 130, starty = 70, size = 70;
	int[] se = new int[2];// 双方的皮肤
	Image[] putong = new Image[10];
	Image[] wangqi = new Image[10];
	String[] tu = { "C:\\Users\\lenovo\\Desktop\\素材\\德国.png", "C:\\Users\\lenovo\\Desktop\\素材\\法国.png",
			"C:\\Users\\lenovo\\Desktop\\素材\\美国.png", "C:\\Users\\lenovo\\Desktop\\素材\\巴西.png" };
	String[] tu2 = { "C:\\Users\\lenovo\\Desktop\\素材\\德.png", "C:\\Users\\lenovo\\Desktop\\素材\\法.png",
			"C:\\Users\\lenovo\\Desktop\\素材\\美.png", "C:\\Users\\lenovo\\Desktop\\素材\\巴.png" };

	public void yuchuli() {
		for (int i = 1; i <= 10; i++)
			for (int j = 1; j <= 10; j++) {
				pan[j][i] = 0;
				kk[i][j] = 0;
				wan[i][j] = 0;
			}
		for (int i = 1; i <= 4; i++)
			for (int j = i % 2 + 1; j <= 10; j += 2)
				pan[j][i] = 1;// 黑子
		for (int i = 7; i <= 10; i++)
			for (int j = i % 2 + 1; j <= 10; j += 2)
				pan[j][i] = 2;// 白子
		for (int i = 1; i <= 10; i++)
			for (int j = i % 2 + 1; j <= 10; j += 2) {
				kk[i][j] = 1;
			}
		for (int i = 0; i < tu.length; i++) {
			ImageIcon g = new ImageIcon(tu[i]);
			putong[i] = g.getImage();
		}
		for (int i = 0; i < tu2.length; i++) {
			ImageIcon g = new ImageIcon(tu2[i]);
			wangqi[i] = g.getImage();
		} // 初始化皮肤
	}// 预处理棋盘

	public void paint(Graphics g) {
		super.paint(g);
		ImageIcon ol = new ImageIcon("C:\\Users\\lenovo\\Desktop\\素材\\背景.jpg");
		Image ii = ol.getImage();
		g.drawImage(ii, 0, 0, this.getWidth(), this.getHeight(), null);
		for (int i = 1; i <= 10; i++)
			for (int j = 1; j <= 10; j += 1) {
				int placex = startx + (i - 1) * size;
				int placey = starty + (j - 1) * size;
				Color a = new Color(224, 226, 224);
				g.setColor(a);
				g.fillRect(placex, placey, size, size);
				if (kk[i][j] == 1) {// 褐色格
					a = new Color(200, 140, 109);
					g.setColor(a);
					g.fillRect(placex, placey, size, size);
				}
				if (kk[i][j] == 3) {// 被选定后
					a = new Color(247, 100, 46);
					g.setColor(a);
					g.fillRect(placex, placey, size, size);
				}
				if (kk[i][j] == 4) {// 必选的棋子
					a = new Color(249, 190, 40);
					g.setColor(a);
					g.fillRect(placex, placey, size, size);
				}
				if (kk[i][j] == 5) {// 能选的棋子
					a = new Color(249, 190, 40);
					g.setColor(a);
					g.fillRect(placex, placey, size, size);
				}
			} // kk值代表各表格不同的状态
		for (int i = 1; i <= 10; i++)
			for (int j = 1; j <= 10; j++) {
				if (pan[i][j] == 1 && wan[i][j] == 0) {
					int placex = startx + (i - 1) * size;
					int placey = starty + (j - 1) * size;
					g.drawImage(putong[se[1]], placex + 4, placey + 4, size - 8, size - 8, null);
				}
				if (pan[i][j] == 2 && wan[i][j] == 0) {
					int placex = startx + (i - 1) * size;
					int placey = starty + (j - 1) * size;
					g.drawImage(putong[se[0]], placex + 4, placey + 4, size - 8, size - 8, null);
				}
				if (wan[i][j] == 1 && pan[i][j] == 1) {
					int placex = startx + (i - 1) * size;
					int placey = starty + (j - 1) * size;
					g.drawImage(wangqi[se[1]], placex + 4, placey + 4, size - 8, size - 8, null);
				} // 王棋
				if (wan[i][j] == 1 && pan[i][j] == 2) {
					int placex = startx + (i - 1) * size;
					int placey = starty + (j - 1) * size;
					g.drawImage(wangqi[se[0]], placex + 4, placey + 4, size - 8, size - 8, null);
				} // 王棋
			} // 画棋子
		for (int i = 1; i <= 11; i++) {
			Color a = new Color(27, 28, 29);
			g.setColor(a);
			g.drawLine(startx + (i - 1) * size, starty, startx + (i - 1) * size, starty + 10 * size);
			g.drawLine(startx, starty + (i - 1) * size, startx + 10 * size, starty + (i - 1) * size);
		} // 画线
	}
}

5.xuanze
对棋盘鼠标操作的监听器,用于获取点击位置来对棋盘棋子信息进行选择,从而来进行状态变化

public class xuanze implements MouseListener {
	int x1 = 0, x2 = 0, y1 = 0, y2 = 0;
	caozuo k = new caozuo();
	int startx, starty, size;
	int cc, qq, ci = 0, flag = 0;// flag判断是不是出现了必吃;
	qipan qi = new qipan();
	Graphics g;
	JButton lun = new JButton();
	JFrame f = new JFrame();
	String[] qw = new String[2];

	public void mouseClicked(MouseEvent e) {
		k.qi = this.qi;
		k.yupan(ci);
		if (x1 == 0) {
			x1 = (e.getX()/* 获取的x值 */ - startx) / size + 1;
			y1 = (e.getY()/* 获取的y值 */ - starty) / size + 1;// 在棋盘中的行列位置
			System.out.println(x1 + " " + y1);
			if (flag == 1 && qi.kk[x1][y1] != 4)// 有吃必选能吃子的那个
				x1 = y1 = 0;
			else if (flag == 0 && qi.kk[x1][y1] != 5 || qi.pan[x1][y1] % 2 != ci % 2 || qi.pan[x1][y1] == 0)// 无效选择;
				x1 = y1 = 0;
			else {
				qq = qi.kk[x1][y1];
				qi.kk[x1][y1] = 3;// 标记为选择状态;
				qi.repaint();
			}

		} else {
			cc = 0;
			x2 = (e.getX() - startx) / size + 1;
			y2 = (e.getY() - starty) / size + 1;
			if (x2 != x1 && y2 != y1) {
				cc = k.tiao(x1, y1, x2, y2);
				if (cc == 2)
					x1 = y1 = x2 = y2 = 0;

				else {// 能跳则清空
					qi.kk[x1][y1] = qq;
					int lianchi = 0;
					if (cc == 3) {
						lianchi = k.pand(x2, y2);
						ci += lianchi;
					}
					if (lianchi == 0)
						x1 = x2 = y1 = y2 = 0;
					else// 确定可以连吃后就不需要再点击同一个棋子了。
					{
						flag = k.yupan(ci);
						x1 = x2;
						y1 = y2;
						x2 = y2 = 0;
					}
					ci++;
					ci %= 2;
					lun.setText(qw[ci]);// 更新轮盘状态
				}
				flag = k.yupan(ci);
				if (flag == -9) {
					int result;
					if (ci == 0)
						result = JOptionPane.showConfirmDialog(qi, qw[1] + "胜利,游戏结束,你想继续吗?", "友情提示",
								JOptionPane.YES_NO_OPTION);
					else
						result = JOptionPane.showConfirmDialog(qi, qw[0] + "胜利,游戏结束,你想继续吗?", "友情提示",
								JOptionPane.YES_NO_OPTION);
					System.out.println("result=" + result);
					if (result == 0) {
						qi.yuchuli();
					} else {
						chengfa cc = new chengfa();
						f.setVisible(false);// 关闭界面
						cc.cf();
					}
				}
				qi.repaint();// 重新绘制
			}
			if (x2 == x1 && y2 == y1)// 取消操作
			{
				qi.kk[x1][y1] = qq;
				x1 = x2 = y1 = y2 = 0;
				qi.repaint();
			}
		}
	}

	public void mousePressed(MouseEvent e) {
	}

	public void mouseReleased(MouseEvent e) {
	}

	public void mouseEntered(MouseEvent e) {
	}

	public void mouseExited(MouseEvent e) {
	}
}

6.caozuo
用于对xuanze类的选择棋子进行可行性的判断与状态的更改,从而实现棋盘的动态变化,来使游戏进行

public class caozuo {
	qipan qi = new qipan();
	int flag = 0;
	int[][] lj = { { 1, 1 }, { 1, -1 }, { -1, 1 }, { -1, -1 } };// 位置

	public int yupan(int x) {// 需满足能吃则吃
		if (x == 0)
			x = 2;
		flag = 0;
		for (int i = 1; i <= 10; i++) {
			if (qi.pan[i][1] == 2 && qi.wan[i][1] == 0) {
				qi.wan[i][1] = 1;
				File f = new File("C:\\Users\\lenovo\\Desktop\\素材\\p1变王.wav");
				URL sy;
				try {
					sy = f.toURL();
					AudioClip aau;
					aau = Applet.newAudioClip(sy);// 播放声音文件
					aau.play();
				} catch (MalformedURLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (qi.pan[i][10] == 1 && qi.wan[i][10] == 0) {
				qi.wan[i][10] = 1;
				File f = new File("C:\\Users\\lenovo\\Desktop\\素材\\p2变王.wav");
				URL sy;
				try {
					sy = f.toURL();
					AudioClip aau;
					aau = Applet.newAudioClip(sy);// 播放声音文件
					aau.play();
				} catch (MalformedURLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		for (int i = 1; i <= 10; i++)// 王的有子必吃判定
			for (int j = 1; j <= 10; j++) {
				if (qi.wan[i][j] == 1 && qi.pan[i][j] == x) {
					for (int ci = i - 1, ci2 = j - 1; ci > 1 && ci2 > 1; ci--, ci2--) {
						if (qi.pan[ci][ci2] == qi.pan[i][j]) {
							break;
						}
						if (qi.pan[ci][ci2] == 3 - qi.pan[i][j]) {
							if (qi.pan[ci - 1][ci2 - 1] == 0) {
								qi.kk[i][j] = 4;
								flag = 1;
							}
							break;
						}
					}
					for (int ci = i - 1, ci2 = j + 1; ci > 1 && ci2 < 10; ci--, ci2++) {
						if (qi.pan[ci][ci2] == qi.pan[i][j]) {
							break;
						}
						if (qi.pan[ci][ci2] == 3 - qi.pan[i][j]) {
							if (qi.pan[ci - 1][ci2 + 1] == 0) {
								qi.kk[i][j] = 4;
								flag = 1;
							}
							break;
						}
					}
					for (int ci = i + 1, ci2 = j - 1; ci < 10 && ci2 > 1; ci++, ci2--) {
						if (qi.pan[ci][ci2] == qi.pan[i][j]) {
							break;
						}
						if (qi.pan[ci][ci2] == 3 - qi.pan[i][j]) {
							if (qi.pan[ci + 1][ci2 - 1] == 0) {
								qi.kk[i][j] = 4;
								flag = 1;
							}
							break;
						}
					}
					for (int ci = i + 1, ci2 = j + 1; ci < 10 && ci2 < 10; ci++, ci2++) {
						if (qi.pan[ci][ci2] == qi.pan[i][j]) {
							break;
						}
						if (qi.pan[ci][ci2] == 3 - qi.pan[i][j]) {
							if (qi.pan[ci + 1][ci2 + 1] == 0) {
								qi.kk[i][j] = 4;
								flag = 1;
							}
							break;
						}
					}
				}
			}
		for (int i = 1; i <= 10; i++)
			for (int j = 1; j <= 10; j++) {
				int dd = 0;
				if (qi.wan[i][j] == 0 || qi.wan[i][j] == 1 && qi.pan[i][j] != x) {// 非本方王棋的其他棋子的能吃判定
					if (qi.pan[i][j] == x) {
						for (int k = 0; k <= 3; k++)// 判断必吃
						{
							if (i + lj[k][0] <= 9 && i + lj[k][0] >= 2 && j + lj[k][1] <= 9 && j + lj[k][1] >= 2)// 判断棋子的范围
								if (qi.pan[i + lj[k][0]][j + lj[k][1]] != 0
										&& qi.pan[i + lj[k][0]][j + lj[k][1]] != qi.pan[i][j]
										&& qi.pan[i + lj[k][0] * 2][j + lj[k][1] * 2] == 0) {
									qi.kk[i][j] = 4;
									flag = 1;
									dd = 1;
								}
						}
					}
					if (dd == 0) {
						qi.kk[i][j] = (i + j) % 2;
					}
				}
			}
		if (flag == 0) {
			int ll = -9;
			for (int i = 1; i <= 10; i++)
				for (int j = 1; j <= 10; j++) {
					if (qi.pan[i][j] == x) {
						for (int k = 0; k <= 3; k++)// 判断能动子
						{
							if (i + lj[k][0] <= 10 && i + lj[k][0] >= 1 && j + lj[k][1] <= 10 && j + lj[k][1] >= 1)// 判断棋子的范围
								if (qi.pan[i + lj[k][0]][j + lj[k][1]] == 0) {
									qi.kk[i][j] = 5;
									ll = 0;
								}
						}
					}
				}
			flag = ll;
		}
		qi.repaint();
		return flag;
	}

	public int pand(int x, int y) {
		if (qi.wan[x][y] == 0)
			for (int i = 0; i <= 3; i++)// 判断连吃
			{
				if (x + lj[i][0] <= 9 && x + lj[i][0] >= 2 && y + lj[i][1] <= 9 && y + lj[i][1] >= 2)// 判断棋子的范围
					if (qi.pan[x + lj[i][0]][y + lj[i][1]] != 0 && qi.pan[x + lj[i][0]][y + lj[i][1]] != qi.pan[x][y]
							&& qi.pan[x + lj[i][0] * 2][y + lj[i][1] * 2] == 0) {// 判断有没有能连吃的
						return -1;
					}
			}
		else {// 王棋的连吃
			for (int ci = x - 1, ci2 = y - 1; ci > 1 && ci2 > 1; ci--, ci2--) {
				if (qi.pan[ci][ci2] == qi.pan[x][y]) {
					break;
				}
				if (qi.pan[ci][ci2] == 3 - qi.pan[x][y]) {
					if (qi.pan[ci - 1][ci2 - 1] == 0) {
						return -1;
					}
					break;
				}
			}
			for (int ci = x - 1, ci2 = y + 1; ci > 1 && ci2 < 10; ci--, ci2++) {
				if (qi.pan[ci][ci2] == qi.pan[x][y]) {
					break;
				}
				if (qi.pan[ci][ci2] == 3 - qi.pan[x][y]) {
					if (qi.pan[ci - 1][ci2 + 1] == 0) {
						return -1;
					}
					break;
				}
			}
			for (int ci = x + 1, ci2 = y - 1; ci < 10 && ci2 > 1; ci++, ci2--) {
				if (qi.pan[ci][ci2] == qi.pan[x][y]) {
					break;
				}
				if (qi.pan[ci][ci2] == 3 - qi.pan[x][y]) {
					if (qi.pan[ci + 1][ci2 - 1] == 0) {
						return -1;
					}
					break;
				}
			}
			for (int ci = x + 1, ci2 = y + 1; ci < 10 && ci2 < 10; ci++, ci2++) {
				if (qi.pan[ci][ci2] == qi.pan[x][y]) {
					break;
				}
				if (qi.pan[ci][ci2] == 3 - qi.pan[x][y]) {
					if (qi.pan[ci + 1][ci2 + 1] == 0) {
						return -1;
					}
					break;
				}
			}
		}
		return 0;
	}

	/*
	 * public int tiao(int x,int y,int x2,int y2,int[][] data){
	 * 
	 * return 0; }
	 */
	public int tiao(int x, int y, int x2, int y2) {
		if (qi.pan[x][y] == 0 || qi.pan[x2][y2] != 0 || Math.abs(x2 - x) != Math.abs(y2 - y)) {
			System.out.println("wrong");// 不能选没有子的格为起点,不能选非对角线线上的和有子的格子
			return 2;
		} else {
			if (qi.pan[x][y] == 1 || qi.pan[x][y] == 2) {
				if (Math.abs(x2 - x) == 1) {
					if (qi.kk[x][y] != 4/* 必须吃子的棋不能直跳一格 */ && (qi.wan[x][y] == 1 || qi.pan[x][y] == 1 && y2 - y == 1
							|| qi.pan[x][y] == 2 && y2 - y == -1)) {// 棋子只能前进,不能后退,但王可以
						qi.pan[x2][y2] = qi.pan[x][y];
						qi.pan[x][y] = 0;
						qi.wan[x2][y2] = qi.wan[x][y];
						qi.wan[x][y] = 0;
						File f = new File("C:\\Users\\lenovo\\Desktop\\素材\\下棋.wav");// 下棋音效
						URL sy;
						try {
							sy = f.toURL();
							AudioClip aau;
							aau = Applet.newAudioClip(sy);// 播放声音文件
							aau.play();
						} catch (MalformedURLException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					} else {
						System.out.println("wrong");
						return 2;
					}
				} else if (qi.wan[x][y] != 1 && Math.abs(x2 - x) == 2) {
					if (qi.pan[(x + x2) / 2][(y + y2) / 2] == qi.pan[x][y] || qi.pan[(x + x2) / 2][(y + y2) / 2] == 0) {
						System.out.println("wrong");
						return 2;
					} else {
						qi.pan[x2][y2] = qi.pan[x][y];
						qi.pan[x][y] = 0;
						qi.pan[(x + x2) / 2][(y + y2) / 2] = 0;
						qi.wan[x2][y2] = qi.wan[x][y];
						qi.wan[x][y] = 0;
						qi.wan[(x + x2) / 2][(y + y2) / 2] = 0;
						File f = new File("C:\\Users\\lenovo\\Desktop\\素材\\吃子.wav");
						URL sy;
						try {
							sy = f.toURL();
							AudioClip aau;
							aau = Applet.newAudioClip(sy);// 播放声音文件
							aau.play();
						} catch (MalformedURLException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						return 3;// 吃子状态返回
					}
				} else if (qi.wan[x][y] == 1) {// 王棋随心所欲
					int xz = 1, yz = 1, ci = qi.pan[x][y], ff = 0;
					if (x2 < x)
						xz = -1;
					if (y2 < y)
						yz = -1;
					for (int i = 1; i < Math.abs(x2 - x); i++) {
						if (qi.pan[x + i * xz][y + i * yz] == ci) {
							System.out.println("wrong");// 路上不能出现自己的子
							return 2;
						}
						if (qi.pan[x + i * xz][y + i * yz] == 3 - ci) {
							ff++;
							if (ff >= 2) {
								System.out.println("wrong");// 中间不能出现两颗其他的子
								return 2;
							}
						}
					}
					if (qi.kk[x][y] == 4 && ff != 1)// 必吃却没吃
					{
						System.out.println("wrong");
						return 2;
					}
					for (int i = 1; i < Math.abs(x2 - x); i++) {
						qi.pan[x + i * xz][y + i * yz] = 0;
						qi.wan[x + i * xz][y + i * yz] = 0;// 可以则清空路上的子
					}
					qi.pan[x2][y2] = qi.pan[x][y];
					qi.pan[x][y] = 0;
					qi.wan[x2][y2] = qi.wan[x][y];
					qi.wan[x][y] = 0;
					if (ff != 1) {
						File f = new File("C:\\Users\\lenovo\\Desktop\\素材\\下棋.wav");
						URL sy;
						try {
							sy = f.toURL();
							AudioClip aau;
							aau = Applet.newAudioClip(sy);// 播放声音文件
							aau.play();
						} catch (MalformedURLException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
					if (ff == 1)// 吃了子要返回吃子状态,以便判断连吃
					{
						File f = new File("C:\\Users\\lenovo\\Desktop\\素材\\吃子.wav");
						URL sy;
						try {
							sy = f.toURL();
							AudioClip aau;
							aau = Applet.newAudioClip(sy);// 播放声音文件
							aau.play();
						} catch (MalformedURLException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						return 3;
					}
				} else {
					System.out.println("wrong");
					return 2;
				}
			}
		}
		return 0;// 跳棋状态返回
	}
}

7.chengfa
游戏嘛…输了当然要有惩罚2333,该类主要就是来进行惩罚内容的决定

public class chengfa {
	JFrame cc = new JFrame();
	JPanel c1 = new JPanel();
	JButton c2 = new JButton(); 
	String [] f={"说说自己的感情经历","俯卧撑20个","向左边第一位同性告白233","深蹲40次"};
	public void cf(){
		cc.setSize(500,150);
		cc.setVisible(true);
		cc.setLocationRelativeTo(null);
		cc.add(c1,BorderLayout.CENTER);
		c1.add(c2);
		int gg1=f.length;
		int gg2 =(int)(Math.random()*gg1);
		c2.setBackground(new Color(163, 184, 204));
		c2.setFont(new Font("华文新魏", Font.PLAIN, 40));
		c2.setText(f[gg2]);
	}
}

结语

(虽然不知道有没有人看2333)第一次做这么大的程序,难免有疏漏之处,希望大家能多多指教。下面是本人微信
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(JAVA)国际跳棋--棋里乾坤 的相关文章

  • Modbus通信协议

    一 Modbus 协议简介 Modbus 协议是应用于电子控制器上的一种通用语言 通过此协议 xff0c 控制器相互之间 控制器经由网络 xff08 例如以太网 xff09 和其它设备之间可以通信 它已经成为一通用工业标准 有了它 xff0
  • 77组合

    给定两个整数 n 和 k xff0c 返回 1 n 中所有可能的 k 个数的组合 示例 输入 n 61 4 k 61 2 输出 2 4 3 4 2 3 1 2 1 3 1 4 最容易想到的应该是回溯 xff0c 更多题目思路及代码见 xff
  • 结构体内数据元素对齐

    默认情况下 xff0c 为方便结构体内元素的访问于管理 xff0c 当结构体内的数据元素的长度小于处理器的位数的时候 xff0c 便以结构体内的最长数据元素为对齐单位 xff0c 即结构体的长度一定为最长数据元素的长度的整数倍 如果结构体内
  • 关于stm32中串口重定向问题详解(找个时间好好理解下)

    usart这部分代码我也是从网上copy出来的 xff0c 一下是作者的解释 xff1a 简单地说 xff1a 想在mdk 中用printf xff0c 需要同时重定义fputc函数和避免使用semihosting 半主机模式 xff09
  • 缓冲区溢出(buffer overflow)避免方法

    什么是缓冲区溢出 xff1f copy数据进buffer时 xff0c 数据长度超过buffer中的剩余空间 缓冲区溢出的危害 xff1f 缓冲区溢出 xff0c 结果随机 xff0c 可能会导致程序功能不正常 xff0c 也可能导致程序崩
  • 【嵌入式系统应用开发】ROS环境安装配置与入门实操

    目录 前言1 ROS简介2 ROS软件安装2 1 添加ROS软件源2 2 添加密钥2 3 安装ROS2 4 初始化rosdep2 5 设置环境变量2 6 安装rosinstall 3 ROS初试 小海龟3 1 启动ROS Master3 2
  • 头文件包含的合理顺序

    如果包含顺序不当 xff0c 可能出现包含顺序依赖问题 xff0c 甚至引起编译错误 推荐如下顺序 xff1a 在头文件中 xff1a xff08 1 xff09 包含当前工程中所需要的自定义头文件 xff08 顺序自定 xff09 xff
  • windows下使用 SITL 模拟飞行——APM

    1 环境配置 按照官网教程配置环境 xff0c 链接 xff1a https ardupilot org dev docs building setup windows cygwin html building setup windows
  • Nvidia Xavier Nx平台修改CAN时钟调试记录

    1 前言 JETSON NX开发板上配置CAN bus与一个CAN收发器SN65HVD230 要求是改变设备树中的CAN时钟速率 让CAN时钟修改为40MHZ 2 如何设置准确的40MHz 要实现40MHz 首先需要设置CAN父时钟为pll
  • 【CMake】常见目录——10.1安装项目

    CMake中的目录 常见目录所代表的含义 PROJECT SOURCE DIR xff1a 工程的根目录 PROJECT BINARY DIR xff1a 运行cmake命令的目录 xff0c 通常为 PROJECT SOURCE DIR
  • 编译的时候所使用的动态库中出现错误:未定义的引用

    1 使用makefile编译的时候 xff0c 出现错误如下 xff1a 如上图所示 xff0c 是在动态库libicdbapi so中出现了未定义错误 xff0c 既然是未定义错误 xff0c 说明sqlprct sqlnult这5个符号
  • STL1:简介

    STL1 简介 1 背景1 1 STL是什么 xff1f 1 2 STL与C 43 43 标准库的关系1 3 版本 2 STL的组成3 容器分类4 迭代器分类4 1 分类原则 xff1a 访问方式4 2 分类原则 xff1a 操作类型4 3
  • Linux网络编程 5 - select模式的TCP服务器

    为了同时处理多个客户端的连接 xff0c 上一篇介绍了利用多线程的方法实现 xff0c 每个连接新建一个线程 xff0c 然后各自去处理 这是最简单也是最容易想到的方式 客户端的连接存在 xff0c 线程就存在 但是 xff0c 对于每一个
  • c标准库—参考手册

    1 lt errno h gt 2 lt float h gt 3 lt limits h gt 4 lt locale h gt 5 lt math h gt 6 lt signal h gt 7 lt setjmp h gt 8 lt
  • MPU6050

    1 个人总结 常用的MPU6050有八个针脚 xff0c VCC 跟GND 给模块供电 xff0c 模块通讯方式采用IIC通讯 xff0c SCL跟SDA为信号传递通道 xff0c XDA 跟 XCl是用来外接电磁传感器 xff0c 玩过M
  • 自学 Python 第一天

    总结 xff1a 感觉Python 前边学起来 跟c差不多 xff0c 之前学习过c语言 xff0c 但是并没有学这么细 xff0c 刚好学python xff0c 把当时忽略的知识点 重新减一下 打算花费两周学完Python为后续学习Op
  • 多功能悬赏任务平台app+小程序源码开源版搭建开发

    悬赏任务app源码 xff0c 从名字本身就可以理解这个PHP项目的流程 通过在线管理员工任务 即使它也可以在Intranet中工作 MySQL数据库是此源代码的最终部分 它易于实施和遵循 它是所有企业公司的主要项目应用程序 IT公司的任务
  • usart串口发送与接收问题

    项目场景 xff1a 串口通信可以说很常用的一种通信方式 xff0c 例如 蓝牙通信 openmv 与串口 通信 等等 问题描述 1 我们在进行数据传输过程中数据不时出现丢失的情况 xff0c 偶尔会丢失一部分数据 xff0c 导致数据部分
  • 基于51单片机光照强度检测系统

    介绍 本设计采用单片机作为数据处理与控制单元 xff0c 为了进行数据处理 xff0c 通过光敏电阻来感应光强弱变化 xff0c 经过ADC0804转换 xff0c 直接将数字信号送入到单片机中进行数据处理 单片机数据处理之后 xff0c
  • 基于51单片机控制的波形输出

    介绍 本模块采用PCF8591 xff0c 它是一款AD DA集成芯片 所以本节对iic通信协议不做过多的介绍 xff0c 重心放在iic的rtl建模 xff0c 本次通过iic控制PCF8591实现DAC输出功能 及输出波形 将数字量转为

随机推荐

  • 基于51单片机通过译码器控制系统

    用二极管 开关 译码器 单片机 数码管 xff08 点阵显示器 xff09 等器件设计仿真电路 xff0c 实现的功能 xff0c 用红黄绿二极管分别连接开关作为3 8译码器的输入 xff0c 译码器的输出连接到单片机的端口 xff0c 单
  • 基于51单片机串口通信的实验

    串口介绍 串口是一种应用十分广泛的通讯接口 xff0c 串口成本低 容易使用 通信线路简单 xff0c 可实现两个设备的互相通信 单片机的串口可以使单片机与单片机 单片机与电脑 单片机与各式各样的模块互相通信 xff0c 极大的扩展了单片机
  • 【QT】设置子窗口显示位置

    QT通过setGeoment来设置子窗口的位置 QWidget span class token operator span widget test span class token operator 61 span new span cl
  • 【散文诗】C语言的本质(基于ARM深入分析C程序)

    文章目录 1 ARM架构ARM通用寄存器及其别名基本汇编指令LDR xff1a STR xff1a ADD xff1a SUB xff1a BL xff1a PUSH xff1a POP xff1a MOV xff1a 2 局部变量的分配与
  • 【MQTT基础篇(三)】连接MQTT服务端

    文章目录 连接MQTT服务端1 CONNECT 连接服务端1 1 clientId 客户端ID1 2 cleanSession 清除会话1 3 keepAlive 心跳时间间隔 2 CONNACK 确认连接请求2 1 returnCode
  • 【MQTT基础篇(五)】发布、订阅和取消订阅

    文章目录 发布 订阅和取消订阅1 PUBLISH 发布消息1 1 topicName 主题名1 2 QoS 服务质量等级1 3 packetId 报文标识符1 4 retainFlag 保留标志1 5 Payload 有效载荷1 6 dup
  • 【FreeRTOS(六)】队列

    文章目录 队列创建队列 xQueueCreate发送消息至队列 xQueueSend接受队列消息 xQueueReceive获取队列信息数目 uxQueueMessagesWaiting代码示例创建队列集 xQueueCreateSet将队
  • 2021-09-29 使用安卓手机Camera和IMU信息运行ORBSLAM3

    目的 安卓手机具备camera imu gps等SLAM技术所需要的传感器 xff0c 且安卓手机很普及 如果能使用安卓设备作为ros的sensor xff0c 通过安卓设备节点传输到计算机 xff0c 进行实时定位与建图分析 xff0c
  • 【ESP32 WiFi篇(五)】ESP32 HTTP

    文章目录 1 HTTP概述1 1 超文本1 2 请求 响应1 3 TCP 2 HTTP请求和响应2 1 HTTP请求响应过程2 2 客户端请求消息2 2 1 请求行2 2 1 1 请求方法2 2 1 2 URL2 2 1 3 HTTP版本
  • 【Linux 裸机篇(五)】I.MX6ULL BSP工程管理下的 Makefile编写、链接脚本

    目录 一 BSP 工程二 Makefile三 链接脚本 Makefile 的静态模式和函数1 静态模式2 函数2 1 patsubst2 2 dir2 3 notdir2 4 foreach 一 BSP 工程 文件夹描述bsp存放驱动文件i
  • 【Linux 裸机篇(六)】I.MX6U 主频和时钟配置

    目录 一 时钟系统详解1 系统时钟来源2 7路 PLL 时钟源2 1 ARM PLL PLL1 2 2 528 PLL PLL2 2 3 USB1 PLL PLL3 2 4 USB2 PLL PLL7 2 5 ENET PLL PLL6 2
  • 【Linux 裸机篇(七)】I.MX6U 中断系统

    目录 一 中断向量表1 中断向量偏移 二 中断系统简介1 创建中断向量表 三 GIC 控制器简介1 中断 ID 四 GIC 逻辑分块1 Distributor 分发器端 2 CPU Interface CPU 接口端 五 CP15 协处理器
  • 【Linux 裸机篇(八)】I.MX6U EPIT 定时器中断、定时器按键消抖

    目录 一 EPIT 定时器简介二 定时器按键消抖 一 EPIT 定时器简介 EPIT 的全称是 xff1a Enhanced Periodic Interrupt Timer xff0c 直译过来就是增强的周期中断定时器 xff0c 它主要
  • PCB拼板和工艺边教程

    PCB拼板 xff0c 主要是为了充分利用板材 xff0c 从而提高生产效率 比较简单的是 xff0c 规则板框的拼板 如上图的 xff0c 板框是正方形 xff0c 很容易就拼了四块板 xff0c 其中 xff0c 只需要有一块板有布线
  • curl命令模拟get请求时遇到特殊字符{}被过滤异常处理

    curl命令模拟get请求时遇到特殊字符 xff0c 接口接受参数不符合预期 crul请求 curl GET http test com opdgApply pageNum 61 1 amp sortDesc 61 true amp sea
  • 函数声明在头文件中的好处,可以利用静态库隐藏算法

    背景 xff1a 现在有个程序员A想实现一个算法 xff0c 这个算法是俩数之和 xff0c 他自己不会于是他去买程序员B的已经做好的算法 xff0c 但是程序员B不想让他看到算法结构应该怎么做 1 首先程序员B需要写程序 xff0c 包括
  • Javaparser使用

    Javaparser使用 什么是Javaparser 分析 转换 生成Java代码 Javaparser库为你提供了一个 Java 代码的抽象语法树 Abstract Syntax Tree AST 结构允许您以一种简单的编程方式使用 Ja
  • YUV和RGB图像格式说明

    对于进行图像处理的程序员来说 xff0c 图像格式是必须了解的问题 本文不涉及压缩图像格式 xff0c 只对YUV和RGB图像进行描述 1 RGB图像和YUV图像区别 RGB和YUV图像的区别在于色彩空间坐标系描述上不同 xff0c 就如同
  • CMake 常用指令

    文章目录 范式环境 amp 工程配置 96 cmake minimum required 96 96 project 96 96 file 96 添加头文件搜索路径 96 link directories 96 96 add compile
  • (JAVA)国际跳棋--棋里乾坤

    导入 因为假期内被朋友带入坑后起了兴趣 xff0c 但发现网上似乎没有什么人写过国际跳棋的相关制作过程 xff0c 于是制作了一个单纯的java的国际跳棋程序 xff0c 虽然没有AI xff0c 但能够实现玩家双方的任务和皮肤 目前只设置