五子棋ai算法 求高手帮忙看懂

lovechen9527 2010-12-21 01:57:37
想弄懂电脑具体是怎么下子的 谢谢了 小菜鸟求教
package chess;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.WindowConstants;

public class ChessBoard extends JFrame{
private int width;
private int num;
private int margin;
private int x0,y0;
private double gap;
private ChessPoint[][]points;
private int i0,j0;

public int dirBeginX[];//={0,0,0,1,0,num-1};
public int dirBeginY[];//={0,0,0,0,0,1};
public int lineBeginX[];
public int lineBeginY[];
public int offsetX[];
public int offsetY[];
public int scoreBlack[]={0,10,50,500,10000};
public int scoreWhite[]={0,10,50,500,10000};
public ChessBoard(int width,int num){
x0=y0=50;
margin=20;
this.width=width;
this.num=num;
gap=(double)(width-2*margin)/(num-1);
initPoint();
this.setSize(width+2*x0,width+2*y0);

dirBeginX=new int[]{0,0,0,1,0,num-1};
dirBeginY=new int[]{0,0,0,0,0,1};
lineBeginX=new int[]{0,1,0,1,1,0};
lineBeginY=new int[]{1,0,1,0,0,1};
offsetX=new int[]{1,0,1,1,-1,-1};
offsetY=new int[]{0,1,1,1,1,1};
this.register();
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new ChessBoard(500,20).setVisible(true);
}
public void initPoint(){
end=false;
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+j*gap),(int)(y0+margin+i*gap),0);
}
}
// points[10][10].setState(ChessPoint.WHITE);
}
public void paint(Graphics g){
displayBackground(g);
display(g);
}
public void displayBackground(Graphics g){
g.setColor(Color.orange);
g.fillRect(x0, y0, width, width);
g.setColor(Color.white);
for(int i=0;i<num;i++){
g.drawLine(x0+margin, (int)(y0+margin+i*gap), x0+width-margin, (int)(y0+margin+i*gap));
g.drawLine((int)(x0+margin+i*gap),y0+margin, (int)(x0+margin+i*gap),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 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 register(){
this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
this.addMouseListener(ml);
}
public boolean valid(int i,int j){
return i>=0 && i<num && j>=0 && j<num;
}
private void think(){
initScore();
evaluate();
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].getState()==ChessPoint.NONE){
points[i][j].setScore(0);
}
}
}
}
private void evaluate(){
for(int k=0;k<6;k++){
int lineX=this.dirBeginX[k];
int lineY=this.dirBeginY[k];
line:for(;valid(lineX,lineY);lineX+=this.lineBeginX[k],lineY+=this.lineBeginY[k]){
int x=lineX;
int y=lineY;
point:for(;valid(x,y);x+=this.offsetX[k],y+=this.offsetY[k]){
int m=0;
int state=ChessPoint.NONE;
//compute number
for(int l=0;l<5;l++){
int xx=x+l*this.offsetX[k];
int yy=y+l*this.offsetY[k];
if(!valid(xx,yy)){
continue line;
}
if(state==ChessPoint.NONE){
if(points[xx][yy].getState()!=ChessPoint.NONE){
m=1;
state=points[xx][yy].getState();
}
}
else{
if(points[xx][yy].getState()==ChessPoint.NONE)
continue;
if(state!=points[xx][yy].getState()){
continue point;
}
m++;
}
}
//score
if(m==0)
continue;
if(m==5){
end=true;
if(state==ChessPoint.BLACK){
JOptionPane.showConfirmDialog(ChessBoard.this, "Congratulation!");
if(JOptionPane.OK_OPTION==JOptionPane.showConfirmDialog(ChessBoard.this, "还玩吗?")){
initPoint();
repaint();
return;
}
else{
setVisible(false);
System.exit(0);
}
}
else{
JOptionPane.showConfirmDialog(ChessBoard.this, "Don't be dispointed. Next time you'll win");
if(JOptionPane.OK_OPTION==JOptionPane.showConfirmDialog(ChessBoard.this, "还玩吗?")){
initPoint();
repaint();
return;
}
else{
setVisible(false);
System.exit(0);
}
}
}
int sc=state==ChessPoint.BLACK?this.scoreBlack[m]:this.scoreWhite[m];
System.out.println("\n----"+sc);
for(int l=0;l<5;l++){
int xx=x+l*this.offsetX[k];
int yy=y+l*this.offsetY[k];
if(points[xx][yy].getState()==ChessPoint.NONE){
points[xx][yy].setScore(points[xx][yy].getScore()+sc);
}
}
}
}
}
}
private void getMax(){
float 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].getState()==ChessPoint.NONE){
if(max<points[i][j].getScore()){
max=points[i][j].getScore();
i0=i;j0=j;
}
}
}
}
if(i0==-1){
i0=j0=num/2;
}
System.out.println("\ni0="+i0+" j0="+j0);
}

transient MouseListener ml=new MouseAdapter(){
public void mouseClicked(MouseEvent e){
int x=e.getX();
int y=e.getY();
int j=(int)Math.round((x-x0-margin)/gap);
int i=(int)Math.round((y-y0-margin)/gap);
if(!valid(i,j)){
return ;
}
if(points[i][j].getState()!=ChessPoint.NONE){
return ;
}
points[i][j].setState(ChessPoint.BLACK);
repaint();

think();
if(end)
return;
points[i0][j0].setState(ChessPoint.WHITE);
repaint();
//display();

}

};
boolean end;

}









...全文
354 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
pywepe 2010-12-21
  • 打赏
  • 举报
回复
哈哈 我的毕业设计就是这个 不错
lovechen9527 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sunyiz 的回复:]
优先级从下到下

有5就赢
自己有4就走成5
自己无4对手有4就堵4
自己有3走成4
自己无3对手有活3就堵活3,有4-3点就堵4-3点
自己有2就走成3
自己无2,对手有马上就能走成活3的点就堵之

当然我说的都是五子棋基本的下法

作为一个业余初段的水平
我还没见过有能下赢我的电脑(我先走的话)
[/Quote] 能说一下具体是那部分是干嘛的嘛? 谢谢了
sunyiz 2010-12-21
  • 打赏
  • 举报
回复
优先级从下到下

有5就赢
自己有4就走成5
自己无4对手有4就堵4
自己有3走成4
自己无3对手有活3就堵活3,有4-3点就堵4-3点
自己有2就走成3
自己无2,对手有马上就能走成活3的点就堵之

当然我说的都是五子棋基本的下法

作为一个业余初段的水平
我还没见过有能下赢我的电脑(我先走的话)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