java五子棋在线对战,java五子棋网络对战

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: