⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wuziqi.java

📁 用java写的一个很简单的五子棋程序
💻 JAVA
字号:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 *<p>Title: 五子棋</p>
 *<p>Description: java版五子棋</p>
 *@author 王岳青
 *@version 1.0
 */

public class wuziqi extends Applet implements ActionListener, MouseListener, MouseMotionListener, ItemListener
{
	/**
	 * 显示作者头像
	 */
	private Image logo;
	/**
	 * 设置棋盘背景图案
	 */
	private ImageIcon logo1;
	/**
	 * 设置棋盘棋子状态 0 无子 1 白子 2 黑子
	 */
	int intGame_Body[][] = new int[17][17];  
	/**
	 * 游戏开始按钮
	 */
	Button b1 = new Button("游戏开始");
	/**
	 * 游戏重置按钮
	 */
	Button b2 = new Button("重置游戏");//
	/**
	 * 游戏提示部分,如果一方获胜则显示相关信息
	 */
	Label WhoWinTheGame = new Label(" ");//
	/**
	 * 复选框,用来选择先手
	 */
	Checkbox ChoiceFirst[] = new Checkbox[2];//
	CheckboxGroup ckgHB = new CheckboxGroup();
	/**
	 * 旗子的颜色标识 0表示白子 1代表黑子
	 */
	int ColorOfQizi = 0;//
	/**
	 * 游戏开始标志 0表示未开始 1指正在进行游戏
	 */
	int intGame_Start = 0;//
	/**
	 * 背景音乐开关复选框
	 */

	Checkbox BackMusic[] = new Checkbox[2];//
	CheckboxGroup BMusic = new CheckboxGroup();

	/**
	 * 背景音乐开关变量,为1时停止,为0时继续播放
	 */

	int IsMusicOn;

	/**
	 * 背景音乐名称
	 */
	AudioClip audio ;
	/**
	 * 初始化过程
	 */
	public void init()//
	{
		setLayout(null);
		setSize(600, 400);
		addMouseListener(this);
		//logo1 = new ImageIcon("Bluehills.gif");
		//logo = getImage(getDocumentBase(), "wyq.gif");

		//audio = getAudioClip(getDocumentBase(),"蓝色多瑙河.wav");

		
		add(b1);
		b1.setBounds(330, 100, 80, 30);
		b1.addActionListener(this);
		add(b2);
		b2.setBounds(330, 140, 80, 30);
		b2.addActionListener(this);
		
		/**
		 * 加入复选框
		 */

		ChoiceFirst[0] = new Checkbox("白子先", ckgHB, true);
		ChoiceFirst[0].setBounds(320, 60, 60, 30);
		ChoiceFirst[1] = new Checkbox("黑子先", ckgHB, false);
		ChoiceFirst[1].setBounds(380, 60, 60, 30);
		add(ChoiceFirst[0]);
		add(ChoiceFirst[1]);
		ChoiceFirst[0].addItemListener(this);
		ChoiceFirst[1].addItemListener(this);

		BackMusic[0] = new Checkbox("背景音乐开", BMusic, true);
		BackMusic[0].setBounds(320, 20, 80, 30);
		BackMusic[1] = new Checkbox("背景音乐关", BMusic, false);
		BackMusic[1].setBounds(400, 20, 80, 30);
		add(BackMusic[0]);
		add(BackMusic[1]);

		BackMusic[0].addItemListener(this);
		BackMusic[1].addItemListener(this);

		add(WhoWinTheGame);
		WhoWinTheGame.setBounds(500, 180, 80, 30);

		GameStart();
	}
	/**
	 * 该方法用于设置先走棋子的颜色以及选择背景音乐开或者关
	 * 是复选框的事件响应
	*/	
	public void itemStateChanged(ItemEvent e)
	{
		if (ChoiceFirst[0].getState())  //选择黑子先还是白子先
		{
			ColorOfQizi = 0;//变量为0则颜色为白色
		}
		if(ChoiceFirst[1].getState())
		{
				ColorOfQizi = 1;
		}
		if (BackMusic[0].getState())
		{
			audio.loop();
			IsMusicOn = 0;
		}
		if(BackMusic[1].getState())
		{
			audio.stop();
			IsMusicOn = 1;
		}
	}
	/**
	 * 是对两个按钮键的监听
	 */
	public void actionPerformed(ActionEvent e)
	{
		Graphics g = getGraphics();
		//如果是游戏开始按钮,则开始游戏
		if (e.getSource() == b1)
		{
			Game_start();
		}
		//重置游戏
		if(e.getSource() == b2)
		{
			Game_re();
		}
		
	}

