📄 五子棋.txt
字号:
package yang;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ChessBoard extends JFrame {
int width;
int margin;
int num;
double gap;
int x0,y0;
int i0,j0;
int oldi=-1,oldj=-1;
ChessPoint [][] points;
public ChessBoard(int width,int num){
this.width=width;
this.num=num;
x0=y0=50;
margin=20;
gap=(double)(width-2*margin)/(num-1);
init();
this.setSize(2*x0+width,2*y0+width);
this.setVisible(true);
this.addMouseListener(ml);
this.addWindowListener(wl);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ChessBoard ch=new ChessBoard(500,20);
ch.display();
}
public void init(){
points=new ChessPoint[num][num];
for(int i=0;i<points.length;i++){
for(int j=0;j<points[i].length ;j++){
points[i][j]=new ChessPoint((int)(x0+margin+gap*j),(int)(y0+margin+gap*i),0);
}
}
// points[6][6].state=1;
}
public void display(){
for(int i=0;i<points.length;i++){
for(int j=0;j<points[i].length ;j++){
System.out.print(points[i][j]);
}
System.out.println();
}
}
public void displayBackgroung(Graphics g){
g.setColor(Color.ORANGE);
g.fillRect(x0,y0,width,width);
g.setColor(Color.white);
int t=0;
for(int i=0;i<num;i++){
g.drawLine(x0+margin, t=i==num-1?y0+width-margin:(int)(y0+margin+i*gap),x0+width-margin, t);
g.drawLine(t=i==num-1?x0+width-margin:(int)(x0+margin+i*gap),y0+margin, t,y0+width-margin);
}
}
public void display(Graphics g){
for(int i=0;i<points.length;i++){
for(int j=0;j<points[i].length ;j++){
points[i][j].display(g);
}
}
}
public void paint(Graphics g){
displayBackgroung(g);
display(g);
}
public boolean valid(int i,int j){
return i>=0 && i<num && j>=0 && j<num;
}
public boolean end(int i,int j){
return false;
}
public void think(){
//initScore
initScore();
//eval
eval();
//getMax
getMax();
}
private void initScore(){
for(int i=0;i<points.length;i++){
for(int j=0;j<points[i].length;j++){
if(points[i][j].state!=ChessPoint.NONE) continue;
points[i][j].score=0;
}
}
}
private void eval(){
int beginX[]={0,0,0,0,0,num-1};
int beginY[]={0,0,0,1,0,1};
int lineOffsetX[]={0,1,1,0,1,0};
int lineOffsetY[]={1,0,0,1,0,1};
int offsetX[]={1,0,1,1,-1,-1};
int offsetY[]={0,1,1,1,1,1};
int wScore[]={0,10,50,500,5000};
int bScore[]={0,10,50,500,5000};
for(int k=0;k<beginX.length;k++){
int lineBeginX=beginX[k];
int lineBeginY=beginY[k];
line:for(;valid(lineBeginX,lineBeginY);lineBeginX+=lineOffsetX[k],lineBeginY+=lineOffsetY[k]){
int x=lineBeginX;
int y=lineBeginY;
point:for(;valid(x,y);x+=offsetX[k],y+=offsetY[k]){
//compute num
int m=0;
int state=0;
for(int l=0;l<5;l++){
int xx=x+l*offsetX[k];
int yy=y+l*offsetY[k];
if(!valid(xx,yy)){
continue line;
}
if(state==0){
if(points[xx][yy].state!=0){
state=points[xx][yy].state;
m=1;
}
}
else{
if(points[xx][yy].state!=0){
if(state==points[xx][yy].state){
m++;
}
else{
continue point;
}
}
}
}
if(m>=5){
throw new RuntimeException("End. You know?");
}
if(m==0)
continue;
//accumulate score
int s=state==ChessPoint.BLACK?bScore[m]:wScore[m];
for(int l=0;l<5;l++){
int xx=x+l*offsetX[k];
int yy=y+l*offsetY[k];
if(points[xx][yy].state==ChessPoint.NONE){
points[xx][yy].score+=s;
}
}
}
}
}
}
private void getMax(){
int max=0;
i0=j0=-1;
for(int i=0;i<points.length;i++){
for(int j=0;j<points[i].length;j++){
if(points[i][j].state!=ChessPoint.NONE) continue;
if(points[i][j].score>max){
max=points[i][j].score;
i0=i;j0=j;
}
}
}
if(i0==-1){
i0=j0=num/2;
}
}
transient MouseListener ml=new MouseAdapter(){
public void mouseClicked(MouseEvent e){
//compute i,j clicked
int i=(int)Math.round((e.getY()-y0-margin)/gap);
int j=(int)Math.round((e.getX()-x0-margin)/gap);
//valid?
if(!valid(i,j))
return;
if(points[i][j].state!=ChessPoint.NONE){
return;
}
//set black
points[i][j].state=ChessPoint.BLACK;
repaint();
if(end(i,j)){
JOptionPane.showMessageDialog(ChessBoard.this, "Congratulation!");
if(JOptionPane.showConfirmDialog(ChessBoard.this, "Continue ?")==JOptionPane.NO_OPTION){
init();
return;
}
else{
setVisible(false);
System.exit(0);
}
}
//compute go
think();
if(oldi>=0){
points[oldi][oldj].isLast=false;
}
oldi=i0;oldj=j0;
points[i0][j0].isLast=true;
points[i0][j0].state=ChessPoint.WHITE;
repaint();
if(end(i0,j0)){
JOptionPane.showMessageDialog(ChessBoard.this, "Don't be dismayed.Come on!");
if(JOptionPane.showConfirmDialog(ChessBoard.this, "Continue ?")==JOptionPane.NO_OPTION){
init();
return;
}
else{
setVisible(false);
System.exit(0);
}
}
}
};
transient WindowListener wl=new WindowAdapter(){
public void windowClosing(WindowEvent e){
setVisible(false);
System.exit(0);
}
};
}
package yang;
import java.awt.*;
public class ChessPoint extends Point {
int state; //1:black; 2:white; 0:none
public static final int BLACK=1;
public static final int WHITE=2;
public static final int NONE=0;
boolean isLast=false;
int score;
private int r=10;
public ChessPoint(){
super();
// this(0,0,0);
}
public ChessPoint(int x,int y){
super(x,y);
state=0;
// this(x,y,0);
}
public ChessPoint(int x,int y,int state){
super(x,y);
this.state=state;
// this.BLACK=3;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new ChessPoint();
new ChessPoint(5,5);
new ChessPoint(6,6,1);
}
public String toString(){
return super.toString()+":"+state;
}
void f(){
final int X=0;
}
public void display(Graphics g){
switch(state){
case BLACK:
g.setColor(Color.black);
g.fillOval(x-r, y-r, 2*r, 2*r);
break;
case WHITE:
g.setColor(Color.white);
if(isLast){
g.fillRect(x-r, y-r, 2*r, 2*r);
}
else
g.fillOval(x-r, y-r, 2*r, 2*r);
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -