JavaFX 井字棋游戏
利用javafx设计一个井字棋游戏,其中包括了能够与玩家对战的ai。ai的实现相比五子棋来说要简单得多,可以保证ai在后手情况下绝对不会输,具体实现如下:
/*
* to change this license header, choose license headers in project properties.
* to change this template file, choose tools | templates
* and open the template in the editor.
*/
package 井字棋;
import javafx.application.application;
import javafx.scene.scene;
import javafx.stage.stage;
import javafx.scene.layout.gridpane;
import javafx.scene.shape.circle;
import javafx.scene.shape.line;
import javafx.scene.control.button;
import javafx.event.eventhandler;
import javafx.event.actionevent;
import javafx.animation.timeline;
import javafx.util.duration;
import javafx.animation.keyframe;
import javafx.scene.control.textarea;
/**
*
* @author midori
*/
public class 井字棋 extends application{
private static int a[][]=new int[3][3];
private static int step=1;
private static int last=5;
private static boolean win=false;
private static boolean draw=false;
private static int wincount=0;
private static int drawcount=0;
private static string s="<( ̄︶ ̄)↗[go!]"+"\n"+"[^ェ^] よろしく!";
@override
public void start(stage primarystage){
gridpane pane=new gridpane();
pane.setminsize(500, 300);
primarystage.setresizable(false);
button bt1=new button();
bt1.setminsize(100,100);
button bt2=new button();
bt2.setminsize(100,100);
button bt3=new button();
bt3.setminsize(100,100);
button bt4=new button();
bt4.setminsize(100,100);
button bt5=new button();
bt5.setminsize(100,100);
button bt6=new button();
bt6.setminsize(100,100);
button bt7=new button();
bt7.setminsize(100,100);
button bt8=new button();
bt8.setminsize(100,100);
button bt9=new button();
bt9.setminsize(100,100);
pane.add(bt1,0,0);
pane.add(bt2,0,1);
pane.add(bt3,0,2);
pane.add(bt4,1,0);
pane.add(bt5,1,1);
pane.add(bt6,1,2);
pane.add(bt7,2,0);
pane.add(bt8,2,1);
pane.add(bt9,2,2);
button bt=new button("again");
pane.add(bt,5,1);
scene scene=new scene(pane);
eventhandler<actionevent>eventhandler=e1->{
bt.setonmousepressed(e->{
for(int i=0;i<3;i++){
for(int j=0;j<3;j++)
a[i][j]=0;
}
step=1;
last=5;
win=false;
draw=false;
s="<( ̄︶ ̄)↗[go!]"+"\n"+"[^ェ^] よろしく!";
});
if(last==0){
draw=true;
last=-1;
drawcount++;
}
if(win){
last=-1;
s="你咋又输了~"+"\n"+"( ̄_, ̄ )";
}
if(draw){
s="欸~平局~~"+"\n"+"╮(╯-╰)╭";
}
textarea t2=new textarea();
t2.settext(s);
t2.setmaxheight(80);
pane.add(t2,5,2);
textarea t1=new textarea();
t1.settext("你已经输了"+wincount+"局!"+"\n"+"你已经平了"+drawcount+"局!"+"\n"+"你还没赢过~");
t1.setmaxheight(80);
pane.add(t1,5,0);
bt1.settext(switch(a[0][0]));
bt2.settext(switch(a[0][1]));
bt3.settext(switch(a[0][2]));
bt4.settext(switch(a[1][0]));
bt5.settext(switch(a[1][1]));
bt6.settext(switch(a[1][2]));
bt7.settext(switch(a[2][0]));
bt8.settext(switch(a[2][1]));
bt9.settext(switch(a[2][2]));
bt1.setonmousepressed(e->{
if(step>0&&a[0][0]==0&&last>0){
a[0][0]=1;
step--;
last--;
play(1);
step++;
}
});
bt2.setonmousepressed(e->{
if(step>0&&a[0][1]==0&&last>0){
a[0][1]=1;
step--;
last--;
play(2);
step++;
}
});
bt3.setonmousepressed(e->{
if(step>0&&a[0][2]==0&&last>0){
a[0][2]=1;
step--;
last--;
play(3);
step++;
}
});
bt4.setonmousepressed(e->{
if(step>0&&a[1][0]==0&&last>0){
a[1][0]=1;
step--;
last--;
play(4);
step++;
}
});
bt5.setonmousepressed(e->{
if(step>0&&a[1][1]==0&&last>0){
a[1][1]=1;
step--;
last--;
play(5);
step++;
}
});
bt6.setonmousepressed(e->{
if(step>0&&a[1][2]==0&&last>0){
a[1][2]=1;
step--;
last--;
play(6);
step++;
}
});
bt7.setonmousepressed(e->{
if(step>0&&a[2][0]==0&&last>0){
a[2][0]=1;
step--;
last--;
play(7);
step++;
}
});
bt8.setonmousepressed(e->{
if(step>0&&a[2][1]==0&&last>0){
a[2][1]=1;
step--;
last--;
play(8);
step++;
}
});
bt9.setonmousepressed(e->{
if(step>0&&a[2][2]==0&&last>0){
a[2][2]=1;
step--;
last--;
play(9);
step++;
}
});
};
timeline animation=new timeline(
new keyframe(duration.millis(100),eventhandler)
);
animation.setcyclecount(timeline.indefinite);
animation.play();
primarystage.setscene(scene);
primarystage.settitle("井字棋");
primarystage.show();
}
public string switch(int i){
string s="";
switch(i){
case 0:
s=" ";
break;
case -1:
s="o";
break;
case 1:
s="x";
}return s;
}
public static void main(string[] args) {
application.launch(args);
}
public void reset(){
}
public void play(int i){
if(last==4)
if(i!=5)
a[1][1]=-1;
else
a[0][0]=-1;
else{
if(a[0][0]!=1&&a[0][1]!=1&&a[0][2]!=1&&a[0][0]+a[0][1]+a[0][2]<-1){
for(int j=0;j<3;j++)
if(a[0][j]==0)
a[0][j]=-1;
win=true;wincount++;
}
else if(a[1][0]!=1&&a[1][1]!=1&&a[1][2]!=1&&a[1][0]+a[1][1]+a[1][2]<-1){
for(int j=0;j<3;j++)
if(a[1][j]==0)
a[1][j]=-1;
win=true;wincount++;
}
else if(a[2][0]!=1&&a[2][1]!=1&&a[2][2]!=1&&a[2][0]+a[2][1]+a[2][2]<-1){
for(int j=0;j<3;j++)
if(a[2][j]==0)
a[2][j]=-1;
win=true;wincount++;
}
else if(a[0][0]!=1&&a[1][0]!=1&&a[2][0]!=1&&a[0][0]+a[1][0]+a[2][0]<-1){
for(int j=0;j<3;j++)
if(a[j][0]==0)
a[j][0]=-1;
win=true;wincount++;
}
else if(a[0][1]!=1&&a[1][1]!=1&&a[2][1]!=1&&a[0][1]+a[1][1]+a[2][1]<-1){
for(int j=0;j<3;j++)
if(a[j][1]==0)
a[j][1]=-1;
win=true;wincount++;
}
else if(a[0][2]!=1&&a[1][2]!=1&&a[2][2]!=1&&a[0][2]+a[1][2]+a[2][2]<-1){
for(int j=0;j<3;j++)
if(a[j][2]==0)
a[j][2]=-1;
win=true;wincount++;
}else if(a[0][0]!=1&&a[1][1]!=1&&a[2][2]!=1&&a[0][0]+a[1][1]+a[2][2]<-1){
for(int j=0;j<3;j++)
if(a[j][j]==0)
a[j][j]=-1;
win=true;wincount++;
}
else if(a[2][0]!=1&&a[1][1]!=1&&a[0][2]!=1&&a[2][0]+a[1][1]+a[0][2]<-1){
for(int j=0;j<3;j++)
if(a[j][2-j]==0)
a[j][2-j]=-1;
win=true;wincount++;
}
else if(a[0][0]!=-1&&a[0][1]!=-1&&a[0][2]!=-1&&a[0][0]+a[0][1]+a[0][2]>1){
for(int j=0;j<3;j++)
if(a[0][j]==0)
a[0][j]=-1;
}
else if(a[1][0]!=-1&&a[1][1]!=-1&&a[1][2]!=-1&&a[1][0]+a[1][1]+a[1][2]>1){
for(int j=0;j<3;j++)
if(a[1][j]==0)
a[1][j]=-1;
}
else if(a[2][0]!=-1&&a[2][1]!=-1&&a[2][2]!=-1&&a[2][0]+a[2][1]+a[2][2]>1){
for(int j=0;j<3;j++)
if(a[2][j]==0)
a[2][j]=-1;
}
else if(a[0][0]!=-1&&a[1][0]!=-1&&a[2][0]!=-1&&a[0][0]+a[1][0]+a[2][0]>1){
for(int j=0;j<3;j++)
if(a[j][0]==0)
a[j][0]=-1;
}
else if(a[0][1]!=-1&&a[1][1]!=-1&&a[2][1]!=-1&&a[0][1]+a[1][1]+a[2][1]>1){
for(int j=0;j<3;j++)
if(a[j][1]==0)
a[j][1]=-1;
}
else if(a[0][2]!=-1&&a[1][2]!=-1&&a[2][2]!=-1&&a[0][2]+a[1][2]+a[2][2]>1){
for(int j=0;j<3;j++)
if(a[j][2]==0)
a[j][2]=-1;
}else if(a[0][0]!=-1&&a[1][1]!=-1&&a[2][2]!=-1&&a[0][0]+a[1][1]+a[2][2]>1){
for(int j=0;j<3;j++)
if(a[j][j]==0)
a[j][j]=-1;
}
else if(a[2][0]!=-1&&a[1][1]!=-1&&a[0][2]!=-1&&a[2][0]+a[1][1]+a[0][2]>1){
for(int j=0;j<3;j++)
if(a[j][2-j]==0)
a[j][2-j]=-1;
}else{
if(a[0][0]==0)
a[0][0]=-1;
else if(a[2][0]==0)
a[2][0]=-1;
else if(a[0][2]==0)
a[0][2]=-1;
else if(a[2][2]==0)
a[2][2]=-1;
else if(a[0][1]==0)
a[0][1]=-1;
else if(a[1][0]==0)
a[1][0]=-1;
else if(a[1][2]==0)
a[1][2]=-1;
else
a[2][1]=-1;
}
}
}
}
下面是图形界面:
/* * to change this license header, choose license headers in project properties. * to change this template file, choose tools | templates * and open the template in the editor. */package 井字棋;import javafx.application.application;import javafx.scene.scene;import javafx.stage.stage;import javafx.scene.layout.gridpane;import javafx.scene.shape.circle;import javafx.scene.shape.line;import javafx.scene.control.button;import javafx.event.eventhandler;import javafx.event.actionevent;import javafx.animation.timeline;import javafx.util.duration;import javafx.animation.keyframe;import javafx.scene.control.textarea;/** * * @author midori */public class 井字棋 extends application{ private static int a[][]=new int[3][3]; private static int step=1; private static int last=5; private static boolean win=false; private static boolean draw=false; private static int wincount=0; private static int drawcount=0; private static string s="<( ̄︶ ̄)↗[go!]"+"\n"+"[^ェ^] よろしく!"; @override public void start(stage primarystage){ gridpane pane=new gridpane(); pane.setminsize(500, 300); primarystage.setresizable(false); button bt1=new button(); bt1.setminsize(100,100); button bt2=new button(); bt2.setminsize(100,100); button bt3=new button(); bt3.setminsize(100,100); button bt4=new button(); bt4.setminsize(100,100); button bt5=new button(); bt5.setminsize(100,100); button bt6=new button(); bt6.setminsize(100,100); button bt7=new button(); bt7.setminsize(100,100); button bt8=new button(); bt8.setminsize(100,100); button bt9=new button(); bt9.setminsize(100,100); pane.add(bt1,0,0); pane.add(bt2,0,1); pane.add(bt3,0,2); pane.add(bt4,1,0); pane.add(bt5,1,1); pane.add(bt6,1,2); pane.add(bt7,2,0); pane.add(bt8,2,1); pane.add(bt9,2,2); button bt=new button("again"); pane.add(bt,5,1); scene scene=new scene(pane); eventhandler<actionevent>eventhandler=e1->{ bt.setonmousepressed(e->{ for(int i=0;i<3;i++){ for(int j=0;j<3;j++) a[i][j]=0; } step=1; last=5; win=false; draw=false; s="<( ̄︶ ̄)↗[go!]"+"\n"+"[^ェ^] よろしく!"; }); if(last==0){ draw=true; last=-1; drawcount++; } if(win){ last=-1; s="你咋又输了~"+"\n"+"( ̄_, ̄ )"; } if(draw){ s="欸~平局~~"+"\n"+"╮(╯-╰)╭"; } textarea t2=new textarea(); t2.settext(s); t2.setmaxheight(80); pane.add(t2,5,2); textarea t1=new textarea(); t1.settext("你已经输了"+wincount+"局!"+"\n"+"你已经平了"+drawcount+"局!"+"\n"+"你还没赢过~"); t1.setmaxheight(80); pane.add(t1,5,0); bt1.settext(switch(a[0][0])); bt2.settext(switch(a[0][1])); bt3.settext(switch(a[0][2])); bt4.settext(switch(a[1][0])); bt5.settext(switch(a[1][1])); bt6.settext(switch(a[1][2])); bt7.settext(switch(a[2][0])); bt8.settext(switch(a[2][1])); bt9.settext(switch(a[2][2])); bt1.setonmousepressed(e->{ if(step>0&&a[0][0]==0&&last>0){ a[0][0]=1; step--; last--; play(1); step++; } }); bt2.setonmousepressed(e->{ if(step>0&&a[0][1]==0&&last>0){ a[0][1]=1; step--; last--; play(2); step++; } }); bt3.setonmousepressed(e->{ if(step>0&&a[0][2]==0&&last>0){ a[0][2]=1; step--; last--; play(3); step++; } }); bt4.setonmousepressed(e->{ if(step>0&&a[1][0]==0&&last>0){ a[1][0]=1; step--; last--; play(4); step++; } }); bt5.setonmousepressed(e->{ if(step>0&&a[1][1]==0&&last>0){ a[1][1]=1; step--; last--; play(5); step++; } }); bt6.setonmousepressed(e->{ if(step>0&&a[1][2]==0&&last>0){ a[1][2]=1; step--; last--; play(6); step++; } }); bt7.setonmousepressed(e->{ if(step>0&&a[2][0]==0&&last>0){ a[2][0]=1; step--; last--; play(7); step++; } }); bt8.setonmousepressed(e->{ if(step>0&&a[2][1]==0&&last>0){ a[2][1]=1; step--; last--; play(8); step++; } }); bt9.setonmousepressed(e->{ if(step>0&&a[2][2]==0&&last>0){ a[2][2]=1; step--; last--; play(9); step++; } }); }; timeline animation=new timeline( new keyframe(duration.millis(100),eventhandler) ); animation.setcyclecount(timeline.indefinite); animation.play(); primarystage.setscene(scene); primarystage.settitle("井字棋"); primarystage.show(); } public string switch(int i){ string s=""; switch(i){ case 0: s=" "; break; case -1: s="o"; break; case 1: s="x"; }return s; } public static void main(string[] args) { application.launch(args); } public void reset(){ } public void play(int i){ if(last==4) if(i!=5) a[1][1]=-1; else a[0][0]=-1; else{ if(a[0][0]!=1&&a[0][1]!=1&&a[0][2]!=1&&a[0][0]+a[0][1]+a[0][2]<-1){ for(int j=0;j<3;j++) if(a[0][j]==0) a[0][j]=-1; win=true;wincount++; } else if(a[1][0]!=1&&a[1][1]!=1&&a[1][2]!=1&&a[1][0]+a[1][1]+a[1][2]<-1){ for(int j=0;j<3;j++) if(a[1][j]==0) a[1][j]=-1; win=true;wincount++; } else if(a[2][0]!=1&&a[2][1]!=1&&a[2][2]!=1&&a[2][0]+a[2][1]+a[2][2]<-1){ for(int j=0;j<3;j++) if(a[2][j]==0) a[2][j]=-1; win=true;wincount++; } else if(a[0][0]!=1&&a[1][0]!=1&&a[2][0]!=1&&a[0][0]+a[1][0]+a[2][0]<-1){ for(int j=0;j<3;j++) if(a[j][0]==0) a[j][0]=-1; win=true;wincount++; } else if(a[0][1]!=1&&a[1][1]!=1&&a[2][1]!=1&&a[0][1]+a[1][1]+a[2][1]<-1){ for(int j=0;j<3;j++) if(a[j][1]==0) a[j][1]=-1; win=true;wincount++; } else if(a[0][2]!=1&&a[1][2]!=1&&a[2][2]!=1&&a[0][2]+a[1][2]+a[2][2]<-1){ for(int j=0;j<3;j++) if(a[j][2]==0) a[j][2]=-1; win=true;wincount++; }else if(a[0][0]!=1&&a[1][1]!=1&&a[2][2]!=1&&a[0][0]+a[1][1]+a[2][2]<-1){ for(int j=0;j<3;j++) if(a[j][j]==0) a[j][j]=-1; win=true;wincount++; } else if(a[2][0]!=1&&a[1][1]!=1&&a[0][2]!=1&&a[2][0]+a[1][1]+a[0][2]<-1){ for(int j=0;j<3;j++) if(a[j][2-j]==0) a[j][2-j]=-1; win=true;wincount++; } else if(a[0][0]!=-1&&a[0][1]!=-1&&a[0][2]!=-1&&a[0][0]+a[0][1]+a[0][2]>1){ for(int j=0;j<3;j++) if(a[0][j]==0) a[0][j]=-1; } else if(a[1][0]!=-1&&a[1][1]!=-1&&a[1][2]!=-1&&a[1][0]+a[1][1]+a[1][2]>1){ for(int j=0;j<3;j++) if(a[1][j]==0) a[1][j]=-1; } else if(a[2][0]!=-1&&a[2][1]!=-1&&a[2][2]!=-1&&a[2][0]+a[2][1]+a[2][2]>1){ for(int j=0;j<3;j++) if(a[2][j]==0) a[2][j]=-1; } else if(a[0][0]!=-1&&a[1][0]!=-1&&a[2][0]!=-1&&a[0][0]+a[1][0]+a[2][0]>1){ for(int j=0;j<3;j++) if(a[j][0]==0) a[j][0]=-1; } else if(a[0][1]!=-1&&a[1][1]!=-1&&a[2][1]!=-1&&a[0][1]+a[1][1]+a[2][1]>1){ for(int j=0;j<3;j++) if(a[j][1]==0) a[j][1]=-1; } else if(a[0][2]!=-1&&a[1][2]!=-1&&a[2][2]!=-1&&a[0][2]+a[1][2]+a[2][2]>1){ for(int j=0;j<3;j++) if(a[j][2]==0) a[j][2]=-1; }else if(a[0][0]!=-1&&a[1][1]!=-1&&a[2][2]!=-1&&a[0][0]+a[1][1]+a[2][2]>1){ for(int j=0;j<3;j++) if(a[j][j]==0) a[j][j]=-1; } else if(a[2][0]!=-1&&a[1][1]!=-1&&a[0][2]!=-1&&a[2][0]+a[1][1]+a[0][2]>1){ for(int j=0;j<3;j++) if(a[j][2-j]==0) a[j][2-j]=-1; }else{ if(a[0][0]==0) a[0][0]=-1; else if(a[2][0]==0) a[2][0]=-1; else if(a[0][2]==0) a[0][2]=-1; else if(a[2][2]==0) a[2][2]=-1; else if(a[0][1]==0) a[0][1]=-1; else if(a[1][0]==0) a[1][0]=-1; else if(a[1][2]==0) a[1][2]=-1; else a[2][1]=-1; } } } }