Java学习日记:五子棋

Java学习日记:五子棋

介绍

使用Java实现一个简单的带界面的五子棋游戏。
在这里插入图片描述
流程:

Created with Raphaël 2.2.0 开始 下棋 重新开始? 结束 yes no

下棋

通过鼠标点击棋盘落子,按照黑棋先行,而后白棋、黑棋交替的规则进行(不可弃子)。
    ~~~    

判断输赢

每次落子后,以该棋子的位置为起点,向上、下、左、右,上斜、下斜等几个方向验证是否已有五个同色棋子连续放置。
在这里插入图片描述
    ~~~    

循环进行

弹出结束界面,通过点击按钮的方法,重新调用棋盘界面实现游戏的再进行。
    ~~~    

实现方法

  1. swing.JFrame创建棋盘
  2. awt.Graphics绘制棋子
  3. awt.event.ActionListener、awt.event.MouseListener监听鼠标动作

具体步骤

棋盘界面

  1. 初始化一个界面,并加入监听器、传入棋子数组等。
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);		
	}
  1. 在paint方法内使用画笔在界面上画出 11 × 11 11 \times 11 11×11的棋盘。
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);
			}
	
			}
		}
	
	}

棋盘动作监听器

  1. 构造器传入棋子数组
public WzqDrawListener(Graphics g, int[][] chess){
	 this.g=g;
	 this.chess=chess; 
 }
  1. 落子
    关键点:创建一个大小为格子数的数组,将黑子标识为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);//落下棋子以后检验是否胜利
}
  1. 检验
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();//销毁结束页面		
	}	

代码并不完善,此处只是给出思路,以及一些具体方法的简单实现。
欢迎你与我交流!
完整代码

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值