联机五子棋(多机匹配服务器)—JavaFx

目录

关键字:五子棋、双人、Socket联机、多线程、属性绑定、动画。

详细设计 

系统分析与模块化设计

服务端:

   实现多机匹配,支持断线重开,转发ip,构建连接。

挥鞭动画

画棋盘动画

 

请自行生成exe文件

素材及源码:https://pan.baidu.com/s/1AhB2ZGMhwz9kP3843WqoTA 

提取码:o76j 

字体为博洋字体


 

关键字:五子棋、双人、Socket联机、多线程、属性绑定、动画。

 

详细设计 

布局:对于五子棋进行抽象,五子棋由棋盘(Pane)和棋子(ImageView)构成,有按钮(Button),还有转场卷轴(ImageView)

聊天框(ScrollPane { Vbox { Vbox { FlowPane { Text... }}, HBox {TextFiled,btSend}}})

功能:

1、播放等待动画——playWaitting

2、棋盘绘画动画——drawBoard

3、下棋函数——downPiece(int x,int y,int key)

4、播放转场动画——playTurn

5、播放拒绝悔棋动画——playBackNo

6、播放游戏结束动画——playOver

7、播放悔棋选择动画——playChooseBack

8、播放认输动画——playGiveUp

9、清除棋盘数据——clear

10、加载聊天框——loadChatting

11、加载时钟——loadClock

12、发送信息——putMessage(String id,String message)

13、悔棋——back

14、输赢判断——judge

15、单向棋子探测——search

运行效果图:

联机五子棋(多机匹配服务器)—JavaFx_第1张图片

联机五子棋(多机匹配服务器)—JavaFx_第2张图片

联机五子棋(多机匹配服务器)—JavaFx_第3张图片

联机五子棋(多机匹配服务器)—JavaFx_第4张图片

联机五子棋(多机匹配服务器)—JavaFx_第5张图片

联机五子棋(多机匹配服务器)—JavaFx_第6张图片

系统分析与模块化设计

  1. 等待时播放文字挥鞭动画,
  2. 可以发送悔棋、认输请求。
  3. 开局绘画棋盘
  4. 转场播放动画
  5. 聊天框
  6. 时钟计时

联机五子棋(多机匹配服务器)—JavaFx_第7张图片

               系统模块图

 

服务端:

   实现多机匹配,支持断线重开,转发ip,构建连接。

 

 

挥鞭动画

 

联机五子棋(多机匹配服务器)—JavaFx_第8张图片

   public void playWaitting(){
        Text[] texts={new Text("你"),new Text("的"),new Text("对"),new Text("手"),new Text("正"),new Text("在"),
new Text("赶"),new Text("路"),new Text("中"),new Text("。"),new Text("。"),new Text("。")};
        getChildren().addAll(texts);
        for(int i=0;i{
            int clock=0;
            while (!start){
                for(int i=0;i texts[a].setLayoutY(300+40*Math.sin((Math.PI/4)*(a+c))));
                }
                clock++;
                try {
                    Thread.sleep(50);
                }catch (Exception e){}
            }
            Platform.runLater(()->getChildren().removeAll(texts));
        }).start();
    }

原理:每休眠50ms,计时器加1,计时器每8个单位为一个正弦周期,取4每个周期(32clock)的第一个周期[0,8],进行一次文字波动,做出这个效果。

画棋盘动画

  当客户端被打开之后,立即发送start(同时包含一个随机数{0,1},用于区分棋子颜色(先手后手))请求给服务端。然后双方同时播放棋盘绘制动画

运行效果:

联机五子棋(多机匹配服务器)—JavaFx_第9张图片

线类:

class MyLine extends Line{
    SimpleIntegerProperty length=new SimpleIntegerProperty(0);
    char key;
    public MyLine(int num,char key){
        super(20,20,20,20);
        this.key=key;
        if(key=='x'){   //横线
            endXProperty().bind(length.add(20));   //绑定线的长度。
            setStartY(20+num*40);
            setEndY(20+num*40);
        }
        else{     //竖线
            endYProperty().bind(length.add(20));
            setStartX(20+num*40);
            setEndX(20+num*40);
        }
        if(num==0||num==14)
            setStrokeWidth(3);

    }
    public boolean lengthen(){
        if (length.getValue()<560){
            length.setValue(length.getValue()+2);
            return true;
        }
        return false;
    }
}

绘画 

public void drawBoard(int rate) {     //画棋盘
    clock=0;
    MyLine xLine[]=new MyLine[15],yLine[]=new MyLine[15];
    for(int i=0;i<15;i++){
        xLine[i]=new MyLine(i,'x');yLine[i]=new MyLine(i,'y');
        getChildren().addAll(xLine[i],yLine[i]);
    }
    Circle point[][]=new Circle[3][3];
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            point[i][j]=new Circle(140+160*i,140+160*j,0);
            getChildren().add(point[i][j]);
        }
    }
    draw=new Thread(()->{
        isPlay=true;
        try{
            Thread.sleep(50);
        }catch (Exception ex){}
        while (xLine[14].length.getValue()<560){
            clock++;
            Platform.runLater(()->{
                for(int i=0;i<=7&&i{
                logo.setOpacity(((double) clock)/end);
                chatting.setOpacity(((double) clock)/end);
                Time.setOpacity(((double) clock)/end);
                for(int i=0;i<3;i++)
                    for(int j=0;j<3;j++)
                        point[i][j].setRadius((double)(clock*4)/end);
            });
            clock++;
            try{
                Thread.sleep(1);
            }catch (Exception ex){}
        }
        Platform.runLater(()->getChildren().addAll(btBack,btGiveUp));
        isPlay=false;
        if(myPiece==1)
            playTurn();
        time.start();
    });
    draw.start();
}

 

请自行生成exe文件

素材及源码:https://pan.baidu.com/s/1hxg8GyY0JlgO-09f9DsDvQ 

提取码:85ci 

 

字体为博洋字体

你可能感兴趣的:(JavaFx)