📄 wuziqi.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 + -