目录
关键字:五子棋、双人、Socket联机、多线程、属性绑定、动画。
详细设计
系统分析与模块化设计
服务端:
实现多机匹配,支持断线重开,转发ip,构建连接。
挥鞭动画
画棋盘动画
请自行生成exe文件
素材及源码:https://pan.baidu.com/s/1AhB2ZGMhwz9kP3843WqoTA
提取码:o76j
字体为博洋字体
布局:对于五子棋进行抽象,五子棋由棋盘(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
运行效果图:
系统模块图
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},用于区分棋子颜色(先手后手))请求给服务端。然后双方同时播放棋盘绘制动画
运行效果:
线类:
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();
}