java五子棋在线对战,java五子棋网络对战
本文分享java实现五子棋大战的具体代码,供大家参考。具体内容如下
这是我将近一年前的项目。之前没有养成写博客的习惯,打算把之前的项目陆续补上。
00-1010的主要功能有棋子选色、棋悔、重新开始、玩家对战、人机对战。效果图如图所示:
模式选择:
国际象棋选择:
人机大战:
玩家对玩家:
00-1010五子棋的开发首先需要在界面上画表。因为类七是常量,棋子大小也是常量,所以我们可以先自定义一个接口来设置项目中的常量,这样更改这些参数就比较方便了。CS.java电码如下:
公共接口CS { public static final int x0=60//棋盘公共静态final int y0=70的起始位置;公共静态最终int line=15//棋盘上有多少条线?公共静态final int size=40//象棋大小}类似于上一篇博客中的画板。首先,你需要一个界面。这里可以定义一个象棋类来继承Jframe,然后重写paint(Graphics g)方法来绘制棋盘。Chess.java电码如下:
Chess.java:
公共类Chess扩展JFrame实现CS { int I=2;私有qizi qizilarry 2[][]=新qizi[line][line];//使用一个qizi类型的二维数组存储棋子private JButton b=new JButton(后悔棋);Private JButton b2=new JButton(重新开始);Private JLabel jLabel=new JLabel(请选择战斗模式);Private JLabel jLabel2=new JLabel(请选择棋子的颜色);private int值;//提示框选项的值是private int value2Dimension维度=新维度(100,30);String []={ 白棋,黑棋 };String moshi[]={ 玩家vs . ,人机vs . };public void chesui(){ b . setpreferredsize(dimension);B2 . setpreferredsize(dimension);this.setSize(700,700);this . set layout(new flow layout());This.setTitle(五子棋);this . setlocationrelativeto(null);this . setdefaultcloseoperation(3);this . set visible(true);this . add(b);this . add(B2);Value=JoOptionPane。ShowOptionDialog (this,Jlabel, hint ,JoOptionPane。OK _ cancel _ option。Question _ message,null,moshi,null);value=jooptionpane . showoptiondialog(this,jlabel2, hint ,jooptionpane.ok _ cancel _ option,jooptionpane.question _ message,null,color,null);//关闭提示框退出程序if (value==jooptionpane。closed _ option value 2==jooptionpane。closed _ option){ system . exit(1);} Graphics g=this . get Graphics();mous listener mous listener=new mous listener(g,qizilarry2,this,value,value 2);这. a
ddMouseListener(mouslistener);//窗口添加监听 b.addActionListener(mouslistener);//按钮添加监听 b2.addActionListener(mouslistener); } public void paint(Graphics g) {//重绘棋盘和棋子 super.paint(g); drawChess(g); drawQZ(); } //画一个棋盘 public void drawChess(Graphics g) { g.setColor(Color.black); for(int i=0;i<line;i++) { g.drawLine(x0, y0+size*i, x0+(line-1)*size, y0+size*i); } for(int j=0;j<line;j++) { g.drawLine(x0+size*j, y0, x0+size*j, y0+(line-1)*size); } } //重构画棋子 public void drawQZ() { for(int ix=0;ix<line;ix++) { for(int iy=0;iy<line;iy++) { if(qizilarry2[ix][iy]!=null) { qizi qizi21=qizilarry2[ix][iy]; qizi21.drawq(); } } } } public static void main(String[] args) { new Chess().chessUI(); }}用qizi类型的二维数组来存储棋子,在重绘时重绘整个棋盘和二维数组上的棋子,如果二维数组为null则不用重绘。接下来该创建监听类了,在鼠标点击棋盘时,要使得棋子在棋盘的正中央,代码如下:
//x轴坐标 for(ix=0;x1>0;ix++) { x1-=size;}x1+=size;x1-=size/2;ix--;if(x1<=0) { x=x0+ix*size;}else x=x0+(++ix)*size;//y轴坐标for(iy=0;y1>0;iy++) { y1-=size;}y1+=size;y1-=size/2;iy--;if(y1<=0) { y=y0+iy*size;}else y=y0+(++iy)*size;
判赢的方法非常简单,只要计算棋子在它八个方向的相邻的且颜色相同的棋子个数即可,这里只展现向左查找棋子的代码(后续会附上整个监听类的代码):
public int zuo(int x,int y,Color c) {//向左找 int a=x; for(int i=1;i<5;i++) { a--; if(a<0qizilarry[a][y]==null) { break; }else if(qizilarry[a][y].getColor()==c) count1++; else break; } return count1; }
当模式为玩家和玩家模式时,需要每下一个棋子颜色改变,实现的代码如下:
if(a) { color =c; a=false; }else { color=c2; a=true; } g.setColor(color); g.fillOval(x-size/2, y-size/2, size, size); prex=ix; prey=iy; qizi qizi=new qizi(g, color,ix,iy); qizilarry[ix][iy]=qizi; inte++;
玩家VS玩家和玩家VS电脑的判赢方法基本类似,这里只展现了玩家与玩家的判赢方法,即每下一个新的棋子,就计算这个棋子八个方向上相同且相邻棋子的个数,当同一直线两个方向的棋子个数之和为5时,则获取棋子颜色,判定为获胜,具体代码实现如下:
//判断输赢if(zuo(ix,iy,color)+you(ix,iy,color)>=4shang(ix,iy,color)+xia(ix,iy,color)>=4 zuoshang(ix, iy,color)+youxia(ix, iy,color)>=4zuoxia(ix, iy,color)+youshang(ix, iy,color)>=4) { JLabel jLabel =new JLabel("白棋获胜!"); JLabel jlabel2 =new JLabel("黑棋获胜!"); if(color==Color.white) JOptionPane.showMessageDialog(jFrame, jLabel, "游戏结束", JOptionPane.PLAIN_MESSAGE); else JOptionPane.showMessageDialog(jFrame, jlabel2, "游戏结束", JOptionPane.PLAIN_MESSAGE); }else { count1=0;//如果没有赢重新置0重新计算 count2=0; countS=0; countX=0; countZS=0; countZX=0; countYS=0; countYX=0; }
这样玩家与玩家模式的大体功能就基本实现了,接下类就要实现五子棋的AI功能了
五子棋AI
这里我们主要针权值法讨论下,大致思路如下:
1.我们绘制好一个棋盘后,大小为 15*15;2.下棋之前,对于棋盘中的每个空位,我们每都替电脑人掂一掂下在哪里合算;(估权过程)3.对每个空位按照规则都计算完权重,我们找出权重最大的位置,此位置就是npc落子位置。
空子位置我们用 0 表示,白子用2表示,黑子用1表示;我们主要分为以下几种情况:
定义 棋子相连情况 权值活一连 010、020 40活二连 0110、0220 400活三连 01110、02220 3000活四连 011110、022220 10000眠一连 012、021 20眠二连 0112、0221 200眠三连 01112、02221 500眠四连 011112、022221 3000用hash表存储所有可能的情况并赋予一定的权值,每下一个棋子便更新棋盘上所有空位置的权值,电脑再寻找棋盘上权值最大的点下棋,computerChess()函数代码如下:
public void computerChess() { hashMap.put("10000", 15);//眠1连 hashMap.put("20000", 10);//眠1连 hashMap.put("20100",17);//眠1连,15 hashMap.put("10200",12);//眠1连,10 hashMap.put("21000",15);//眠1连,15 hashMap.put("12000",10);//眠1连,10 hashMap.put("20010",19);//眠1连,15 hashMap.put("10020",14);//眠1连,10 hashMap.put("20100",17);//眠1连,15 hashMap.put("10200",12);//眠1连,10// // hashMap.put("00010",21);//活1连,15// hashMap.put("00020",16);//活1连,10// hashMap.put("00100",19);//活1连,15// hashMap.put("00200",14);//活1连,10// hashMap.put("01000",17);//活1连,15// hashMap.put("02000",12);//活1连,10// //被堵住 hashMap.put("10100",65);//眠2连,40 hashMap.put("20200",60);//眠2连,30 hashMap.put("01100",65);//眠2连,40 hashMap.put("02200",60);//眠2连,30 hashMap.put("11000",65);//眠2连,40 hashMap.put("22000",60);//眠2连,30 hashMap.put("21010",65);//眠2连,40 hashMap.put("12020",60);//眠2连,30 hashMap.put("20110",65);//眠2连,40 hashMap.put("10220",60);//眠2连,30 hashMap.put("21100",65);//眠2连,40 hashMap.put("12200",60);//眠2连,30 // hashMap.put("01010",75);//活2连,40// hashMap.put("02020",70);//活2连,30// hashMap.put("00110",75);//活2连,40// hashMap.put("00220",70);//活2连,30// hashMap.put("01100",75);//活2连,40// hashMap.put("02200",70);//活2连,30// hashMap.put("11000",75);//活2连,40// hashMap.put("00022",70);//活2连,30// // //被堵住 hashMap.put("11100",150);//眠3连,100 hashMap.put("22200",140);//眠3连,80 hashMap.put("21110",150);//眠3连,100 hashMap.put("12220",140);//眠3连,80// // hashMap.put("10110",1000);//活3连,130// hashMap.put("20220",800);//活3连,110// hashMap.put("11010",1000);//活3连,130// hashMap.put("22020",800);//活3连,110// hashMap.put("01110", 1000);//活3连// hashMap.put("02220", 800);//活3连 hashMap.put("11110",3000);//4连,300 hashMap.put("11112",3000);//4连,300 hashMap.put("22220",3500);//4连,280 hashMap.put("22221",3500);//4连,280 int a; int b; for(int y=0;y<line;y++) { for(int x=0;x<line;x++) { if(qizilarry[x][y]==null) { //向左 a=x; for(int i=1;i<6;i++) { a--; if(a<0) break; if(qizilarry[a][y]!=null) { if(qizilarry[a][y].getColor()==c) { zuo+=2; }else zuo+=1; }else zuo+=0; } Integer integer=hashMap.get(zuo); if(integer!=null) chessValue[x][y]+=integer; //向右 a=x; for(int i=1;i<6;i++) { a++; if(a==line) break; if(qizilarry[a][y]!=null) { if(qizilarry[a][y].getColor()==c) { you+=2; }else you+=1; }else you+=0; } integer=hashMap.get(you); if(integer!=null) chessValue[x][y]+=integer; //向上 &a
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。