java井字棋源代碼_第1頁
java井字棋源代碼_第2頁
java井字棋源代碼_第3頁
java井字棋源代碼_第4頁
java井字棋源代碼_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

.importjava.awt.*;importjava*.swing.*;importjava.awt.event.*;importjava.lang.*;importjava.util.*;//import.borland.cl.layout.*;publicclassChessFramee*tendsJFrame{///游戲界面參數(shù)privateContainercontentPane;privateJPanelupPanel;privateJPanelleftPanel;privateJPanelcenterPanel;privateJPanelrightPanel;privateJPaneldownPanel;privateoBo*level;privateoBo*size;privateJRadioButtoncb1;privateJRadioButtoncb2;privateuttonb4;privateuttonb5;privateuttonb6;privateuttonb[][];privateJLabelb1;privateJLabelb11;privateJLabelb12;privateJLabelb2;privateJLabelb3;privateJLabelb31;privateJLabelb32;/////程序參數(shù)//游戲級別//棋盤大小//單項選擇按鈕,玩家先手//單項選擇按鈕,電腦先手//開場//完畢//退出按鈕//棋盤按鈕//歡送詞//棋局狀況//棋局結(jié)果privateintstartturn;privateinta[][];代表電腦下的棋子privateintresult;privateintc_size;privateintc_level;privateint*;privateinty;//游戲級別,低級,中級,高級分別對應(yīng)0,1,2//玩家出的棋子所在位置的行號//玩家所出棋子所在的列號publicChessFrame(){super("井字棋人機(jī)大作戰(zhàn)");//調(diào)用界面初始化函數(shù)frameInitnew();//退出程序WindowListenerw=newWindowAdapter(){.publicvoidwindowClosing(WindowEvente){ChessFrame.this.dispose();System.e*it(0);}this.addWindowListener(w);//定義響應(yīng)鼠標(biāo)單擊的事件ActionListenerch=newActionListener(){publicvoidactionPerformed(ActionEvente){if(e.getSource()==level){//級別c_level=level.getSelectedInde*();}elseif(e.getSource()==size){//根據(jù)棋盤大小隱藏局部按鈕c_size=size.getSelectedInde*()+3;if(c_size==3){b[0][3].setVisible(false);b[1][3].setVisible(false);b[2][3].setVisible(false);b[3][3].setVisible(false);b[3][0].setVisible(false);b[3][1].setVisible(false);b[3][2].setVisible(false);b[0][4].setVisible(false);b[1][4].setVisible(false);b[2][4].setVisible(false);b[3][4].setVisible(false);b[4][4].setVisible(false);b[4][0].setVisible(false);b[4][1].setVisible(false);b[4][2].setVisible(false);b[4][3].setVisible(false);}elseif(c_size==4){b[0][3].setVisible(true);b[1][3].setVisible(true);b[2][3].setVisible(true);b[3][3].setVisible(true);b[3][0].setVisible(true);b[3][1].setVisible(true);b[3][2].setVisible(true);b[0][4].setVisible(false);b[1][4].setVisible(false);b[2][4].setVisible(false);b[3][4].setVisible(false);.b[4][4].setVisible(false);b[4][0].setVisible(false);b[4][1].setVisible(false);b[4][2].setVisible(false);b[4][3].setVisible(false);}b[0][3].setVisible(true);b[1][3].setVisible(true);b[2][3].setVisible(true);b[3][3].setVisible(true);b[3][0].setVisible(true);b[3][1].setVisible(true);b[3][2].setVisible(true);b[0][4].setVisible(true);b[1][4].setVisible(true);b[2][4].setVisible(true);b[3][4].setVisible(true);b[4][4].setVisible(true);b[4][0].setVisible(true);b[4][1].setVisible(true);b[4][2].setVisible(true);b[4][3].setVisible(true);}}elseif(e.getSource()==cb1){cb1.setSelected(true);cb2.setSelected(false);cb1.updateUI();cb2.updateUI();startturn=1;}elseif(e.getSource()==cb2){cb1.setSelected(false);cb2.setSelected(true);cb1.updateUI();cb2.updateUI();startturn=2;}elseif(e.getSource()==b4){//調(diào)用部函數(shù),初始化棋盤beginChess();}elseif(e.getSource()==b5){//控制單項選擇按鈕//開場按鈕//完畢按鈕.endChess();}elseif(e.getSource()==b6){//e*itSystem.e*it(0);}for(intii=0;ii<c_size;ii++){for(intjj=0;jj<c_size;jj++){if(e.getSource()==b[ii][jj]){*=ii;y=jj;playchess();}}}}//endelse}//endactionPerformed};//endactionlistener//將所有按鈕參加監(jiān)聽器for(inti=0;i<5;i++){for(intj=0;j<5;j++){b[i][j].addActionListener(ch);}}level.addActionListener(ch);size.addActionListener(ch);cb1.addActionListener(ch);cb2.addActionListener(ch);b4.addActionListener(ch);b5.addActionListener(ch);b6.addActionListener(ch);this.setVisible(true);}//endChessframe///界面初始化函數(shù)privatevoidframeInitnew(){contentPane=this.getContentPane();//界面的大小和位置this.setSize(500,500);this.setResizable(false);DimensionframeSize=this.getSize();DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();this.setLocation((screenSize.width-frameSize.width)/2,(screenSize.height-frameSize.height)/2);//將整個界面劃分成五個區(qū)域,東南西北中.//西為棋盤//北為歡送詞//中為空白區(qū)//東為命令按鈕及棋局狀況//南為游戲結(jié)果c_size=3;startturn=2;c_level=0;chessboardFormed();//形成棋盤//其他是固定的,所以不需單獨形成函數(shù)//北區(qū),歡送詞b1.setFont(newjava.awt.Font("Times",Font.PLAIN,25));b1.setForeground(Color.darkGray);b11=newJLabel("",JLabel.CENTER);b12=newJLabel("",JLabel.CENTER);upPanel=newJPanel();upPanel.setLayout(newGridLayout(3,1));upPanel.setPreferredSize(newDimension(500,80));upPanel.add(b11);upPanel.add(b1);upPanel.add(b12);contentPane.add(upPanel,BorderLayout.NORTH);//南區(qū),棋局結(jié)果,初始狀態(tài)為空b3=newJLabel("蟲子的世界",JLabel.CENTER);b31=newJLabel("",JLabel.CENTER);b32=newJLabel("",JLabel.CENTER);b3.setFont(newjava.awt.Font("Times",Font.PLAIN,25));b3.setForeground(Color.darkGray);downPanel=newJPanel();downPanel.setPreferredSize(newDimension(500,60));downPanel.setLayout(newGridLayout(3,1));downPanel.add(b31);downPanel.add(b3);downPanel.add(b32);contentPane.add(downPanel,BorderLayout.SOUTH);///東區(qū),包括游戲級別選擇,棋盤大小選擇,先手方選擇,以及開場,完畢退出rightPanel=newJPanel();rightPanel.setPreferredSize(newDimension(100,360));rightPanel.setLayout(newGridLayout(8,1,0,15));b2=newJLabel("",JLabel.CENTER);b2.setFont(newjava.awt.Font("Dialog",0,15));.b4=newutton("開場");b4.setFont(newjava.awt.Font("Dialog",0,20));b4.setBorder(BorderFactory.createRaisedBevelBorder());b5=newutton("完畢");b5.setFont(newjava.awt.Font("Dialog",0,20));b5.setBorder(BorderFactory.createRaisedBevelBorder());b6=newutton("退出");b6.setFont(newjava.awt.Font("Dialog",0,20));b6.setBorder(BorderFactory.createRaisedBevelBorder());b5.setEnabled(false);cb1=newJRadioButton("玩家先手");cb2=newJRadioButton("電腦先手");//cb1.setMinimumSize(newDimension(91,25));cb1.setPreferredSize(newDimension(30,15));cb1.setSelected(false);//cb2.setMinimumSize(newDimension(91,25));cb2.setPreferredSize(newDimension(30,15));cb2.setSelected(true);cb1.setFont(newjava.awt.Font("Dialog",0,15));cb2.setFont(newjava.awt.Font("Dialog",0,15));level=newoBo*();level.addItem("初級");level.addItem("中級");level.addItem("高級");size=newoBo*();rightPanel.add(size);rightPanel.add(level);rightPanel.add(cb1);rightPanel.add(cb2);rightPanel.add(b2);rightPanel.add(b4);rightPanel.add(b5);rightPanel.add(b6);contentPane.add(rightPanel,BorderLayout.EAST);}//endframeInitnewprivatevoidchessboardFormed()//形成棋盤{jleftPanel=newJPanel();leftPanel.setPreferredSize(newDimension(300,300));b=newutton[5][5];.leftPanel.setLayout(newGridLayout(5,5,10,10));for(i=0;i<5;i++){for(j=0;j<5;j++){b[i][j]=newutton();b[i][j].setBorder(BorderFactory.createRaisedBevelBorder());b[i][j].setPreferredSize(newDimension(30,30));b[i][j].setBackground(Color.white);b[i][j].setEnabled(false);leftPanel.add(b[i][j]);}}if(c_size==3){b[0][3].setVisible(false);b[1][3].setVisible(false);b[2][3].setVisible(false);b[3][3].setVisible(false);b[3][0].setVisible(false);b[3][1].setVisible(false);b[3][2].setVisible(false);b[0][4].setVisible(false);b[1][4].setVisible(false);b[2][4].setVisible(false);b[3][4].setVisible(false);b[4][4].setVisible(false);b[4][0].setVisible(false);b[4][1].setVisible(false);b[4][2].setVisible(false);b[4][3].setVisible(false);}elseif(c_size==4){b[0][4].setVisible(false);b[1][4].setVisible(false);b[2][4].setVisible(false);b[3][4].setVisible(false);b[4][4].setVisible(false);b[4][0].setVisible(false);b[4][1].setVisible(false);b[4][2].setVisible(false);b[4][3].setVisible(false);}}leftPanel.setLocation(200,200);contentPane.add(leftPanel,BorderLayout.WEST);.}//endchessboardFormed()privatevoidbeginChess(){intijkk=c_size/2;a=newint[c_size][c_size];for(i=0;i<c_size;i++){for(j=0;j<c_size;j++){b[i][j].setBackground(Color.white);a[i][j]=0;}}if(startturn==2){//電腦先手,選擇中間的位置作為第一步a[k][k]=2;b[k][k].setEnabled(false);//b[k][k].setTe*t("*");b[k][k].setBackground(Color.blue);}else//玩家先手,則初始化為空棋盤b[k][k].setEnabled(true);for(i=0;i<c_size;i++){for(j=0;j<c_size;j++){b[i][j].setEnabled(true);}}}cb1.setEnabled(false);cb2.setEnabled(false);size.setEnabled(false);level.setEnabled(false);b2.setTe*t("玩家思考中...");b3.setTe*t("");b4.setEnabled(false);b5.setEnabled(true);}///endbeginChessprivatevoidendChess(){//終止當(dāng)前游戲,棋盤為空棋盤并且不可用jfor(i=0;i<c_size;i++){for(j=0;j<c_size;j++){b[i][j].setEnabled(false);b[i][j].setBackground(Color.white);}}cb1.setEnabled(true);.cb2.setEnabled(true);size.setEnabled(true);level.setEnabled(true);b4.setEnabled(true);b5.setEnabled(false);b2.setTe*t("");}//endendChessprivatevoidplaychess(){inti,j,k,k1,k2;k=0;for(i=0;i<c_size;i++){for(j=0;j<c_size;j++){b[i][j].setEnabled(false);}//endfor}//b[*][y].setTe*t("O");b[*][y].setBackground(Color.red);a[*][y]=1;b2.setTe*t("電腦思考中...");if(isWinornot()){//判斷是否已經(jīng)分出勝負(fù)b4.setEnabled(true);b5.setEnabled(false);//根據(jù)result的值判斷棋局的結(jié)果b2.setTe*t("游戲完畢");switch(result){case1:b3.setTe*t("恭喜您,您贏了");break;case2:b3.setTe*t("真笨,您輸了");break;case3:b3.setTe*t("哈哈,平手");break;}cb1.setEnabled(true);cb2.setEnabled(true);level.setEnabled(true);size.setEnabled(true);endifelse{//電腦根據(jù)級別選擇下一步棋子switch(c_level){case0:case1:case2:k=choosene*t0();break;k=choosene*t1();break;k=choosene*t2();break;}k1=k/10;k2=k%10;//別離出行號和列號//b[k1][k2].setTe*t("*");b[k1][k2].setBackground(Color.blue);.a[k1][k2]=2;if(isWinornot()){b4.setEnabled(true);b5.setEnabled(false);//根據(jù)result的值判斷棋局的結(jié)果b2.setTe*t("游戲完畢");switch(result){case1:b3.setTe*t("恭喜您,您贏了");break;case2:b3.setTe*t("真笨,您輸了");break;case3:b3.setTe*t("哈哈,平手");break;}cb1.setEnabled(true);cb2.setEnabled(true);level.setEnabled(true);size.setEnabled(true);}else{//繼續(xù)承受用戶輸入for(i=0;i<c_size;i++){for(j=0;j<c_size;j++){if(a[i][j]==0){b[i][j].setEnabled(true);b2.setTe*t("玩家思考中...");}}//endelse}privatebooleanisWinornot(){intijk;booleanfa;//找是否在同一行上有連成一條線的for(i=0;i<c_size;i++){k=a[i][0];fa=true;kfor(j=1;j<c_size;j++){if(a[i][j]!=k)fa=false;}if(fa)//有一方的棋子在橫向上連成一條線了{(lán)if(k==1)result=1;//判斷是哪一方的棋子elseresult=2;returntrue;}.}}//endfor//找同一列上有沒有連成一條線的for(j=0;j<c_size;j++){k=a[0][j];fa=true;kfor(i=1;i<c_size;i++){if(a[i][j]!=k)fa=false;}if(fa)//有一方的棋子在橫向上連成一條線了{(lán)if(k==1)result=1;elseresult=2;returntrue;}}}//找斜對角線有沒有連成一條線的k=a[0][0];fa=true;kfor(i=1;i<c_size;i++){if(a[i][i]!=k)fa=false;}if(k==1)result=1;elseresult=2;returntrue;}}j=c_size-1;k=a[0][j];fa=true;kif(a[i][j]!=k)fa=false;}if(k==1)result=1;elseresult=2;returntrue;}.}//假設(shè)經(jīng)過上面的查找,沒有一方獲勝,則查找是否還能輸入棋子則返回false,游戲繼續(xù)//假設(shè)不能繼續(xù)輸入棋子,則游戲完畢,雙方達(dá)成平手for(i=0;i<c_size;i++){for(j=0;j<c_size;j++){if(a[i][j]==0)returnfalse;}}result=3;returntrue;}//初級玩法,電腦選擇下一步的做法是按從上到下從左到右選擇第一個空的棋格privateintchoosene*t0(){inti,j,c=0;for(i=0;i<c_size;i++){for(j=0;j<c_size;j++){if(a[i][j]==0){c=10*i+j;returnc;}}}return0;}//用阿爾發(fā)-貝他算法,向前看兩部privateintchoosene*t1(){h價值評估函數(shù)inti,j,ma*_i,ma*_j,h;intminus,plus;minus=200;ma*_i=0;ma*_j=0;for(i=0;i<c_size;i++){for(j=0;j<c_size;j++){if(a[i][j]==0){ma*_i=i;ma*_j=j;a[i][j]=2;if(isWinornot())步{//選擇第一個空的棋格//如果這一步可以導(dǎo)致電腦贏,則就返回這一.if(result==2){a[i][j]=0;return10*ma*_i+ma*_j;}}i=c_size;////為了跳出循環(huán)j=c_size;}}}/////找到第一步///從第一個分支中找出價值函數(shù)最小的for(i=0;i<c_size;i++){//試探出所有的分支分別求他們的評估函數(shù)for(j=0;j<c_size;j++){//求當(dāng)前棋局的價值評估函數(shù)if(a[i][j]==0){a[i][j]=1;h=evaluate();ifhminus{minus=h;}a[i][j]=0;}//一個有效分支}}plus=minus;a[ma*_i][ma*_j]=0;i=ma*_i;//再查找其他的分支//因為第一個找到的棋格無需再判斷,將剩余的棋格分成兩局部//第ma*_i行之后的棋格for(j=ma*_j+1;j<c_size;j++){if(a[i][j]==0){minus=200;a[i][j]=2;if(isWinornot()){if(result==2){a[i][j]=0;return10*i+j;}}for(p=0;p<c_size;p++){for(q=0;q<c_size;q++){if(a[p][q]==0){.a[p][q]=1;h=evaluate();a[p][q]=0;if(h<=plus){//剪枝,剩下子節(jié)點無需再判斷minus=h;q=c_size;p=c_size;//跳出兩重循環(huán)}if(h<minus)minus=h;}}}}//二層節(jié)點if(minus>plus&&minus!=200){////plus值增加,更好的走法plus=minus;ma*_i=i;ma*_j=j;}a[i][j]=0;/endif}for(i++;i<c_size;i++){for(j=0;j<c_size;j++){if(a[i][j]==0){minus=200;a[i][j]=2;if(isWinornot()){if(result==2){a[i][j]=0;return10*i+j;}}for(p=0;p<c_size;p++){for(q=0;q<c_size;q++){if(a[p][q]==0){a[p][q]=1;h=evaluate();a[p][q]=0;if(h<=plus){minus=h;q=c_size;p=c_size;}//剪枝//跳出兩重循環(huán).if(h<minus)minus=h;}}}}//二層節(jié)點if(minus>plus&&minus!=200){plus=minus;ma*_i=i;ma*_j=j;}a[i][j]=0;di}//endfor}//endforreturn10*ma*_i+ma*_j;}privateintchoosene*t2(){//運用向前看兩步算法來向前看四步,根本思想與向前看兩步的差不多jintma*_i,ma*_j;intplus,minus,h_temp;minus=200;ma*_i=0;ma*_j=0;//假設(shè)有輸入一個棋子便能成線的便則返回該位置的信息for(i=0;i<c_size;i++){for(j=0;j<c_size;j++){if(a[i][j]==0){a[i][j]=2;ma*_i=i;ma*_j=j;if(isWinornot()){if(result==2){a[i][j]=0;return10*i+j;}}zej=c_size;}}.}for(i=0;i<c_size;i++){for(j=0;j<c_size;j++){if(a[i][j]==0){a[i][j]=1;if(isWinornot()){////假設(shè)棋局已經(jīng)完畢,則直接調(diào)用價值評估h_temp=evaluate();}elseh_temp=newchoosene*t1();if(h_temp<minus)minus=h_temp;//找最小的分支a[i][j]=0;}}}plus=minus;a[ma*_i][ma*_j]=0;i=ma*_i;//同樣分成兩局部查找其他分支for(j=ma*_j+1;j<c_size;j++){if(a[i][j]==0){a[i][j]=2;minus=200;if(isWinornot()){if(result==2){a[i][j]=0;return10*i+j;}}for(p=0;p<c_size;p++){for(q=0;q<c_size;q++){if(a[p][q]==0){a[p][q]=1;if(isWinornot()){h_temp=evaluate();//直接計算價值評估}h_temp=newchoosene*t1();a[p][q]=0;if(h_temp<=plus){p=c_size;q=c_size;.minus=h_temp;}if(h_temp<minus)minus=h_temp;}}}}if(minus>plus&&minus!=200){plus=minus;ma*_i=i;///更優(yōu)的位置ma*_j=j;}a[i][j]=0;/endif}for(i++;i<c_size;i++){for(j=0;j<c_size;j++){if(a[i][j]==0){a[i][j]=2;minus=200;if(isWinornot()){if(result==2){a[i][j]=0;return10*i+j;}}for(p=0;p<c_size;p++){for(q=0;q<c_size;q++){if(a[p][q]==0){a[p][q]=1;if(isWinornot()){h_temp=evaluate();//直接計算價值評估}h_temp=newchoosene*t1();a[p][q]=0;if(h_temp<=plus){p=c_size;q=c_size;minus=h_temp;}.if(h_temp<minus)minus=h_temp;}}}}if(minus>plus&&minus!=200){plus=minus;ma*_i=i;ma*_j=j;}a[i][j]=0;/endif}//endfor}//endforreturn10*ma*_i+ma*_j;}//改良choosene*t1()算法,返回最優(yōu)選擇下的棋局的價值估計函數(shù)值privateintnewchoosene*t1(){inti,j,ma*_i,ma*_j,h;intminus,plus;minus=200;ma*_i=0;ma*_j=0;for(i=0;i<c_size;i++){for(j=0;j<c_size;j++){if(a[i][j]==0){ma*_i=i;ma*_j=j;a[i][j]=2;if(isWinornot()){a[i][j]=0;h=evaluate();returnh;////棋局已經(jīng)完畢,返回當(dāng)前棋局的價值評估值}i=c_size;////為了跳出循環(huán)j=c_size;}}}/////找到第一步///從第一個分支中找出最小的for(i=0;i<c_size;i++){for(j=0;j<c_size;j++){//試探出所有的分支分別求他們的評估函數(shù).//求當(dāng)前棋局的價值評估函數(shù)if(a[i][j]==0){a[i][j]=1;h=evaluate();ifhminus{minus=h;}a[i][j]=0;}//一個有效分支}}plus=minus;a[ma*_i][ma*_j]=0;i=ma*_i;for(j=ma*_j+1;j<c_size;j++){if(a[i][j]==0){minus=200;a[i][j]=2;if(isWinornot()){if(result==2){a[i][j]=0;return10*i+j;}}for(p=0;p<c_size;p++){for(q=0;q<c_size;q++){if(a[p][q]==0){a[p][q]=1;h=evaluate();a[p][q]=0;ifh=plus){minus=h;q=c_size;p=c_size;//跳出兩重循環(huán)}if(h<minus)minus=h;}}}}//二層節(jié)點if(minus>plus&&minus!=200){plus=minus;ma*_i=i;.ma*_j=j;}a[i][j]=0;/endif}for(i++;i<c_size;i++){for(j=0;j<c_size;j++){if(a[i][j]==0){minus=200;a[i][j]=2;if(isWinornot()){if(result==2){a[i][j]=0;return10*i+j;}}for(p=0;p<c_size;p++){for(q=0;q<c_size;q++){if(a[p][q]==0){a[p][q]=1;h=evaluate();a[p][q]=0;ifh=plus){minus=h;q=c_size;p=c_size;//跳出兩重循環(huán)}if(h<minus)minus=h;}}}}//二層節(jié)點if(minus>plus&&minus!=200){plus=minus;ma*_i=i;ma*_j=j;}a[i][j]=0;di}//endfor}//endforreturnpluschoosenet在于返回值的不同}.//價值評估函數(shù)//定義:假設(shè)格局對任何一方都不是獲勝的,則h等于所有的空格放上電腦的棋子之后三子成一線的總數(shù)//減去所有空格放

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論