	public void mousePressed(MouseEvent e) { }

	public void mouseClicked(MouseEvent e)
	{
		Graphics g = getGraphics();
		int x1, y1;
		x1 = e.getX();
		y1 = e.getY();
		//鼠标不在棋盘内点击则直接返回
		if (e.getX() < 20 || e.getX() > 300 || e.getY() < 20 || e.getY() > 300)
		{
			return;
		}

		/**
		 * 下面的一段程序是取整的函数,为了使棋子落在网格上而进行的处理
		 */

		if (x1 % 20 > 10)
		{
			x1 += 20;
		}

		if (y1 % 20 > 10)
		{
			y1 += 20;
		}

		x1 = x1 / 20 * 20;//是一个取整过程,得到网格的位置
		y1 = y1 / 20 * 20;
		set_Qizi(x1, y1);
	}

	public void mouseEntered(MouseEvent e) { }
	public void mouseExited(MouseEvent e) { }
	public void mouseReleased(MouseEvent e) { }
	public void mouseDragged(MouseEvent e) { }
	public void mouseMoved(MouseEvent e) { }

	public void paint(Graphics g)
	{
		draw_qipan(g);
	}
	/**
	 * 落下棋子,之前要判断棋子颜色变量,选择落子的颜色
	 * 落子过程是一个绘制过程,每次落子都是绘制一个圆形并填充相应的颜色
	 * 每次落子后都要判断是否满足赢得比赛的几个方法之一,并且显示哪方获胜
	 */
	public void set_Qizi(int x, int y)  //落子
	{
		if (intGame_Start == 0) //判断游戏未开始
		{
			return;
		}

		if (intGame_Body[x / 20][y / 20] != 0)
		{
			return;
		}
		//首先要绘制棋盘
		Graphics g = getGraphics();
		Image m;
		if (ColorOfQizi == 1)//判断黑子还是白子
		{
			g.setColor(Color.black);
			ColorOfQizi = 0;
		}
		else
		{
			g.setColor(Color.white);
			ColorOfQizi = 1;
		}
		//绘制棋子
		g.fillOval(x - 10, y - 10, 20, 20);
		//棋盘被占了一格
		intGame_Body[x / 20][y / 20] = ColorOfQizi + 1;

		/**
		 * 显示获胜方棋子颜色
		 * Game_win_i是判断输赢的算法
		 */
		if (Game_win_1(x / 20, y / 20)) 
		{

			WhoWinTheGame.setText(Get_qizi_color(ColorOfQizi) + "赢了!");
			intGame_Start = 0;
		}

		if (Game_win_2(x / 20, y / 20))  //判断输赢
		{

			WhoWinTheGame.setText(Get_qizi_color(ColorOfQizi) + "赢了!");
			intGame_Start = 0;
		}

		if (Game_win_3(x / 20, y / 20))  //判断输赢
		{

			WhoWinTheGame.setText(Get_qizi_color(ColorOfQizi) + "赢了!");
			intGame_Start = 0;
		}

		if (Game_win_4(x / 20, y / 20))  //判断输赢
		{
			
			WhoWinTheGame.setText(Get_qizi_color(ColorOfQizi) + "赢了!");
			intGame_Start = 0;
		}
	}
	/**
	 * 得到棋子颜色
	 */
	public String Get_qizi_color(int x)
	{
		if (x == 0)
		{
			return "黑子";
		}
		else
		{
			return "白子";
		}
	}


	/**
	 * 设置组件状态
	 */
	public void Game_btn_enable(boolean e)
	{
		b1.setEnabled(e);
		b2.setEnabled(e);
		ChoiceFirst[0].setEnabled(e);
		ChoiceFirst[1].setEnabled(e);
	}
	/**
	 * 画棋盘 15*15
	 * 其中的参数都是慢慢试出来的
	 */
	public void draw_qipan(Graphics G)  
	{
		G.setColor(Color.yellow);
		G.fill3DRect(10, 10, 300, 300, true);
		G.setColor(Color.black);
		G.drawImage(logo, 330, 210, this);
		logo1.paintIcon(this, G, 10, 10);
		//画出网格用于落子
		for (int i = 1; i < 16; i++)
		{
			G.drawLine(20, 20 * i, 300, 20 * i);
			G.drawLine(20 * i, 20, 20 * i, 300);
		}

	}
	/**
	 * 该方法把开始标志设置为1并设置其他组件
	 */
	public void Game_start() 
	{
		intGame_Start = 1;//开始标志置为1
		if (IsMusicOn == 0)
			audio.play();
		else
			audio.stop();
		Game_btn_enable(false);
		b2.setEnabled(true);
	}

