纠结了一天,总算有点样子了,本来想实现人机对弈的,但是手了才知道自己的技术还没达到那个层次,只有保留与人对战的模板。
先上代码
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写东西真比控制台下实现好多了,都不用去考虑线程了。然后在判断胜负的时候有点小感觉,虽然代码可能还不是很完善,但是发现,在代码的长度与执行时间之间,貌似应该选择执行时间短的,哪怕代码长一点也无所谓。就像判断胜负那里,如果只用一个函数来实现,代码是简单了,但是判断的工作量就多了一层。