如何用java写出一个可更换皮肤的五子棋?

画棋盘

要下棋首先要有一个方格棋盘,一个普通的棋盘是由横线和竖线组成的,我们控制好间距就行,这里有很多常量,我们可以定义它,后期想修改的话就简单了。我这里定义了行row、列colulmn、行间距size,x、y 为窗口上的坐标

for (int i = 0; i < row; i++){						
			g.drawLine(x, y + size * i, x + size * (column - 1), y + size * i);//横线
			g.drawLine(x + size * i, y, x + size * i, y + size * (row - 1));//竖线
			}

画棋子

在有棋盘的基础上,我们就可以在上面添加棋子了,我们关键将画好的棋子放在两条线的交叉处。关键的地方我们画好的棋子存入一个数字,方便后面判断输赢。我这里定义画出的黑棋为1,白棋为2


				
				Chess chess= new  Chess(vy,vx);//调用chess方法
				chessarr[chessCount]=chess;//将累加的下标存入棋子数组
				chessCount++;
				
				if(index==1&&x<=575&&y<=625){	//防止棋子落到棋盘之外
				Image ima = new ImageIcon("C:\\Users\\Lenovo\\Desktop\\com\\pic\\heiqi.png").getImage();
    			g.drawImage(ima,vx*size+25,vy*size+75, 50, 50,null);
    								
			arr[vy][vx] = 1; 	//将画好的棋子定好数字
			index++;
			if(isWin(vy, vx)){//如果isWin方法为真,就输出下面的对话框
				JOptionPane.showMessageDialog(null, "黑方赢了!!!");
			}
		
			}		    			
			else if(index==2&&x<=575&&y<=625){
									
				Image ima = new ImageIcon("C:\\Users\\Lenovo\\Desktop\\com\\pic\\baiqi.png").getImage();
    			g.drawImage(ima,vx*size+25,vy*size+75, 50, 50,null);
				arr[vy][vx] = 2;
				index--;
				
				if(isWin(vy, vx)){
					JOptionPane.showMessageDialog(null, "白方赢了!!!");
				}	
			}
			

判输赢

五子棋的游戏规则,在横竖、斜对角有连起来相同颜色的五个旗子,该颜色方就获胜.在画棋子的时候我们已经定义了一个二维数组,将画好的棋子按颜色存起来了,下面只需要遍历数组就行。我分为横向的向左向右判断,竖向的向上向下判断,两个斜向的方向也两边判断,只要相同颜色的棋子达到五个就弹出获胜方。

public boolean chessL_R(int r, int c) {//r,c是随机点击的棋子的列,行
		int count=0;
		//确定好一个点,看横向的相同数字个数,i是行,j是列
		//以最后下的棋子为中心,往右遍历
		for(int j=c;j<arr.length;j++){
			System.out.println(arr[r][c]);
			if(arr[r][c]==arr[r][j]){				
				count++;
			}		
	}
 	//以最后下的棋子为中心,往左遍历
		for(int j=c-1;j>=0;j--){
			System.out.println(arr[r][c]);
			if(arr[r][c]==arr[r][j]){
				
				count++;
				
			}			
	}
		System.out.println("count1= "+count);
		return count >= 5 ? true : false;			
	}
	
	
		
		//判断纵向
		//先往上遍历,再往下
		
		public boolean chessU_D(int r,int c){
			int count=0;
			for(int i=r;i>=0;i--){
				if(arr[r][c]==arr[i][c]){
					count++;
				}
			}
			for(int i=r+1;i<arr.length;i++){
				if(c+i<600&&arr[r][c]==arr[i][c]){
					count++;
				}
			}
			System.out.println("count2= "+count);
		
			return count >= 5 ? true : false;
		}
		
		//斜向右下
		public boolean chessR_R(int r, int c) {
			int count=0;
			//以最后一个球为中心,左上角
			for(int i=r,j=c;i>=0&&j>=0;i--,j--){
				if(arr[r][c]==arr[i][j]){
					count++;
				}
			}
			//以最后一个球为中心,右上角
			for(int i=r+1,j=c+1;i<arr.length&&j<arr.length;i++,j++){
				if(i+c<600&&j+r<700&&arr[r][c]==arr[i][j]){
					count++;
				}
			}
			System.out.println("count3= "+count);
	
			return count >= 5 ? true : false;
		}
		
		//判断斜左下
		public boolean chessL_L(int r, int c) {
			int count=0;
			//以最后一个球为中心,右上角
			for(int i=r,j=c;i<arr.length&&j>=0;i++,j--){
				if(i+c<600&&arr[r][c]==arr[i][j]){
					count++;
				}
			}
			//以最后一个球为中心,左上角
			for(int i=r-1,j=c+1;i>=0&&j<arr.length;i--,j++){
				if(j+r<550&&arr[r][c]==arr[i][j]){
					count++;
				}
			}
			System.out.println("count4= "+count);
			return count >= 5 ? true : false;
			
		}
	
		

输赢的方法

public boolean isWin(int r, int c) {		
				if(chessL_R(vy, vx) ||chessU_D(vy, vx) ||chessL_L(vy, vx)||chessR_R(vy, vx)){
					return true;
				}else {
					return false;
				}
		}

悔棋的功能

我们需要将下好的棋子个数计下来,每点一下悔棋按钮就消失一个棋子

public class Chess {

	int x,y;
	int size=50;

	public Chess(int x,int y){
		this.x=x;
		this.y=y;
	}	
}
public void regret(){
		if(chessCount>0){
			chessCount--;
			Chess chess = chessarr[chessCount];
			System.out.println("x="+chess.x);
			System.out.println("y="+chess.y);
			arr[chess.x][chess.y]=0;	
		}			
		}

再来一局

再来一局,只需要将棋盘上画好的棋子清空就行,将之前黑白棋存下的数字全部清零即可

public void tryAgain(){		
			for(int i=0;i<arr.length;i++){
				for(int j=0;j<arr.length;j++){			
				arr[j][i] =0;				
				}
			}
		}

更换皮肤

我们只需要在菜单条上添加菜单,然后在菜单上添加菜单项,菜单项上就是我们所需要更换皮肤的名字

 JMenuBar jmb=new JMenuBar();//菜单条
		JMenu skimMenu=new JMenu("skim");//菜单
        jmb.add(skimMenu);
		skimMenu.addActionListener(bl);
        setJMenuBar(jmb);
		String[] picStr = {"大自然","小动物","动漫","护眼"};
		for (int i = 0; i <picStr.length; i++) {
			
			JMenuItem picItem=new JMenuItem(picStr[i]);
			skimMenu.add(picItem);
			picItem.addActionListener(bl);
		}

之后在监听器界面

if(picStr.equals("动漫")){
				image = new ImageIcon("C:\\Users\\Lenovo\\Desktop\\com\\pic\\java1.jpg").getImage();
				
				
			}else if(picStr.equals("小动物")){
				image =new ImageIcon("C:\\Users\\Lenovo\\Desktop\\com\\pic\\java2.jpg").getImage();

			}else if(picStr.equals("大自然")){
				image =new ImageIcon("C:\\Users\\Lenovo\\Desktop\\com\\pic\\java3.jpg").getImage();

			}else if(picStr.equals("护眼")){
				image = new ImageIcon("C:\\Users\\Lenovo\\Desktop\\com\\pic\\java4.jpg").getImage();
			}

记得整完上面的要重绘哦,要不然滑动窗口棋盘就消失啦啦啦!
送一句话给大家:
“好的艺术家只是照抄,而伟大的艺术家窃取灵感,在窃取伟大的灵感这方面,我们一直都是厚颜无耻的”

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值