Swing编程基础——五子棋游戏

最近闲来无事,继续完成之前一直想做的五子棋游戏,有不懂的通过看视频基本完成,大致记录一下,如有问题,请多多指教。


知识点:

Swing的概述: 

    Swing是在java的基础图形化用户界面AWT的基础上扩展的API集;

  1. Swing编程
  2. ImageIO的使用 
  3. 图片的绘制

    Swing的功能:通过java代码编写窗口程序,创建图形化用户界面(GUI);

    Swing可以创建窗体、面版,在窗口中导入或绘制图片,或输入文本信息,结合java的JDBC和/或IO操作可以实现数据的保存。

JFrame是创建窗体的swing类,用来创建一个图形界面的原始窗口,并设置其大小、位置等属性,是swing编程的基础类之一。

JOptionPane

MouseListener

Graphics//类似画笔

游戏功能: 

  1. 在点击鼠标时,可以在相应的位置显示棋子;
  2. 可以自动判断游戏是否结束,是否黑方或白方已经胜利。

首先,完成游戏界面设置 ,这里通过PS制作了一个背景,然后在其上画线构成棋盘(19*19),并做了标注点。

        g.drawImage(imge,0,30, this);
		g.setFont(new Font("黑体",Font.BOLD,20));
		g.drawString("游戏信息:"+message, 130, 65);//绘制字符串
		g.setFont(new Font("宋体",0,18));
		g.drawString("黑方时间:无限制", 40, 500);
		g.drawString("白方时间:无限制", 275, 500);
		
		//绘制一条线(棋盘)
		for(int i=0;i<19;i++) {
			g.drawLine(24, 88+20*i, 384, 88+20*i);
			g.drawLine(24+20*i, 88, 24+20*i, 448);
		}
		//标注点位(实心圆)
		g.fillOval(82, 146, 4, 4);
		g.fillOval(202, 146, 4, 4);
		g.fillOval(322, 146, 4, 4);
		g.fillOval(82, 266, 4, 4);
		g.fillOval(202, 266, 4, 4);
		g.fillOval(322, 266, 4, 4);
		g.fillOval(82, 386, 4, 4);
		g.fillOval(202, 386, 4, 4);
		g.fillOval(322, 386, 4, 4);

其次,绘制棋子,需注意棋盘的大小,并且只能在交叉点处落子。

      for(int i=0;i<19;i++) {
			for(int j=0;j<19;j++) {
				if(allchess[i][j]==1) {
					//黑子
					int tempx=i*20+24;
					int tempy=j*20+88;
					g.fillOval(tempx-7, tempy-7, 14, 14);
					
				}
				if(allchess[i][j]==2) {
					//白子
					int tempx=i*20+24;
					int tempy=j*20+88;
					g.setColor(Color.white);
					g.fillOval(tempx-7, tempy-7, 14, 14);
					g.setColor(Color.black);
					g.drawOval(tempx-7, tempy-7, 14, 14);
				}
			}
			
		}	

然后,保存棋局,这里用的是一个二维数组,0表示没有棋子,1表示黑子,2表示白子;并且注意黑白子轮流落子以及原有位置的棋子不能覆盖。

          	  x=e.getX();
			y=e.getY();
			if(x>=24&&x<=384&&y>=88&&y<=448) {
				x=(x-24)/20;
				y=(y-88)/20;
				if(allchess[x][y]==0) {//不能在原有位置下子
					//判断当前需下什么颜色的棋子
					if(isblack==true) {
						allchess[x][y]=1;
						isblack=false;
						message="轮到白方";
					}
					else {
						allchess[x][y]=2;
						isblack=true;
						message="轮到黑方";
					}
					
				}else {
					JOptionPane.showMessageDialog(this, "当前位置有棋子,请重新落子!");
				}
				
				
				this.repaint();
			}
		
		

最后,判断胜负(以横向为例)

  即横向五个黑子或五个白子为胜(x变y不变)

  总共分为四种情况:横向相等,竖向相等,左斜相等,右斜相等,而每种情况需要分为两个部分检查。

  private boolean checkwin(){
      
        boolean flag=false;
		
        //横向
        int count=1;//保存共有多少相同颜色棋子相连
		
		int value=allchess[x][y];
		int i=1;
		while(value==allchess[x+i][y]) {
			count++;
			i++;
		}
		i=1;
		while(value==allchess[x-i][y]) {
			count++;
			i++;
		}

        if(count>=5) {
			flag=true;
		}
		
		
		return flag;

}

只实现简单功能,也可以再加附加功能,如可以对游戏时间进行设置,判断是否超出规定时间等。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值