山东大学java课程设计级.docx
- 文档编号:29021428
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:23
- 大小:307.09KB
山东大学java课程设计级.docx
《山东大学java课程设计级.docx》由会员分享,可在线阅读,更多相关《山东大学java课程设计级.docx(23页珍藏版)》请在冰豆网上搜索。
山东大学java课程设计级
高级语言程序设计
技术报告
院系:
计算机科学与技术学院
专业:
2014级计算机科学与技术
学生姓名:
学号:
同组者:
指导老师:
1、题目:
《你画我猜》之DrawSomething小游戏设计。
2、基本要求:
本次设计要求利用Java实现支持2-4人联机的DrawSomething,支持如下基本流程:
1、游戏创建者在参与者进入后选择开始游戏。
2、系统读取数据库,给参与者50个汉字,包含了该组题所有的答案,该组题分若干轮,总计时3分钟。
每轮:
a)给出创建者一个词语(成语、单词),开始20秒计时
b)创建者根据词语利用不同粗细、颜色的画笔以及橡皮画图
c)图画即时传递到其他参与者的客户端,其他参与者根据当前画图内容写出答案。
最先猜测中的玩家与创建者共同得1分,如果都没有猜中,不得分
d)猜中后,或20秒倒计时结束后,或创建者放弃后,汉字集合中减掉该组词语,进入下一轮
要求提供词语库建库功能,支持新词语录入(替换老词语)
三、已实现的功能:
1、在多于2人的情况下可以开始游戏,系统读取数据库,给其他用户提示信息,依次轮流做画,30秒竞猜时间。
2、做画者可以用鼠标在绘图面板上单击拖动进行随笔画,用橡皮擦擦除已经绘制好的图形。
3、做画者可以根据需要改变画笔颜色和粗细。
4、图画即时传递到其他参与者的客户端,其他参与者根据当前画图内容写出答案,先猜出答案的人得1分并记录到数据库,开始下轮游戏。
5、拥有聊天对话框,游戏玩家可以随时聊天交流,并且聊天对话框中可以显示说话者的昵称,发出时间。
提供清除按钮,游戏玩家可清除聊天内。
4、系统模块架构:
1、程序主要结构:
(主要的模块之间的联系)
数据库
服务器
客户端
用户
用户
用户
2、类之间的紧密联系:
该程序由个类组成:
DrawPanelFrame类(游戏区),Server类(服务器,与客户端之间传递数据)DateBase类(连接数据库,与服务器之间传递数据)Clinet类(专门处理游戏与网路部分的交互,与主界面之间各种类的数据传递有关),ChatPanel类(DrawPanel类的内部类,聊天面板,包括聊天有关的按钮)DrawPanel类(DrawPanel类的内部类,绘画板,在他上面进行各种绘画),以及各种内部类(用来处理大量的事件控制,数据的打包及数据间的传递)。
3、主要大类之间的图示说明:
DataBase
Server
Clinet
DrawPanelFrame
LoginFrame
ChatPanel
DrawPanel
五:
为解决多人之间的交互,所以决定游戏界面,客户端,服务器分开设置,戏玩家的数据与客户端交互之后,再与服务器之间连接,最终数据的返回到达每一个其他的玩家(当然在竞猜和绘画之间的数据的传达有所不同)这样就实现了多用户之间的交互。
这样解决了绘画的同步传输,以及实现了群聊的功能,使得用户之间的交互变得方便。
其中数据的传递时,用到了阻塞队列,可以用来存取数据,相当于一个大的数据缓冲区,这样的设计实现使得数据的交互传递更加的清晰,透明。
再者,在竞猜类中,词语的建库基本功能已经实现,在设计数据库方面,让数据库与服务器之间联系在了一起,实现对程序最基本的支持。
游戏创建者在登陆界面和注册界面的设计方面没有仔细做完,但是课设的要求实现的基本功能已经实现,用户之间可以进行游戏和聊天。
六、游戏进程界面截图以及详解:
从点击开始按钮开始,游戏正式开始,绘画者得到第一个词语(如上所如:
pig),然后绘画者开始绘画,绘画完成,竞猜者猜测一个词语,当竞猜者回答正确,会弹出对话框,提示竞猜者,答对了,接着绘画者就会得到一个新的词语,进行下一轮游戏。
下面截图游戏主界面:
在游戏主界面,主要包括以下部分:
首先是颜色选择区(在游戏区的最北面)
在这个颜色选择区,我设置了单选按钮,和颜色选择对话框,每当选择单选按钮时,和选择颜色对话框的中的颜色后,最北区的面板会立即变为所选择颜色对应的颜色。
然后绘画者在面板上的画笔颜色就会变成对应的颜色。
其中单选按钮为了方便用户选择颜色,而颜色对话框的作用为用户提供更多的颜色选择,截图如下:
在绘画区,包含了画板,以及各种按钮(都有自己独特功能),还包括一个滑动条,滑动条的作用是改变画笔粗细,还有一个时间标签,倒计时显示剩余的时间,画板里的绘图可以同步传输。
最南面的部分包括滑动条和部分按钮,来控制游戏开始,画笔粗细,清除画板,橡皮等。
在主界面右面部分含有聊天面板,和竞猜部分,截屏如下:
7、主要技术难点以及关键代码:
DrawPanelFrame类:
1、这是游戏的主界面,可以根据绘画者的动作指令以及绘画结果生成相应的语句传给client类,进而发给服务器,同时也可以把从client接收到的消息进行具体化的展现。
其中,有DrawPanel类,负责与画图相关的工作,包括生成相应的命令和根据命令画出原来的轨迹。
还有time的一个线程类,可以控制时间的进程,用来告知剩余时间。
比较难一点的部分,是游戏主界面与客户端数据连接以及交互。
关键代码如下:
//为画笔粗细设置一个滑动条
slider=newJSlider(0,40,10);
slider.setPaintTicks(true);
slider.setPaintLabels(true);
slider.setMajorTickSpacing(4);
slider.setMinorTickSpacing
(1);
slider.setSnapToTicks(true);
slider.addChangeListener(newChangeListener(){
publicvoidstateChanged(ChangeEvente)
{
//通过滑动条来改变画笔的粗细,这是为了得到滑动条的数值
JSlidersource=(JSlider)e.getSource();
stroke=source.getValue();
}
});
//设置画笔按钮
penButton=newJButton("画笔");
penButton.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
isWrite=true;
}
});
southlPanel.add(penButton);
//设置橡皮按钮
rubberButton=newJButton("橡皮");
rubberButton.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
isWrite=false;
}
});
southlPanel.add(rubberButton);
add(southlPanel,BorderLayout.SOUTH);
//设置猜测和聊天面板
JPanelPanel=newJPanel();
Panel.setLayout(newGridLayout(2,1));
JPanelguessPanel=newJPanel();
guessPanel.setLayout(newBorderLayout());
//设置用户名,标志是3
publicvoidsetName(Stringstr){
scan=newScanner(str);
scan.next();
this.name=scan.next();
}
privatevoidsetColor(Colorcolor){
this.color=color;
}
//strat()方法,设置游戏开始
publicvoidstart(){
JOptionPane.showMessageDialog(null,"Gamestart!
!
!
");
isStart=true;
}
//给画图者提示,说明当前局的词条
publicvoidnewRound(Stringstr){
scan=newScanner(str);
scan.next();
JOptionPane.showMessageDialog(null,scan.next());
}
publicvoidnewRound(){
time=30;//代表新的一局游戏的开始
}
publicvoidguess(Stringstr){
scan=newScanner(str);
scan.next();
JOptionPane.showMessageDialog(null,scan.next()+"猜对了,答案是:
"+scan.next());
}
//关于时间条的线程
privateclasstimeimplementsRunnable{
publicvoidrun(){
while(true){
if(isStart){
timeLabel.setText("Timeleft:
"+time+"S");
//drawPanel.repaint();
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
time--;
if(time<0){
try{
client.setMessage("7");//告知服务器端当前局游戏结束,可以发出下一个词条了
}catch(InterruptedExceptione){
e.printStackTrace();
}
time=30;
}
}
}
}
}
}/
2、画图的同步传输方面,其中把重绘部分的代码放在了主界面内,设计了一个方法,其与客户端的交互比较联系密切。
代码如下:
//在面板上重绘
publicvoiddraw(Stringstr)
{
Scannerscan=newScanner(str);
if(4==scan.nextInt()){//4代表清屏~~~
this.repaint();
return;
}
intisFirst=scan.nextInt();
intisWrite=scan.nextInt();
x1=x2;y1=y2;
x2=scan.nextInt();
y2=scan.nextInt();
stroke=scan.nextInt();
r=scan.nextInt();
g=scan.nextInt();
b=scan.nextInt();
color=newColor(r,g,b);
if(isFirst==1){
x1=x2;y1=y2;
}
if(isWrite==1){
Graphics2Dg2d=(Graphics2D)drawPanel.getGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setStroke(newBasicStroke(stroke,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));
g2d.setPaint(color);
g2d.draw(newLine2D.Double(x1,y1,x2,y2));
}
else{
Graphics2Dg2d=(Graphics2D)drawPanel.getGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setStroke(newBasicStroke(40,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));
g2d.setPaint(Color.WHITE);
g2d.draw(newLine2D.Double(x1,y1,x2,y2));
}
}
Client类:
1、客户端用来作为游戏主界面与服务器之间的中间链,可以再三者之间进行数据的交互,传输。
部分代码如下:
这一小部分,可以连接与游戏主界面的连接,当主界面的数据以数组的形式包装后,通过以下代码传输到客户端(简单的类与方法的调用)。
到达客户端后,数据以数组的形式放到了阻塞队列里,方便以后的调用
publicvoidsetMessage(Stringstr)throwsInterruptedException{
out.put(str);
System.out.println("setMessgae_success");
}
publicvoidsetFrame(DrawPanelFrameframe){
this.frame=frame;
}
}
可以从out中take()和put()方法的调用。
privateArrayBlockingQueue
2、Client类也继承Runnable,作为线程的调用,其中run()方法代码如下:
publicvoidrun(){
try(Socketsocket=newSocket("localhost",8189))
{
br=newBufferedReader(newInputStreamReader(socket.getInputStream()));
pw=newPrintWriter(socket.getOutputStream(),true);
newThread(newtoServer()).start();
System.out.println("toServer-thread");
while(true)
{
str=br.readLine();
System.out.println("客户端接受信息成功");
scan=newScanner(str);
inti=scan.nextInt();
switch(i){
case1:
case4:
frame.draw(str);//画画
break;
case2:
frame.chat(str);//聊天
break;
case3:
frame.setName(str);//设置name
break;
case5:
//游戏开始了
frame.start();
break;
case6:
///新的词条来了,只针对于画图者
frame.newRound(str);
break;
case7:
//开始一局新的游戏
frame.newRound();
break;
case8:
//告知用户有人猜对了
frame.guess(str);
break;
}
}
Server类:
1、作为服务端,主要与客户端和数据库方面的交互。
接受客户端发来的信息,对应不同的信息作出相应的处理,同时也可以向客户端发送信息。
privateclassHandlerimplementsRunnable{
privateSocketsocket;
privateStringname="client"+i;
privateBufferedReaderbr;
privatePrintWriterpw;
privateStringmessage;
privateArrayBlockingQueue
privateScannerscan;
privatebooleanisDrawer=false;
publicHandler(Socketsocket){
this.socket=socket;
}
publicvoidrun(){
try{
if(i==1){///设置第一个进入游戏的人默认为画的人,6代表更新词条,7代表重新开始一局游戏
isDrawer=true;
i++;
}
br=newBufferedReader(newInputStreamReader(socket.getInputStream()));
pw=newPrintWriter(socket.getOutputStream(),true);
newThread(newback()).start();
System.out.println("back-thread-success");
pw.println("3"+"client"+i);//告知客户端用户名
while(true){
message=br.readLine();
scan=newScanner(message);
inti=scan.nextInt();
switch(i){
case1:
if(isDrawer){
out.put(message);
}
break;
case2:
case3:
case4:
out.put(message);
break;
case5:
start();
break;
case6:
//客户端猜测的词语,来做判断
Stringword=scan.next();
if(word.equals(currentWord)){
out.put("8"+name+""+currentWord);
out.put("7");
if(isDrawer){
currentWord=(String)ii.next();
out.put("6"+currentWord);
}
}
break;
case7:
out.put("7");
if(isDrawer){
currentWord=(String)ii.next();
out.put("6"+currentWord);
}
break;
}
}
}catch(IOException|InterruptedException|SQLExceptione){
e.printStackTrace();
}
}
2、ServerBack线程控制从阻塞队列里拿取信息以及向客户端发送相应的回应,start线程控制控制游戏的开始,以及从数据库中提取词条,发送给客户端以及用户。
privateclassServerBackimplementsRunnable{
privateStringstr;
publicvoidrun(){
while(true){
try{
str=out.take();
for(inti=0;i socketList.get(i).set(str); } }catch(InterruptedExceptione){ e.printStackTrace(); } } } } publicvoidstart()throwsSQLException,InterruptedException{ //wordSet=database.getWord(); wordSet=newArrayList //for(intt=0;t<10;t++){ //wordSet.add(""+t); //} wordSet=database.getWord(); ii=wordSet.iterator(); currentWord=(String)ii.next(); out.put("5");///5标志着通知客户端游戏开始啦~ for(intm=0;m if(socketList.get(m).getIsDrawer()){ socketList.get(m).set("6"+currentWord);//告知画图者,这次的词条是什么 } } } DataBase类: 1.这是数据库类,负责连接数据库,获得词库以及更新。 (数据库
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 山东大学 java 课程设计