大家好,我是java新手,今天写五子棋游戏,遇上点小麻烦,希望大家给解决一下!
我用Arraylist装棋子,然后,不知道怎么判定坐标处已有棋子!代码如下:
package com.chess.game;import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;public class MyJFrame extends JFrame
{
boolean isback =true;//判断棋子颜色
MyJFrame mf ;
/**
 * 声明窗体的宽
 */
private static final int WIDTH = 500;
/**
 * 声明窗体的长
 */
    private static final int HEIGHT = 500;
    public MyJFrame()
{
//设置窗体标题
this.setTitle("五子棋对弈");
this.setSize(WIDTH,HEIGHT);
int wideth = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
this.setLocation((wideth-WIDTH)/2,(height-HEIGHT)/2 );
setDefaultCloseOperation(this.EXIT_ON_CLOSE);
addMouseListener(new MyMouseMonitor());
this.setVisible(true);
new Thread(new MyRunnable()).start();
/**
 * 通过标签加入背景图片
 */
ImageIcon backIcon = new ImageIcon("D:/yzy1/Image/fiveChess.jpg");
JLabel label = new JLabel(backIcon);
label.setOpaque(true);
label.setBounds(0, 0, backIcon.getIconWidth(),backIcon.getIconHeight() );
this.add(label);

}

List <Chessman> chessmanList =new ArrayList <Chessman>();  //装棋子


/**
 * 重写paint方法,画出棋盘方格
 */
@Override
public void paint(Graphics g)
{
super.paint(g);
Color c = g.getColor();
g.setColor(Color.BLACK);
for(int i = 0;i <= 360;i = i+20)
{
g.drawLine(10, 70 + i,370,70 + i );
g.drawLine(10 + i, 70, 10+i, 430);
}
Font f = g.getFont();
g.setColor(Color.red);
g.setFont(new Font("宋体",0,18));
g.drawString("五子棋对弈:", 60, 60);
g.setColor(Color.BLACK);
g.drawString("黑方时间:",40, 470);
g.drawString("白方时间:", 260,470 );
g.setFont(f);
g.setColor(c);


/**
 * 在棋盘中画棋子
 */
for(int i =0;i < chessmanList.size();i++ )
{
Chessman chessman = chessmanList.get(i);
chessman.paint(g);
} }



/**
 * 鼠标监听事件
 * @author Administrator
 *
 */
class MyMouseMonitor extends MouseAdapter
{
@Override
public void mousePressed(MouseEvent e)
{
int x = e.getX();
int y = e.getY();
//System.out.println(x);
//System.out.println(y);
Chessman chessman;
if(isback)
{
chessman = new Chessman(x, y, mf, isback);
                chessmanList.add(chessman);
isback = false;
}
else
{
   chessman = new Chessman(x, y, mf, isback);
   chessmanList.add(chessman);
   isback = true;
}
}
}


class MyRunnable implements Runnable
{
 @Override
 public void run()
 {
while(true)
{
repaint();
try
{
Thread.sleep(50);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}}


}package com.chess.game;import java.awt.Color;
/**
 * 棋子类
 * @author Administrator
 *
 */
public class Chessman
{
MyJFrame mf;
int x,y;
boolean isback; /**
 * 确定棋子的大小
 */
private static final int CHESSMAN_WIDTH = 15;
private static final int CHESSMAN_HEIGHT = 15;

/**
 * 构造方法
 * @param x 鼠标点击时x点的坐标位置
 * @param y 鼠标点击时y点的坐标位置
 * @param mf
 * @return 
 */

public Chessman(int x,int y,MyJFrame mf,boolean isback)
{
this.isback = isback;
this.x = x;
this.y =y;
this.mf = mf;
}

/**
 * 画黑棋子
 * @param g
 */
//int a =(x+10)/20 * 20 -10 - CHESSMAN_WIDTH / 2;
//int b = (y+10)/20*20 -10 -CHESSMAN_HEIGHT/2;

public void paint(Graphics g)
{
if(x >= 10 && x <= 370 && y > 70 && y <= 430 )
{
 Color c = g.getColor();
 if(!isback)
 {
  g.setColor(Color.black);
  g.drawOval((x+10)/20 * 20 -10 - CHESSMAN_WIDTH / 2, (y+10)/20*20 -10 -CHESSMAN_HEIGHT/2, CHESSMAN_WIDTH, CHESSMAN_HEIGHT);
  g.setColor(Color.white);
  g.fillOval((x+10)/20 * 20 -10 - CHESSMAN_WIDTH / 2, (y+10)/20*20 -10 -CHESSMAN_HEIGHT/2, CHESSMAN_WIDTH, CHESSMAN_HEIGHT);
 }
 else
 {
 g.setColor(Color.black);
  g.fillOval((x+10)/20 * 20 -10 - CHESSMAN_WIDTH / 2, (y+10)/20*20 -10 -CHESSMAN_HEIGHT/2, CHESSMAN_WIDTH, CHESSMAN_HEIGHT);

 }
  g.setColor(c);
}
} }

解决方案 »

  1.   

    代码有点乱,下次插入代码是用插入代码的插件看起方便。
    我没有看你代码,而且我这电脑不能运行程序。所以我说说思路吧。
    你定义一个棋子类,具有横纵坐标属性,然后定义个list来存储整个棋盘,也即存储该棋子的坐标,所以你判断是否有棋子了,只要判断该坐标是否已经在该list里面就可以了。
      

  2.   

    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Toolkit;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.ArrayList;
    import java.util.List;import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;public class MyJFrame extends JFrame
    {
    boolean isback =true;//判断棋子颜色
    MyJFrame mf ;
    /**
    * 声明窗体的宽
    */
    private static final int WIDTH = 500;
    /**
    * 声明窗体的长
    */
      private static final int HEIGHT = 500;
        public MyJFrame()
    {
    //设置窗体标题
    this.setTitle("五子棋对弈");
    this.setSize(WIDTH,HEIGHT);
    int wideth = Toolkit.getDefaultToolkit().getScreenSize().width;
    int height = Toolkit.getDefaultToolkit().getScreenSize().height;
    this.setLocation((wideth-WIDTH)/2,(height-HEIGHT)/2 );
    setDefaultCloseOperation(this.EXIT_ON_CLOSE);
    addMouseListener(new MyMouseMonitor());
    this.setVisible(true);
    new Thread(new MyRunnable()).start();
    /**
    * 通过标签加入背景图片
    */
    ImageIcon backIcon = new ImageIcon("D:/yzy1/Image/fiveChess.jpg");
    JLabel label = new JLabel(backIcon);
    label.setOpaque(true);
    label.setBounds(0, 0, backIcon.getIconWidth(),backIcon.getIconHeight() );
    this.add(label);}List <Chessman> chessmanList =new ArrayList <Chessman>(); //装棋子
    /**
    * 重写paint方法,画出棋盘方格
    */
    @Override
    public void paint(Graphics g)
    {
    super.paint(g);
    Color c = g.getColor();
    g.setColor(Color.BLACK);
    for(int i = 0;i <= 360;i = i+20)
    {
    g.drawLine(10, 70 + i,370,70 + i );
    g.drawLine(10 + i, 70, 10+i, 430);
    }
    Font f = g.getFont();
    g.setColor(Color.red);
    g.setFont(new Font("宋体",0,18));
    g.drawString("五子棋对弈:", 60, 60);
    g.setColor(Color.BLACK);
    g.drawString("黑方时间:",40, 470);
    g.drawString("白方时间:", 260,470 );
    g.setFont(f);
    g.setColor(c);
    /**
    * 在棋盘中画棋子
    */
    for(int i =0;i < chessmanList.size();i++ )
    {
    Chessman chessman = chessmanList.get(i);
    chessman.paint(g);
    }}/**
    * 鼠标监听事件
    * @author Administrator
    *
    */
    class MyMouseMonitor extends MouseAdapter
    {
    @Override
    public void mousePressed(MouseEvent e)
    {
    int x = e.getX();
    int y = e.getY();
    //System.out.println(x);
    //System.out.println(y);
    Chessman chessman;
    if(isback)
    {
    chessman = new Chessman(x, y, mf, isback);
      chessmanList.add(chessman);
    isback = false;
    }
    else
    {
    chessman = new Chessman(x, y, mf, isback);
    chessmanList.add(chessman);
    isback = true;
    }
    }
    }
    class MyRunnable implements Runnable
    {
    @Override
    public void run()
    {
    while(true)
    {
    repaint();
    try
    {
    Thread.sleep(50);
    } catch (InterruptedException e)
    {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }}}
    }
      

  3.   

    怎么样把坐标存储到list里面,然后怎么判定该该坐标是否已经在该list里面?可以简单的做个事例说明吗?谢谢
      

  4.   

    你可以list.get[i].get[X] == this.X ,这不是真正的代码,意思是你循环list取出容器中的对象,判断是否有对象的属性等于你需要的坐标。或者你可以直接用Map来存。Map的键存X值,map的值存Y坐标,这样你就可以通过,map.get[this.X]判断是否有该横坐标,同时map.get[X] == this.Y判断这个横坐标下的Y坐标是否也相等,这是我的大概思路。
      

  5.   

    map.get[X] == this.Y 这里我漏写了,应为:map.get[this.X] == this.Y 意思是在判断map中是否存在你需要的this.X,然后对应该键位的map值是否等于this.Y。
      

  6.   

    http://blog.csdn.net/niuniu20008/article/details/6765765
    我做的二维数组的五子棋。最主要的看里面的算法吧,判断同色棋有没有连接够5个,需要从北到南、从西往东、从东北到西南、从东南到西北【线】上判断。
      

  7.   

    class QiZi {
        boolean hasQiZi;
        string memo;
        //其他信息等
    }QiZi[][] qiPan = new QiZi[width][heigth];我觉得这么记录棋盘比较好...