	public void GameStart() //
	{
		intGame_Start = 0;
		Game_btn_enable(true);
		b2.setEnabled(false);
		//audio.play();
		ChoiceFirst[0].setState(true);

		for (int i = 0; i < 16; i++)
		{
			for (int j = 0; j < 16; j++)
			{
				intGame_Body[i][j] = 0;
			}
		}
		

		WhoWinTheGame.setText("");
	}

	public void Game_re() //游戏重新开始
	{
		repaint();
		GameStart();
	}


	//下面一组方法是判断输赢的算法


	/**
	 * 横向判断方法:
	 * 从当前位置开始,分别从左右两侧进行判断,如果有五个棋子颜色相同就返回true;
	 * 
	 */
	public boolean Game_win_1(int x, int y)  //判断输赢 横
	{
		int x1, y1, t = 1;
		x1 = x;
		y1 = y;

		for (int i = 1; i < 5; i++)
		{
			if (x1 > 15)
			{
				break;
			}
			if (intGame_Body[x1 + i][y1] == intGame_Body[x][y])
			{
				t += 1;
			}
			else
			{
				break;
			}

		}

		for (int i = 1; i < 5; i++)
		{
			if (x1 < 1)
			{
				break;
			}
			//
			if (intGame_Body[x1 - i][y1] == intGame_Body[x][y])
			{
				t += 1;
			}
			else
			{
				break;
			}
		}

		if (t > 4)
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	//判断输赢 纵向和上面的方法思想基本一致
	public boolean Game_win_2(int x, int y)
	{
		int x1, y1, t = 1;
		x1 = x;
		y1 = y;

		for (int i = 1; i < 5; i++)
		{
			if (x1 > 15)
			{
				break;
			}
			if (intGame_Body[x1][y1 + i] == intGame_Body[x][y])
			{
				t += 1;
			}
			else
			{
				break;
			}

		}

		for (int i = 1; i < 5; i++)
		{
			if (x1 < 1)
			{
				break;
			}

			if (intGame_Body[x1][y1 - i] == intGame_Body[x][y])
			{
				t += 1;
			}
			else
			{
				break;
			}
		}

		if (t > 4)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
 //左对角线判断输赢 
	public boolean Game_win_3(int x, int y) 
	{
		int x1, y1, t = 1;
		x1 = x;
		y1 = y;

		for (int i = 1; i < 5; i++)
		{
			if (x1 > 15)
			{
				break;
			}
			if (intGame_Body[x1 + i][y1 - i] == intGame_Body[x][y])
			{
				t += 1;
			}
			else
			{
				break;
			}

		}

		for (int i = 1; i < 5; i++)
		{
			if (x1 < 1)
			{
				break;
			}

			if (intGame_Body[x1 - i][y1 + i] == intGame_Body[x][y])
			{
				t += 1;
			}
			else
			{
				break;
			}
		}

		if (t > 4)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
  //右对角线判断输赢 
	public boolean Game_win_4(int x, int y) 
	{
		int x1, y1, t = 1;
		x1 = x;
		y1 = y;

		for (int i = 1; i < 5; i++)
		{
			if (x1 > 15)
			{
				break;
			}
			if (intGame_Body[x1 + i][y1 + i] == intGame_Body[x][y])
			{
				t += 1;
			}
			else
			{
				break;
			}

		}

		for (int i = 1; i < 5; i++)
		{
			if (x1 < 1)
			{
				break;
			}

			if (intGame_Body[x1 - i][y1 - i] == intGame_Body[x][y])
			{
				t += 1;
			}
			else
			{
				break;
			}
		}

		if (t > 4)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
}

/**
 * 下面是把applet嵌入到java代码中,这样就不用新建HTML文件了,运行时只需要appletviewer wuziqi.java
 * 就可以了
 */
/* <applet code="wuziqi.class" width="300" height="50">
 </applet> */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -