今天写了一个五子棋程序。代码和大家共享下 哈哈。。。。
package cn.edu.fjnu.www;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class ChessPan extends JPanel {
private static final long serialVersionUID = -7107050002836726552L;
final int margin=30;//边距
final int span=35;//间距
boolean gameOver=false;
boolean Exist=false;//用来表示在PointClass数组中有没有当前的对象
PointClass []pointList=new PointClass[11*11];
int status[][]=new int[11][11];
int pointCount=0;//当前棋子的个数
boolean isBlack = true;//默然开始是黑棋先下
int xIndex;int yIndex;//当前棋子在网格中的索引
private int colums;//棋盘列数
private int rows;//棋盘行数
public ChessPan(int c,int r){
this.colums =c;
this.rows=r;
for(int i=0;i<11;i++)
for(int j=0;j<11;j++)
status[i][j]=0;
addMouseMotionListener(new MouseMotionListener() { // 匿名内部类
public void mouseDragged(MouseEvent e) {
}
public void mouseMoved(MouseEvent e) {
int x1 = (e.getX() - margin +span / 2) / span;
// 将鼠标点击的坐标位置转换成网格索引。
int y1 = (e.getY() -margin + (span) / 2) / span;
// 游戏已经结束,不能下
// 落在棋盘外,不能下
// x,y位置已经有棋子存在,不能下
if (x1 <=0 || x1 >=rows || y1 <= 0 || y1 >= colums || gameOver
|| findChess(x1,y1))
setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); // 设置成默认形状
else
setCursor(new Cursor(Cursor.HAND_CURSOR)); // 设置成手型
}
});
addMouseListener(new Mo());
}
private boolean findChess(int x, int y) {
for (PointClass c : pointList)
{
if (c != null && c.getX() == x && c.getY() == y)
return true;
}
/*for(int i=0;i<pointList.length;i++){
if(pointList!=null&&pointList[i].getX()==x&&pointList[i].getY()==y)
return true;
}*/
return false;
}
public void paintComponent(Graphics g){//paintComponent重写
//画棋盘
for(int i=0;i<=rows;i++){
g.drawLine(margin, margin+i*span, margin+colums*span, margin+i*span);
}
for(int j=0;j<=colums;j++){
g.drawLine(margin+j*span, margin,margin+j*span ,margin+ rows*span);
}
for(int i=0;i<pointCount;i++){
int xPos =pointList[i].getX() * span+ margin; // 网格交叉点的x坐标
int yPos = pointList[i].getY() * span + margin;// 网格交叉点的y坐标
g.setColor(pointList[i].getColor()); // 设置颜色
g.fillOval(xPos - PointClass.DIAMETER / 2, yPos - PointClass.DIAMETER / 2,
PointClass.DIAMETER, PointClass.DIAMETER);
}
}
public Dimension getPreferredSize(){//getPreferredSize重写
return new Dimension(margin*2+colums*span,margin*rows*span);
}
private int isWin() {
//
for(int i=0;i<11;i++)
for(int j=0;j<11;j++){
if(status[i][j]==1){
int count=0;
//横向收索
for(int r=j;status[i][r]==1&&r<11;r++){count++;}
for(int r=j;status[i][r]==1&&r>0;r--){count++;}
count--;
//System.out.println("横向"+count);
if(count>=5){return 1;}
//纵向收索
count=0;
for(int r=i;status[r][j]==1&&r<11;r++){count++;}
for(int r=i;status[r][j]==1&&r>0;r--){count++;}
count--;
// System.out.println("纵向"+count);
if(count>=5){return 1;}
//上斜方向收索
count=0;
for(int r=i,s=j;status[r][s]==1&&r<11&&s<11;r--,s++){count++;}
for(int r=i,s=j;status[r][s]==1&&r>0&&s>0;r++,s--){count++;}
count--;
//System.out.println("上斜方向"+count);
if(count>=5){return 1;}
//下斜方向收索
count=0;
for(int r=i,s=j;status[r][s]==1&&r<11&&s<11;r++,s++){count++;}
for(int r=i,s=j;status[r][s]==1&&r>0&&s>0;r--,s--){count++;}
count--;
// System.out.println("下斜方向"+count);
if(count>=5){return 1;}
}
if(status[i][j]==2){
int co=0;
//横向收索
for(int r=j;status[i][r]==2&&r<11;r++){co++;}
for(int r=j;status[i][r]==2&&r>0;r--){co++;}
co--;
if(co>=5){return 2;}
//纵向收索
co=0;
for(int r=i;status[r][j]==2&&r<11;r++){co++;}
for(int r=i;status[r][j]==2&&r>0;r--){co++;}
co--;
if(co>=5){return 2;}
//上斜方向收索
co=0;
for(int r=i,s=j;status[r][s]==2&&r<11&&s<11;r--,s++){co++;}
for(int r=i,s=j;status[r][s]==2&&r>0&&s>0;r++,s--){co++;}
co--;
if(co>=5){return 2;}
//下斜方向收索
co=0;
for(int r=i,s=j;status[r][s]==2&&r<11&&s<11;r++,s++){co++;}
for(int r=i,s=j;status[r][s]==2&&r>0&&s>0;r--,s--){co++;}
co--;
if(co>=5){return 2;}
}
}
return 0;
}
class Mo implements MouseListener{
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
xIndex=(e.getX()-margin+span/2)/span;
yIndex=(e.getY()-margin+span/2)/span;
findChess(xIndex,yIndex);
if(findChess(xIndex,yIndex)){//如果该处已经有放置旗子了就直接返回
return;
}
if(xIndex==0||yIndex==0||xIndex==colums||yIndex==rows){
return;
}
PointClass p=new PointClass(xIndex,yIndex,isBlack ? Color.black:Color.white);
if(p.getColor()==Color.black){status[xIndex][yIndex]=1;}//黑色二维数组为1
else status[xIndex][yIndex]=2;
if(isWin()==1){
System.out.println("黑色已经胜利了!!");
JOptionPane.showMessageDialog(null,"黑棋已经胜利了!!");
return;
}
if(isWin()==2){
System.out.println("白棋已经胜利了!!");
JOptionPane.showMessageDialog(null,"白棋已经胜利了!!");
return;
}
pointList[pointCount]=p;
repaint();
pointCount=pointCount+1;
isBlack=!isBlack;
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
}
}