一、团队介绍

连正(队长) | 棋盘的实现,棋子的行动,界面的设计等
王浩天 | 棋局规则(各子的行动限制),网络对战

二、项目gitee地址

https://gitee.com/immutablelupo/china-chess

三、项目流程图

四、面向对象设计图

1.实现两方兵的行走规则。


2.初始化棋盘,其他棋子的行走规则,棋子的选取等。

3.棋子的坐标。棋子的初始落位。

4.两个客户端之间的信息处理。

五、项目关键代码

兵的移动:一次只能移动一格,判断并是否在敌方半场来确定可移动的方向

public static List<Integer[]> bingMove(Chess chess ){int i = chess.getI();int j = chess.getJ();if(chesses[j][i] != chess){System.out.println("exp");}List<Integer[]> list = new ArrayList<>();if(Main.colorR.equals(chess.getColor())){if(j<5){if(j>0){if(chesses[j-1][i] ==null){Integer[] integers = {i,j-1};list.add(integers);}else{if(!chesses[j-1][i].getColor().equals(chess.getColor())){Integer[] integers = {i,j-1};list.add(integers);}}}if(i>0){if(chesses[j][i-1] ==null){Integer[] integers = {i-1,j};list.add(integers);}else{if(!chesses[j][i-1].getColor().equals(chess.getColor())){Integer[] integers = {i-1,j};list.add(integers);}}}if(i<9){if(chesses[j][i+1] ==null){Integer[] integers = {i+1,j};list.add(integers);}else{if(!chesses[j][i+1].getColor().equals(chess.getColor())){Integer[] integers = {i+1,j};list.add(integers);}}}}}return list;}

整个棋盘的实现

