五子棋

纠结了一天,总算有点样子了,本来想实现人机对弈的,但是手了才知道自己的技术还没达到那个层次,只有保留与人对战的模板。

先上代码

package com.a;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class BufferedI {
	private final int bWidth=535;
	private final int bHeight=536;
	BufferedImage bi;
	BufferedImage sel;
	BufferedImage black;
	BufferedImage white;
    int X_COUNT=-1;
    int Y_COUNT=-1;
    int turn=1;
    boolean isWin=false;
    int[][] board=new int[15][15];
	Frame f=new Frame();
	MyCanvas drawArea=new MyCanvas();
	
	public void init() throws IOException{
		for(int i=0;i<15;i++){
			for(int j=0;j<15;j++){
				board[i][j]=0;
				
			}
		}
		bi=ImageIO.read(new File("image/board.jpg"));
		sel=ImageIO.read(new File("image/selected.gif"));
		black=ImageIO.read(new File("image/black.gif"));
		white=ImageIO.read(new File("image/white.gif"));
		drawArea.setPreferredSize(new Dimension(bWidth,bHeight));
		f.add(drawArea);
		drawArea.addMouseMotionListener(new MouseMotionAdapter(){
			public void mouseMoved(MouseEvent e){
				X_COUNT=(e.getX()-6)/35;
				Y_COUNT=(e.getY()-6)/35;
				drawArea.repaint();
				
			}
		});
		drawArea.addMouseListener(new MouseAdapter(){

			@Override
			public void mouseClicked(MouseEvent e) {
				// TODO Auto-generated method stub
				//X_COUNT=(e.getX()-10)/35;
				//Y_COUNT=(e.getY()-10)/35;
				if(turn==1&&board[X_COUNT][Y_COUNT]==0){
					turn=0;
					board[X_COUNT][Y_COUNT]=1;
					isWin=ifWin1(board,X_COUNT,Y_COUNT);
					
				}
				else if(turn==0&&board[X_COUNT][Y_COUNT]==0){
					turn=1;
					board[X_COUNT][Y_COUNT]=2;
					isWin=ifWin2(board,X_COUNT,Y_COUNT);
				}
				drawArea.repaint();
				//System.out.println(X_COUNT+","+Y_COUNT);
			}

		
			
		});
		f.setSize(bWidth, bHeight+30);
		f.setVisible(true);
		f.setBackground(new Color(0,222,222));
		  f.addWindowListener(new WindowAdapter()  //为了关闭窗口
		  {
		   public void windowClosing(WindowEvent e)
		   {
		       System.exit(0);
		   }
		  });
	}
	/**
	 * 判断白方是否获胜的方法
	 * @param b 棋盘数组
	 * @param x 横坐标
	 * @param y纵坐标
	 
	 * @return
	 */
	public boolean ifWin1(int[][] b,int x,int y){
		//判断竖直方向
			int f1=0;
			for(int i=1;y-i>=0;i++)
			{
				if(b[x][y-i]==0&&b[x][y-i]==2) break;
			if(b[x][y-i]==1) f1++;
			//System.out.println(f1);
			}
			for(int j=1;y+j<15;j++)
			{
				if(b[x][y+j]==0&&b[x][y+j]==2) break;
			if(b[x][y+j]==1) f1++;
			//System.out.println(f1);
			}
			if(f1>=4) return true;
			//判断水平方向
			f1=0;
			for(int i=1;x-i>=0;i++)
			{
				if(b[x-i][y]==0&&b[x-i][y]==2) break;
			if(b[x-i][y]==1) f1++;
			
			}
			for(int j=1;x+j<15;j++)
			{
				if(b[x+j][y]==0&&b[x+j][y]==2) break;
			if(b[x+j][y]==1) f1++;
			
			}
			if(f1>=4) return true;
			//判断丿方向 
			f1=0;
			for(int i=1;x-i>=0&&y-i>=0;i++)
			{
				if(b[x-i][y-i]==0&&b[x-i][y-i]==2) break;
			if(b[x-i][y-i]==1) f1++;
			
			}
			for(int j=1;x+j<15&&y+j<15;j++)
			{
				if(b[x+j][y+j]==0&&b[x+j][y+j]==2) break;
			if(b[x+j][y+j]==1) f1++;
			
			}
			if(f1>=4) return true;
			//判断捺方向
			f1=0;
			for(int i=1;x-i>=0&&y+i<15;i++)
			{
				if(b[x-i][y+i]==0&&b[x-i][y+i]==2) break;
			if(b[x-i][y+i]==1) f1++;
			
			}
			for(int j=1;x+j<15&&y-j>=0;j++)
			{
				if(b[x+j][y-j]==0&&b[x+j][y-j]==2) break;
			if(b[x+j][y-j]==1) f1++;
			
			}
			if(f1>=4) return true;
			else return false;
	}
	
	public boolean ifWin2(int[][] b,int x,int y){
		
		int f1=0;
		for(int i=1;y-i>=0;i++)
		{
			if(b[x][y-i]==0&&b[x][y-i]==1) break;
		if(b[x][y-i]==2) f1++;
		//System.out.println(f1);
		}
		for(int j=1;y+j<15;j++)
		{
			if(b[x][y+j]==0&&b[x][y+j]==1) break;
		if(b[x][y+j]==2) f1++;
		//System.out.println(f1);
		}
		if(f1>=4) return true;
		
		f1=0;
		for(int i=1;x-i>=0;i++)
		{
			if(b[x-i][y]==0&&b[x-i][y]==1) break;
		if(b[x-i][y]==2) f1++;
		//System.out.println(f1);
		}
		for(int j=1;x+j<15;j++)
		{
			if(b[x+j][y]==0&&b[x+j][y]==1) break;
		if(b[x+j][y]==2) f1++;
		//System.out.println(f1);
		}
		if(f1>=4) return true;
		
		//判断丿方向 
		f1=0;
		for(int i=1;x-i>=0&&y-i>=0;i++)
		{
			if(b[x-i][y-i]==0&&b[x-i][y-i]==1) break;
		if(b[x-i][y-i]==2) f1++;
		
		}
		for(int j=1;x+j<15&&y+j<15;j++)
		{
			if(b[x+j][y+j]==0&&b[x+j][y+j]==1) break;
		if(b[x+j][y+j]==2) f1++;
		
		}
		if(f1>=4) return true;
		//判断捺方向
		f1=0;
		for(int i=1;x-i>=0&&y+i<15;i++)
		{
			if(b[x-i][y+i]==0&&b[x-i][y+i]==1) break;
		if(b[x-i][y+i]==2) f1++;
		
		}
		for(int j=1;x+j<15&&y-j>=0;j++)
		{
			if(b[x+j][y-j]==0&&b[x+j][y-j]==1) break;
		if(b[x+j][y-j]==2) f1++;
		
		}
		if(f1>=4) return true;
		else return false;
		
  }
	
	
	public static void main(String[] ages) throws IOException{
		new BufferedI().init();
		
	}
	class MyCanvas extends JPanel{
		public void paint(Graphics g){
			
			g.drawImage(bi, 0, 0,null);
		    if(X_COUNT>=0&&Y_COUNT>=0) {g.drawImage(sel, X_COUNT*35+6, Y_COUNT*35+6, null);}
		    for(int i=0;i<15;i++){
		    	for(int j=0;j<15;j++){
		    		if(board[i][j]==1) g.drawImage(white, i*35+6, j*35+6, null);
		    		else if(board[i][j]==2) g.drawImage(black, i*35+6, j*35+6, null);
		    	}
		    }
		    if(isWin==true) {
				g.setFont(new Font("Times",Font.BOLD,60));
				g.setColor(new Color(255,0,0));
			if(turn==0)	g.drawString("白方胜", 250, 250);
			if(turn==1)	g.drawString("黑方胜", 200, 250);
			}
	
		
			
		}
			
		
	}
	

}

因为是在一个类中实现,感觉代码有点乱。然后,感觉用UI写东西真比控制台下实现好多了,都不用去考虑线程了。然后在判断胜负的时候有点小感觉,虽然代码可能还不是很完善,但是发现,在代码的长度与执行时间之间,貌似应该选择执行时间短的,哪怕代码长一点也无所谓。就像判断胜负那里,如果只用一个函数来实现,代码是简单了,但是判断的工作量就多了一层。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值