Java学习日记:五子棋
介绍
使用Java实现一个简单的带界面的五子棋游戏。
流程:
下棋
通过鼠标点击棋盘落子,按照黑棋先行,而后白棋、黑棋交替的规则进行(不可弃子)。
判断输赢
每次落子后,以该棋子的位置为起点,向上、下、左、右,上斜、下斜等几个方向验证是否已有五个同色棋子连续放置。
循环进行
弹出结束界面,通过点击按钮的方法,重新调用棋盘界面实现游戏的再进行。
实现方法
- swing.JFrame创建棋盘
- awt.Graphics绘制棋子
- awt.event.ActionListener、awt.event.MouseListener监听鼠标动作
具体步骤
棋盘界面
- 初始化一个界面,并加入监听器、传入棋子数组等。
private int chess[][]=new int[11][11];
public void drawFrame(){
this.setTitle("五子棋V1");
this.setSize(600, 600);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(3);
this.setBackground(Color.yellow);//背景
//布局
FlowLayout fl =new FlowLayout();
this.setLayout(fl);
this.setVisible(true);//可视化
Graphics g=this.getGraphics();
//监听器
WzqDrawListener dl=new WzqDrawListener(g,chess);
this.addMouseListener(dl);
}
- 在paint方法内使用画笔在界面上画出 的棋盘。
public void paint(Graphics g) {
for (int i=0;i<101;i+=10) {
g.drawLine(100, 100+4*i, 500, 100+4*i);
g.drawLine(100+4*i, 100, 100+4*i, 500);
}
//遍历棋子数组
for (int ix=0;ix<chess.length;ix+=1) {
for (int iy=0;iy<chess[ix].length;iy+=1) {
int keyX=(int) ix*40+100;
int keyY=(int) iy*40+100;
//获取参数(棋子标记)
if (chess[ix][iy]==1) {
g.setColor(Color.black);
g.fillOval(keyX-20, keyY-20,40,40);
}
else if (chess[ix][iy]==0) {
}
else if (chess[ix][iy]==-1) {
g.setColor(Color.white);
g.fillOval(keyX-20, keyY-20,40,40);
}
}
}
}
棋盘动作监听器
- 构造器传入棋子数组
public WzqDrawListener(Graphics g, int[][] chess){
this.g=g;
this.chess=chess;
}
- 落子
关键点:创建一个大小为格子数的数组,将黑子标识为1,白子标识为-1,空白为0。每次放置前检验该位置的值,放置后检验附近格子的值。
public void mouseReleased(MouseEvent e) {
int x=e.getX();///获得点击点坐标
int y=e.getY();
laychess(x,y);
}
public void laychess(int x,int y) {
//计数点
if(x<100|x>500|y<100|y>500) {
//超出棋盘范围
return ;
}
else{
//判断点在小方格的位置
float a=((x-100)%40);
float b=((y-100)%40);
a=a/40; //得到一个介于(0,1)的小数
b=b/40;
//对ix计算
if(a>=0.5) {
//大于0.5,则属于下一交叉点 因此ix+1
ix=(int) Math.floor((x-100)/40)+1;
}
else if(a<0.5) {
ix=(int) Math.floor((x-100)/40);
}
//计算iy,待补充
}
//落棋点坐标
int keyX=(int) ix*40+100;
int keyY=(int) iy*40+100;
if(chess[ix][iy]==0&&x<=520&&x>=80&&y<=520&&y>=80) {
//根据计数器,判断落下棋子颜色(奇数:黑,偶数:白)
countn++;
if (countn%2==1) {
g.setColor(Color.black);
chess[ix][iy]=1;
}
else if (countn%2==0) {
g.setColor(Color.white);
chess[ix][iy]=-1;
}
g.fillOval(keyX-20, keyY-20,40,40);
}
checkRow(ix,iy);//落下棋子以后检验是否胜利
}
- 检验
public void checkRow(int ix,int iy) {
int count1=0,count2=0,count3=0,count4=0;
//向不同方向检验
//如果相同,计数器+1
//不相同则终止
for(int i=ix+1;i<chess.length-1;i++) {//向右
if (chess[i][iy]==chess[ix][iy]) {
count1++;
}
else {
break;
}
}
for(int i=ix;i>0;i--) {//向左
if (chess[i][iy]==chess[ix][iy]) {
count1++;
}
else {
break;
}
}
for(int i=iy+1;i<chess.length-1;i++) {//向下
if (chess[ix][iy]==chess[ix][i]) {
count2++;
}
else {
break;
}
}
for(int i=iy;i>0;i--) {//向上
if (chess[ix][iy]==chess[ix][i]) {
count2++;
}
else {
break;
}
}
//待补充
if(count1==5|count2==5|count3==5|count4==5) {//如果四个方向中的任一方向满足五个点相连
if(countn%2==1) {
//向结束页面传信息
SuccessPage.main("共下"+Math.floor(countn/2)+"轮,"+"黑棋");
}
else if(countn%2==0) {
SuccessPage.main("共下"+Math.floor(countn/2)+"轮,"+"白棋");
}
}
结束界面
结束界面上需要加入标签以及按钮,标签用于显示信息,按钮用于实现程序重新运行。
JLabel jl=new JLabel(string+"胜利!");//结束后的页面上的信息,string为传入的信息
JButton btn=new JButton("重新开始");
jf.add(jl);
jf.add(btn);
结束界面监听器
这里需要监听按钮信息,并调用棋盘界面实现程序再次运行,重新开始游戏。
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String btnstr = e.getActionCommand();
if(btnstr.equals("重新开始")) {
Wzq.main(null);
jf.dispose();//销毁结束页面
}
代码并不完善,此处只是给出思路,以及一些具体方法的简单实现。
欢迎你与我交流!
完整代码
转载:https://blog.csdn.net/IDNIHAI/article/details/106891260
查看评论