JAVA面向对象编程程序设计——中国象棋
一、团队介绍
连正(队长) | 棋盘的实现,棋子的行动,界面的设计等
王浩天 | 棋局规则(各子的行动限制),网络对战
二、项目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面向对象编程程序设计——中国象棋相关推荐
- java面向对象编程 漫画_Java面向对象编程(一)
由于常常将Java和C++面向对象编程的原则搞乱,所以这次把相关要点分别总结一下,本文主要总结Java面向对象编程. 面向对象编程的三大特性是:继承性(inheritance), 多态性(polymo ...
- 孙卫琴:我为什么要写《Java面向对象编程》
孙卫琴:我为什么要写<Java面向对象编程> 特约作者:孙卫琴 策划 & 设计 & 制作:李大微 当<精通Struts>和<精通Hibernate> ...
- java面向对象编程基础
java面向对象编程基础 前言:什么是java 是咖啡飘香的清晨 - 是斯坦福校园意浓情深 - 是James的思想睿智 是剁手党双十一挥舞的利刃 是大数据云计算驰骋的平台 - 是ATM上吐出的钞票 - ...
- 5.Java面向对象编程
文章目录 05 Java面向对象编程 1. 面向过程与面向对象比较 2. 类和对象 2.1 对象的属性和方法 2.2 类的属性和方法 2.3 定义一个类 2.4 创建和使用对象 2.5 对象和类的总结 ...
- java象棋游戏用户特点_基于Java Swing的《中国象棋》游戏的设计与实现
60 开发经验 3基金项目: 江西省自然科学基金资助项目(编号: 0411046); 江西省高性能计算技术重点实验室资助基金项目(No. JXHC20052003) ). 基于 Java Swing ...
- 能听懂的Java面向对象编程-雷伟-专题视频课程
能听懂的Java面向对象编程-2605人已学习 课程介绍 通过本课程的学习,学生能掌握面向对象的程序设计思想,并能运用Java技术和相关开发工具进行计算机软件代码的设计. 课程内容并非 ...
- java面向对象编程知识点总结
一:今天完成 上午详细了解了java面向对象编程的一些细节,记录如下. 1)类 是一种引用类型,包含一个签名和一个主体,主体是放在花括号里面的成员,成员包括字段和方法,还有构造方法.初始化程序和嵌套类 ...
- Java面向对象编程篇6——注解与反射
Java面向对象编程篇6--注解与反射 1.注解概述 Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制 Java 语言中的类.方法.变量.参数和包等都可 ...
- Java面向对象编程篇5——枚举
Java面向对象编程篇5--枚举 1.枚举的概念 在日常生活中这些事物的取值只有明确的几个固定值,此时描述这些事 物的所有值都可以一一列举出来,而这个列举出来的类型就叫做枚举类型 2.枚举的定义 使用 ...
最新文章
- html中设置表格单实线,css实现表格实线的方法
- 深入了解SAP S4 HANA Business Partner
- java.lang.IllegalArgumentException: pointerIndex out of range
- UA MATH566 统计理论7: Multiple Test
- 笔记-项目整体管理-复习要点
- 美国密西西比州立大学招收机器学习、数据挖掘方向全奖博士生
- 20155222卢梓杰 实验四 恶意代码分析
- JMetro版本5发布
- iOS内存管理的知识梳理
- vc实现html显示,在VC对话框中用ChtmlView控件显示HTML(2)
- windows环境上robotframework环境搭建
- 「TJOI 2013」攻击装置
- 【数字信号处理】基于matlab GUI正选信号时域+频域分析【含Matlab源码 887期】
- 甘肃暴雨强度公式_我国若干城暴雨强度公式列表.doc
- db2 中sql 拼接字符串
- 使用PHP+LibreOffice实现word转html的功能
- 00后程序员摸爬滚打近一年,为学弟学妹们总结出了以下 7 条人生建议(建议收藏)
- 通用oa系统_点晴:免费OA系统V20,让协同办公无处不在
- android u盘加载_[转] android 通过usb读取 U盘
- 科普 | 抖音服务器带宽有多大,为什么能够供那么多人同时刷?