五子棋程序

今天写了一个五子棋程序。代码和大家共享下 哈哈。。。。

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

}

}

 

 

}

package cn.edu.fjnu.www;
import java.awt.Color;
import java.awt.Container;
import javax.swing.JFrame;
public class StartChessJFrame extends JFrame{
/**
*/
private static final long serialVersionUID = 1L;
public StartChessJFrame(){
super("五子棋游戏");
Container c=getContentPane();
ChessPan cp=new ChessPan(10,10);
c.add(cp);
}
public static void main(String args[]){
  StartChessJFrame app=new StartChessJFrame();
  app.setBackground(Color.red);  
  app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  app.setSize(400,400);
  app.setLocationRelativeTo(null);
  app.setVisible(true);
}
}
package cn.edu.fjnu.www;
import java.awt.Color;
public class PointClass {
private int x; // 棋盘中的x索引
private int y; // 棋盘中的y索引
private Color color;//颜色
public static final int DIAMETER = 30;//直径
public PointClass(int x, int y, Color color) {
this.x = x;
this.y = y;
this.color = color;
}
public int getX() {// 拿到棋盘中的x索引
return x;
}
public int getY() {// 拿到棋盘中的Y索引
return y;
}
public Color getColor() {//得到颜色
return color;
}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值