public static  void drawPlace(GraphicsContext gc) {gc.setLineWidth(3);gc.strokeLine(girdW / 3, girdH / 3, girdW / 3, canvasH - girdH / 3);gc.strokeLine(girdW / 3 * 2 + girdW * 8, girdH / 3, girdW / 3 * 2 + girdW * 8, canvasH - girdH / 3);gc.strokeLine(girdW / 3, girdH / 3 + girdH * 0, canvasW - girdW / 3, girdH / 3 + girdH * 0);gc.strokeLine(girdW / 3, girdH / 3 * 2 + girdH * 9, canvasW - girdW / 3, girdH / 3 * 2 + girdH * 9);gc.setLineWidth(1);//竖线for (int i = 0; i < 9; i++) {//河界要断开if (i == 0 || i == 8) {gc.strokeLine(girdW / 2 + girdW * i, girdH / 2, girdW / 2 + girdW * i, canvasH - girdH / 2);} else {gc.strokeLine(girdW / 2 + girdW * i, girdH / 2, girdW / 2 + girdW * i, canvasH - girdH / 2 - girdH * 5);gc.strokeLine(girdW / 2 + girdW * i, canvasH - girdH / 2 - girdH * 4, girdW / 2 + girdW * i, canvasH - girdH / 2);}}//横线for (int i = 0; i < 10; i++) {gc.strokeLine(girdW / 2, girdH / 2 + girdH * i, canvasW - girdW / 2, girdH / 2 + girdH * i);}gc.setTextAlign(TextAlignment.CENTER);gc.setFont(new Font(fontName, fontSize));gc.fillText("楚河              ", girdW / 2 + girdW * 3, canvasH - girdH * 5 + fontSize / 3);//画帅的xgc.strokeLine(girdW / 2 + girdW * 3, girdH / 2, girdW / 2 + girdW * 5, girdH / 2 + girdH * 2);gc.strokeLine(girdW / 2 + girdW * 3, girdH / 2 + girdH * 2, girdW / 2 + girdW * 5, girdH / 2);//画将xgc.strokeLine(girdW / 2 + girdW * 3, canvasH - girdH / 2, girdW / 2 + girdW * 5, canvasH - girdH / 2 - girdH * 2);gc.strokeLine(girdW / 2 + girdW * 3, canvasH - girdH / 2 - girdH * 2, girdW / 2 + girdW * 5, canvasH - girdH / 2);//画炮的标gc.strokeLine(girdW / 2 + girdW / 3 * 2, girdH / 2 + girdH * 2 - girdH / 10, girdW / 2 + girdW - girdW / 10, girdH / 2 + girdH * 2 - girdH / 10);gc.strokeLine(girdW / 2 + girdW / 3 * 2, girdH / 2 + girdH * 2 + girdH / 10, girdW / 2 + girdW - girdW / 10, girdH / 2 + girdH * 2 + girdH / 10);gc.strokeLine(girdW / 2 + girdW + girdW / 10, girdH / 2 + girdH * 2 - girdH / 10, girdW / 2 + girdW * 1 + girdW / 3, girdH / 2 + girdH * 2 - girdH / 10);gc.strokeLine(girdW / 2 + girdW + girdW / 10, girdH / 2 + girdH * 2 + girdH / 10, girdW / 2 + girdW * 1 + girdW / 3, girdH / 2 + girdH * 2 + girdH / 10);gc.strokeLine(girdW / 2 + girdW / 3 * 2, girdH / 2 + girdH * 7 - girdH / 10, girdW / 2 + girdW - girdW / 10, girdH / 2 + girdH * 7 - girdH / 10);gc.strokeLine(girdW / 2 + girdW / 3 * 2, girdH / 2 + girdH * 7 + girdH / 10, girdW / 2 + girdW - girdW / 10, girdH / 2 + girdH * 7 + girdH / 10);gc.strokeLine(girdW / 2 + girdW + girdW / 10, girdH / 2 + girdH * 7 - girdH / 10, girdW / 2 + girdW * 1 + girdW / 3, girdH / 2 + girdH * 7 - girdH / 10);gc.strokeLine(girdW / 2 + girdW + girdW / 10, girdH / 2 + girdH * 7 + girdH / 10, girdW / 2 + girdW * 1 + girdW / 3, girdH / 2 + girdH * 7 + girdH / 10);gc.strokeLine(girdW / 2 + girdW / 3 * 2 + girdW * 6, girdH / 2 + girdH * 2 - girdH / 10, girdW / 2 + girdW - girdW / 10 + girdW * 6, girdH / 2 + girdH * 2 - girdH / 10);gc.strokeLine(girdW / 2 + girdW / 3 * 2 + girdW * 6, girdH / 2 + girdH * 2 + girdH / 10, girdW / 2 + girdW - girdW / 10 + girdW * 6, girdH / 2 + girdH * 2 + girdH / 10);gc.strokeLine(girdW / 2 + girdW + girdW / 10 + girdW * 6, girdH / 2 + girdH * 2 - girdH / 10, girdW / 2 + girdW * 1 + girdW / 3 + girdW * 6, girdH / 2 + girdH * 2 - girdH / 10);gc.strokeLine(girdW / 2 + girdW + girdW / 10 + girdW * 6, girdH / 2 + girdH * 2 + girdH / 10, girdW / 2 + girdW * 1 + girdW / 3 + girdW * 6, girdH / 2 + girdH * 2 + girdH / 10);gc.strokeLine(girdW / 2 + girdW / 3 * 2 + girdW * 6, girdH / 2 + girdH * 7 - girdH / 10, girdW / 2 + girdW - girdW / 10 + girdW * 6, girdH / 2 + girdH * 7 - girdH / 10);gc.strokeLine(girdW / 2 + girdW / 3 * 2 + girdW * 6, girdH / 2 + girdH * 7 + girdH / 10, girdW / 2 + girdW - girdW / 10 + girdW * 6, girdH / 2 + girdH * 7 + girdH / 10);gc.strokeLine(girdW / 2 + girdW + girdW / 10 + girdW * 6, girdH / 2 + girdH * 7 - girdH / 10, girdW / 2 + girdW * 1 + girdW / 3 + girdW * 6, girdH / 2 + girdH * 7 - girdH / 10);gc.strokeLine(girdW / 2 + girdW + girdW / 10 + girdW * 6, girdH / 2 + girdH * 7 + girdH / 10, girdW / 2 + girdW * 1 + girdW / 3 + girdW * 6, girdH / 2 + girdH * 7 + girdH / 10);gc.strokeLine(girdW / 2 + girdW * 1 - girdW / 10, girdH / 2 + girdH * 1 + girdH / 3 * 2, girdW / 2 + girdW * 1 - girdW / 10, girdH / 2 + girdH * 2 - girdH / 10);gc.strokeLine(girdW / 2 + girdW * 1 - girdW / 10, girdH / 2 + girdH * 2 + girdH / 10, girdW / 2 + girdW * 1 - girdW / 10, girdH / 2 + girdH * 2 + girdH / 3);gc.strokeLine(girdW / 2 + girdW * 1 + girdW / 10, girdH / 2 + girdH * 1 + girdH / 3 * 2, girdW / 2 + girdW * 1 + girdW / 10, girdH / 2 + girdH * 2 - girdH / 10);gc.strokeLine(girdW / 2 + girdW * 1 + girdW / 10, girdH / 2 + girdH * 2 + girdH / 10, girdW / 2 + girdW * 1 + girdW / 10, girdH / 2 + girdH * 2 + girdH / 3);gc.strokeLine(girdW / 2 + girdW * 1 - girdW / 10, girdH / 2 + girdH * 6 + girdH / 3 * 2, girdW / 2 + girdW * 1 - girdW / 10, girdH / 2 + girdH * 7 - girdH / 10);gc.strokeLine(girdW / 2 + girdW * 1 - girdW / 10, girdH / 2 + girdH * 7 + girdH / 10, girdW / 2 + girdW * 1 - girdW / 10, girdH / 2 + girdH * 7 + girdH / 3);gc.strokeLine(girdW / 2 + girdW * 1 + girdW / 10, girdH / 2 + girdH * 6 + girdH / 3 * 2, girdW / 2 + girdW * 1 + girdW / 10, girdH / 2 + girdH * 7 - girdH / 10);gc.strokeLine(girdW / 2 + girdW * 1 + girdW / 10, girdH / 2 + girdH * 7 + girdH / 10, girdW / 2 + girdW * 1 + girdW / 10, girdH / 2 + girdH * 7 + girdH / 3);gc.strokeLine(girdW / 2 + girdW * 7 - girdW / 10, girdH / 2 + girdH * 1 + girdH / 3 * 2, girdW / 2 + girdW * 7 - girdW / 10, girdH / 2 + girdH * 2 - girdH / 10);gc.strokeLine(girdW / 2 + girdW * 7 - girdW / 10, girdH / 2 + girdH * 2 + girdH / 10, girdW / 2 + girdW * 7 - girdW / 10, girdH / 2 + girdH * 2 + girdH / 3);gc.strokeLine(girdW / 2 + girdW * 7 + girdW / 10, girdH / 2 + girdH * 1 + girdH / 3 * 2, girdW / 2 + girdW * 7 + girdW / 10, girdH / 2 + girdH * 2 - girdH / 10);gc.strokeLine(girdW / 2 + girdW * 7 + girdW / 10, girdH / 2 + girdH * 2 + girdH / 10, girdW / 2 + girdW * 7 + girdW / 10, girdH / 2 + girdH * 2 + girdH / 3);gc.strokeLine(girdW / 2 + girdW * 7 - girdW / 10, girdH / 2 + girdH * 6 + girdH / 3 * 2, girdW / 2 + girdW * 7 - girdW / 10, girdH / 2 + girdH * 7 - girdH / 10);gc.strokeLine(girdW / 2 + girdW * 7 - girdW / 10, girdH / 2 + girdH * 7 + girdH / 10, girdW / 2 + girdW * 7 - girdW / 10, girdH / 2 + girdH * 7 + girdH / 3);gc.strokeLine(girdW / 2 + girdW * 7 + girdW / 10, girdH / 2 + girdH * 6 + girdH / 3 * 2, girdW / 2 + girdW * 7 + girdW / 10, girdH / 2 + girdH * 7 - girdH / 10);gc.strokeLine(girdW / 2 + girdW * 7 + girdW / 10, girdH / 2 + girdH * 7 + girdH / 10, girdW / 2 + girdW * 7 + girdW / 10, girdH / 2 + girdH * 7 + girdH / 3);}

棋子移动时触发的“吃”,和胜利的判定

 public void PlayChess(int i,int j, GraphicsContext gc){Chess chess = CanvasUtils.clickChess(i*girdW,j*girdH);if(chess != null){if(selectChess == null ){if(chess.getColor().equals("R")&&roundchange==0||chess.getColor().equals("B")&&roundchange==1){{if(roundchange==0){roundchange = roundchange + 1;}else if(roundchange==1){roundchange = roundchange - 1;}System.out.println(roundchange);CanvasUtils.selectChess(chess, gc);}}}else{CanvasUtils.moveChess(i, j, gc);//吃棋子if(Tool!=null) {if (Tool.chessName.equals("帥") || Tool.chessName.equals("將"))System.out.println("win!");}}}else{CanvasUtils.moveChess(i, j, gc);//移动到没有棋子的地方if(Tool!=null) {if (Tool.chessName.equals("帥") || Tool.chessName.equals("將"))System.out.println("win!");}}}

服务器,读取并转发客户端送来的信息。

public class Server {ServerSocket serverSocket = null;static Map<Integer, Socket> map = new HashMap<Integer, Socket>();public static int i=1;public static int flag3=0;public static BufferedWriter bwa = null;public static BufferedWriter bwb = null;public void socket() throws IOException {try {ServerSocket ss = new ServerSocket(8887);System.out.println("启动服务器....");//客户端1ExecutorService executor= Executors.newFixedThreadPool(1);CompletableFuture<String> future2 = CompletableFuture.supplyAsync(()-> {try {System.out.println("异步启动:");try {while(true) {Socket s1 = ss.accept();InetAddress inetAddress=s1.getInetAddress();System.out.println("客户端:" +"2:"+ s1.getInetAddress().getLocalHost() + "已连接到服务器");flag3++;i++;System.out.println(i);if (s1 != null) {try {while(true) {// 3.获取socket通道的输入流(输入流的读取方式为一行一行的读取方式 ----> readLine())// 4.获取通道的输入流(也是一行一行的写出  BufferedWriter ->newLine())// 当用户点击“发送”按钮的时候才会,写出数据BufferedReader br1 = new BufferedReader(new InputStreamReader(s1.getInputStream()));Server.bwb = new BufferedWriter(new OutputStreamWriter(s1.getOutputStream()));if(flag3==2){String line1="双方棋手已就位,请红色方先开始棋局";bwa.write(line1);System.out.println("服务端发送信息:"+line1);bwa.newLine(); // 换行bwa.flush();  //bwb.write(line1);System.out.println("服务端发送信息:"+line1);bwb.newLine(); // 换行bwb.flush();  //}String line = null;while ((line = br1.readLine()) != null) {System.out.println("客户端发送信息:" + line);// 将读取的数据拼接到文本域中显示if (line.contains("#")) {bwa.write(line);System.out.println("服务端发送信息:"+line);bwa.newLine(); // 换行bwa.flush();  //}}System.out.println(line);}} catch(Exception e){e.printStackTrace();}}}} catch (IOException e) {e.printStackTrace();}Thread.sleep(5000);return "finish";} catch (InterruptedException e) {System.err.println("错误!");return "wrong!";}},executor);//客户端2while (true) {Socket s2 = ss.accept();InetAddress inetAddress = s2.getInetAddress();System.out.println("客户端:" + "1:" + s2.getInetAddress().getLocalHost() + "已连接到服务器");flag3++;if (s2 != null) {try {while (true){// 3.获取socket通道的输入流(输入流的读取方式为一行一行的读取方式 ----> readLine())// 4.获取通道的输入流(也是一行一行的写出  BufferedWriter ->newLine())// 当用户点击“发送”按钮的时候才会,写出数据BufferedReader br1 = new BufferedReader(new InputStreamReader(s2.getInputStream()));Server.bwa = new BufferedWriter(new OutputStreamWriter(s2.getOutputStream()));if(flag3==2){String line1="双方棋手已就位,请红色方开始棋局";bwa.write(line1);System.out.println("服务端发送信息:"+line1);bwa.newLine(); // 换行bwa.flush();  //bwb.write(line1);System.out.println("服务端发送信息:"+line1);bwb.newLine(); // 换行bwb.flush();  //}String line = null;while ((line = br1.readLine()) != null) {System.out.println("客户端发送信息:" + line);// 将读取的数据拼接到文本域中显示bwb.write(line);System.out.println("服务端发送信息:"+line);bwb.newLine(); // 换行bwb.flush();  //}System.out.println(line);}} catch (Exception e) {e.printStackTrace();}}}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) throws IOException {new Server().socket();}
}

七、客户端发送信息

public void sendServer(String msg){try {bw1.write(msg);bw1.newLine(); // 换行bw1.flush();  //} catch (IOException e) {e.printStackTrace();}}

八、客户端接收信息

btn.setOnAction(actionEvent -> {ExecutorService executor= Executors.newFixedThreadPool(1);CompletableFuture<String> future2 = CompletableFuture.supplyAsync(()-> {try {try{/*******客户端 TCP协议*********/// 1.创建一个客户端的套接字(尝试连接)Socket socket = new Socket("127.0.0.1",8887);// 2.获取socket通道的输入流BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));bw1 = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));String line = null;while((line = br.readLine()) !=null){textarea.appendText("服务器发送信息:"+line);if(line.contains("#")){String ti=String.valueOf(line.charAt(1));String tj=String.valueOf(line.charAt(2));String ta=String.valueOf(line.charAt(3));String tb=String.valueOf(line.charAt(4));System.out.println(ti+tj+ta+tb);updateChess(Integer.parseInt(ta),Integer.parseInt(tb),Integer.parseInt(ti),Integer.parseInt(tj),gc);textarea.appendText("对方落子:"+line.substring(1,3)+"-->"+line.substring(3,5));stop=0;if(roundchange==1){roundchange = roundchange - 1;}else if(roundchange==0){roundchange=roundchange+1;}}if(line.contains("@")){textarea.appendText(line);}}System.out.println(line);// 3. 获取输出流// 4.关闭流socket.close();/******************************/}catch(Exception e){e.printStackTrace();}Thread.sleep(5000);return "finish";} catch (InterruptedException e) {System.err.println("错误!");return "wrong!";}},executor);});

六、运行截图

单机版的运行

网络对战版

两者连接


七、尚待改进

1.象棋走棋提示不是很完善,登陆系统也没有实现;
2.课设虽然很早已经开始让我们考虑,由于其他学科和考试等原因在计网课设之后才开始,时间太短界面过于简陋。

JAVA面向对象编程程序设计——中国象棋相关推荐

  1. java面向对象编程 漫画_Java面向对象编程(一)

    由于常常将Java和C++面向对象编程的原则搞乱,所以这次把相关要点分别总结一下,本文主要总结Java面向对象编程. 面向对象编程的三大特性是:继承性(inheritance), 多态性(polymo ...

  2. 孙卫琴:我为什么要写《Java面向对象编程》

    孙卫琴:我为什么要写<Java面向对象编程> 特约作者:孙卫琴 策划 & 设计 & 制作:李大微 当<精通Struts>和<精通Hibernate> ...

  3. java面向对象编程基础

    java面向对象编程基础 前言:什么是java 是咖啡飘香的清晨 - 是斯坦福校园意浓情深 - 是James的思想睿智 是剁手党双十一挥舞的利刃 是大数据云计算驰骋的平台 - 是ATM上吐出的钞票 - ...

  4. 5.Java面向对象编程

    文章目录 05 Java面向对象编程 1. 面向过程与面向对象比较 2. 类和对象 2.1 对象的属性和方法 2.2 类的属性和方法 2.3 定义一个类 2.4 创建和使用对象 2.5 对象和类的总结 ...

  5. java象棋游戏用户特点_基于Java Swing的《中国象棋》游戏的设计与实现

    60 开发经验 3基金项目: 江西省自然科学基金资助项目(编号: 0411046); 江西省高性能计算技术重点实验室资助基金项目(No. JXHC20052003) ). 基于 Java Swing ...

  6. 能听懂的Java面向对象编程-雷伟-专题视频课程

    能听懂的Java面向对象编程-2605人已学习 课程介绍         通过本课程的学习,学生能掌握面向对象的程序设计思想,并能运用Java技术和相关开发工具进行计算机软件代码的设计. 课程内容并非 ...

  7. java面向对象编程知识点总结

    一:今天完成 上午详细了解了java面向对象编程的一些细节,记录如下. 1)类 是一种引用类型,包含一个签名和一个主体,主体是放在花括号里面的成员,成员包括字段和方法,还有构造方法.初始化程序和嵌套类 ...

  8. Java面向对象编程篇6——注解与反射

    Java面向对象编程篇6--注解与反射 1.注解概述 Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制 Java 语言中的类.方法.变量.参数和包等都可 ...

  9. Java面向对象编程篇5——枚举

    Java面向对象编程篇5--枚举 1.枚举的概念 在日常生活中这些事物的取值只有明确的几个固定值,此时描述这些事 物的所有值都可以一一列举出来,而这个列举出来的类型就叫做枚举类型 2.枚举的定义 使用 ...

最新文章

  1. html中设置表格单实线,css实现表格实线的方法
  2. 深入了解SAP S4 HANA Business Partner
  3. java.lang.IllegalArgumentException: pointerIndex out of range
  4. UA MATH566 统计理论7: Multiple Test
  5. 笔记-项目整体管理-复习要点
  6. 美国密西西比州立大学招收机器学习、数据挖掘方向全奖博士生
  7. 20155222卢梓杰 实验四 恶意代码分析
  8. JMetro版本5发布
  9. iOS内存管理的知识梳理
  10. vc实现html显示,在VC对话框中用ChtmlView控件显示HTML(2)
  11. windows环境上robotframework环境搭建
  12. 「TJOI 2013」攻击装置
  13. 【数字信号处理】基于matlab GUI正选信号时域+频域分析【含Matlab源码 887期】
  14. 甘肃暴雨强度公式_我国若干城暴雨强度公式列表.doc
  15. db2 中sql 拼接字符串
  16. 使用PHP+LibreOffice实现word转html的功能
  17. 00后程序员摸爬滚打近一年,为学弟学妹们总结出了以下 7 条人生建议(建议收藏)
  18. 通用oa系统_点晴:免费OA系统V20,让协同办公无处不在
  19. android u盘加载_[转] android 通过usb读取 U盘
  20. 科普 | 抖音服务器带宽有多大,为什么能够供那么多人同时刷?

热门文章

  1. 20189200余超 2018-2019-2 移动平台应用开发实践第十周作业
  2. 将设备插入usb2.0端口_将鼠标插入USB 3.0端口有什么好处?
  3. 计算机网络- Internet是如何工作的
  4. oracle 查询指定时间范围
  5. linux系统的版本(转载)
  6. Java踩坑记录-00001 BeanCreationException
  7. MATLAB 声音文件分析、处理。
  8. SQL---In-Exists-Any
  9. Android 设置锁屏时间,屏幕常亮效果
  10. 数学建模 matlab 数据建模基础