首页 > 编程语言 > 详细

Java课程设计 - 五子棋(个人报告)

时间:2021-01-29 10:11:27      阅读:86      评论:0      收藏:0      [点我收藏+]

Java课程设计个人报告 - 五子棋


1. 课程设计团队博客和git链接

博客点这!
git点这!

本人提交记录如下:
技术分享图片


2. 功能框架图

技术分享图片


3. 个人负责模块

序号 完成功能和任务 描述
1 悔棋功能 五子棋中的悔棋,回退上一步重走
2 联机对战服务端 局域网对战所需的服务端
3 联机对战客户端 连接到服务端,进行对战
4 联机对战 客户端之间进行通信,交替下棋
5 面向对象设计 使用面向对象技术进行程序设计

4. 个人负责模块说明

1. 联机对战服务端和客户端

采用ServerSocket、Socket技术将服务端和客户端进行连接,客户端采用DataInputStream和DataOutputStream来输入和输出信息给服务端。
服务端使用多线程技术分别接收来自两个客户端传入的信息,再传入到另一个客户端。

客户端与服务端连接代码如下图:图1为服务端,图2为客户端
技术分享图片
技术分享图片

服务端通知客户端开始下棋代码如下图:图1为服务端,图2为客户端(图2中字有误,应为“从服务端中获取数据更新后让其开始下棋”)
技术分享图片
技术分享图片

最终效果如下:
技术分享图片

2. 联机对战(以判赢、悔棋为例)

利用之前客户端和服务端建立的socket,通过DataInputStream、DataOutputStream进行数据交互,根据传输的数据决定行动,两个客户端中都有一个线程实时监控来自服务端的信息。
用writeInt、readInt方法读取数据,数据采用int类型,因为五子棋中可行的操作比较少,另外还会需要更新对手在(x,y)位置下棋,因此int类型比较适合。
关于输赢:服务端与客户端一样拥有一个棋盘,每次客户端下棋后,服务端棋盘也会相应更新,所以当客户端1下出致胜一棋时,客户端1会将该下棋坐标告诉服务端,服务端在“云棋盘”上也下上这一步,并判定出玩家1获胜了,于是向客户端1传输胜利的信息,向客户端2传输玩家1刚刚下的棋的位置(使客户端2的棋盘更新),并传送失败的信息。
技术分享图片

请求悔棋则见下代码截图:
技术分享图片
技术分享图片
技术分享图片
技术分享图片

效果如下:
技术分享图片
技术分享图片

部分代码:

class Exchange implements Runnable
	{
		// 判断数据的类型
		private int x;

		private Socket user1;
		private Socket user2;

		private boolean exit;

		private DataInputStream fromUser1;
		private DataOutputStream toUser2;

		public Exchange(Socket user1, Socket user2)
		{
			this.user1 = user1;
			this.user2 = user2;
			try
			{
				fromUser1 = new DataInputStream(this.user1.getInputStream());
				toUser2 = new DataOutputStream(this.user2.getOutputStream());
			} catch (IOException e)
			{
				release();
			}
		}

		@Override
		public void run()
		{
			while (!exit)
			{
				try
				{
					x = fromUser1.readInt();
					if (x == 1)
					{
						//下棋
						row = fromUser1.readInt();
						col = fromUser1.readInt();
						waitFlag = false;
					}
					// 悔棋
					else if (x == 3)
					{
						repentanceFlag = true;
						toUser2.writeInt(3);
					}
					//悔棋确认
					else if (x == 4)
					{
						Boolean bl = fromUser1.readBoolean();
						//是否允许悔棋
						toUser2.writeInt(4);
						toUser2.writeBoolean(bl);
					}
					//重玩一局
					else if(x == 5){
						toUser2.writeInt(5);
					}
					else if(x == 6){
						//重玩确认
						Boolean bl = fromUser1.readBoolean();
						toUser2.writeInt(6);
						toUser2.writeBoolean(bl);
					}
				} catch (Exception e)
				{
					// 玩家异常退出或者逃跑
					s.remove(user1);
					waitFlag = false;
					
					try
					{
						for (Socket socket : s)
						{
							if (socket == user2) {
							    toUser2.writeInt(9);
							}
						}

					} catch (IOException e1)
					{
						e1.printStackTrace();
					}
					//释放资源
					release();
				}
			}
		}
		
		private void release()
		{
			exit = true;
			ConnectServer.close(user1, user2, fromUser1, toUser2);
		}

	}

3. 面向对象设计

UML图如下:
技术分享图片


5. 不足之处

  • gitee使用非常不熟练:可以看到我的提交记录中有不少删除的记录,这些都是因为git提交出现了问题,不得不删掉(因为有组员只能手动上传网页)……养成利用git管理代码的习惯才能慢慢挽回了
  • 交流不足,前期工作进展较慢:这点从提交记录也可以看出,前面几天的提交次数非常少,最后一天提交了很多,这就是因为前期小组内部交流讨论较少,大家基本写着都没有什么明确的方向,甚至联机功能也是到26号晚上才确定下来要做的。还是要多交流,在项目初期组内就要统一确立一个方向
  • 没有用户界面:本来是想要做用户登录,对战时输赢增减积分的,这部分想用MySQL完成,但因为最后两天时间太匆忙,全部都在赶联机的实现,只能先以大局为重,把主要功能实现

Java课程设计 - 五子棋(个人报告)

原文:https://www.cnblogs.com/silverash/p/14342852.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!