java课程设计报告五子棋.docx
《java课程设计报告五子棋.docx》由会员分享,可在线阅读,更多相关《java课程设计报告五子棋.docx(34页珍藏版)》请在冰豆网上搜索。
java课程设计报告五子棋
工作原理图
2.2功能的规划
1.建立一个棋盘类,绘制棋盘的样式,在棋盘面板上添加各种按钮及相应胡触发事件。
同时注意面板的设计,使面板设计的尽量胡的合理美观。
a.棋盘的绘制
publicvoiddraw_qipan(GraphicsG)//画棋盘15*15{
G.setColor(Color.lightGray);
G.fill3DRect(10,10,300,300,true);
G.setColor(Color.black);
for(inti=1;i<16;i++){
G.drawLine(20,20*i,300,20*i);
G.drawLine(20*i,20,20*i,300);
}
}
b.添加按钮与按钮胡规划
Buttonb1=newButton("开始");
Buttonb2=newButton("重置游戏");
LabellblWin=newLabel("");
CheckboxckbHB[]=newCheckbox[3];
Buttonexist=newButton("退出");
publicvoidinit(){
ckbHB[0]=newCheckbox("执白",ckgHB,false);
ckbHB[1]=newCheckbox("执黑",ckgHB,false);
ckbHB[2]=newCheckbox("观看",ckgHB,false);
}
C.鼠标棋子胡相应触发事件
publicvoidmouseClicked(MouseEvente){
Graphicsg=getGraphics();
intx1,y1;
x1=e.getX();
y1=e.getY();
if(e.getX()<20||e.getX()>300||e.getY()<20||e.getY()>300){
return;
}
if(x1%20>10){
x1+=10;
}
if(y1%20>10){
y1+=10;
}
x1=x1/20*20;
y1=y1/20*20;
set_Qizi(x1,y1);
m*=(-1);
}
d.按钮的触发事件
publicvoidactionPerformed(ActionEvente){
Graphicsg=getGraphics();
if(e.getSource()==b1){
Game_start();
}
else{
Game_re();
}
if(e.getSource()==exist){
Game_re();
lblWin.setText(Get_qizi_color(color_Qizi)+"输了!
");
intGame_Start=0;
}
2.编写一个功能判断落子的位置及画出相应的黑白棋子
publicvoidset_Qizi(intx,inty)//落子{
if(intGame_Start==0)//判断游戏未开始{
return;
}
if(intGame_Body[x/20][y/20]!
=0){
return;
}
Graphicsg=getGraphics();
if(color_Qizi==1)//判断黑子还是白子{
g.setColor(Color.black);
color_Qizi=0;
}
else{
g.setColor(Color.white);
color_Qizi=1;
}
g.fillOval(x-10,y-10,20,20);
intGame_Body[x/20][y/20]=color_Qizi+1;
}
3.判断胜负
if(Game_win_1(x/20,y/20))//判断输赢1{
lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!
");
intGame_Start=0;
}
if(Game_win_2(x/20,y/20))//判断输赢2{
lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!
");
intGame_Start=0;
}
if(Game_win_3(x/20,y/20))//判断输赢3{
lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!
");
intGame_Start=0;
}
if(Game_win_4(x/20,y/20))//判断输赢4{
lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!
");
intGame_Start=0;
}}
4.添加用户聊天功能
NetchatClientchat=newNetchatClient();
chat.frame();
chat.setVisible(true);
三具体实现
3.1创建棋盘类
PublicclassWcyChessextendsAppletimplementsActionListener,MouseListener,MouseMotionListener,ItemListener{
intcolor_Qizi=0;//旗子的颜色标识0:
白子1:
黑子
intintGame_Start=0;//游戏开始标志0未开始1游戏中
intintGame_Body[][]=newint[16][16];//设置棋盘棋子状态
intm=-1;
Buttonb1=newButton("开始");
Buttonb2=newButton("重置游戏");
LabellblWin=newLabel("");
CheckboxckbHB[]=newCheckbox[3];
Buttonexist=newButton("退出");
CheckboxGroupckgHB=newCheckboxGroup();
NetchatClientchat=newNetchatClient();
publicvoidinit(){
setLayout(null);
addMouseListener(this);
add(b1);
b1.setBounds(330,50,80,30);
b1.addActionListener(this);
add(b2);
b2.setBounds(330,90,80,30);
b2.addActionListener(this);
ckbHB[0]=newCheckbox("执白",ckgHB,false);
ckbHB[0].setBounds(320,20,60,30);
ckbHB[1]=newCheckbox("执黑",ckgHB,false);
ckbHB[1].setBounds(380,20,60,30);
ckbHB[2]=newCheckbox("观看",ckgHB,false);
add(ckbHB[0]);
add(ckbHB[1]);
add(ckbHB[2]);
ckbHB[0].addItemListener(this);
ckbHB[1].addItemListener(this);
add(lblWin);
lblWin.setBounds(330,180,80,30);
lblWin.setBackground(Color.red);
lblWin.setText("胜利者!
");//没有显示?
ckbHB[2].setBounds(440,20,60,30);
add(exist);
exist.setBounds(330,130,80,30);
exist.addActionListener(this);
//add(chat);chat.setBounds(20,500,300,300);
chat.frame();
chat.setVisible(true);
Game_start_csh();
setSize(500,600);
setVisible(true);
}
publicvoiditemStateChanged(ItemEvente){
if(ckbHB[0].getState())//选择黑子还是白子{
color_Qizi=0;
}
else{
color_Qizi=1;
}
}
publicvoidmousePressed(MouseEvente){}
publicvoidmouseClicked(MouseEvente){
Graphicsg=getGraphics();
intx1,y1;
x1=e.getX();
y1=e.getY();
if(e.getX()<20||e.getX()>300||e.getY()<20||e.getY()>300){
return;
}
if(x1%20>10){
x1+=10;
}
if(y1%20>10){
y1+=10;
}
x1=x1/20*20;
y1=y1/20*20;
set_Qizi(x1,y1);
m*=(-1);
}
publicvoidactionPerformed(ActionEvente){
Graphicsg=getGraphics();
if(e.getSource()==b1){
Game_start();
}
else{
Game_re();
}
if(e.getSource()==exist){
Game_re();
lblWin.setText(Get_qizi_color(color_Qizi)+"输了!
");
intGame_Start=0;
}
}
publicvoidmouseEntered(MouseEvente){}
publicvoidmouseExited(MouseEvente){}
publicvoidmouseReleased(MouseEvente){}
publicvoidmouseDragged(MouseEvente){}
publicvoidmouseMoved(MouseEvente){}
publicvoidpaint(Graphicsg){
draw_qipan(g);
}
3.2判断输赢功能实现
if(Game_win_1(x/20,y/20)){//判断输赢1
lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!
");
intGame_Start=0;
}
if(Game_win_2(x/20,y/20)){//判断输赢2
lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!
");
intGame_Start=0;
}
if(Game_win_3(x/20,y/20))//判断输赢3{
lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!
");
intGame_Start=0;
}
if(Game_win_4(x/20,y/20))//判断输赢4{
lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!
");
intGame_Start=0;
}
//判断输赢程序实现在详细过程
publicbooleanGame_win_1(intx,inty){//横向判断输赢
intx1,y1,t=1;
x1=x;
y1=y;
for(inti=1;i<5;i++){
if(x1>15){
break;
}
if(intGame_Body[x1+i][y1]==intGame_Body[x][y]){
t+=1;
}
else{
break;
}
}
for(inti=1;i<5;i++){
if(x1<1)
break;
}
if(intGame_Body[x1-i][y1]==intGame_Body[x][y])
t+=1;
}
else{
break;
}
}
if(t>4){
returntrue;
}
else{
returnfalse;
}
}
publicbooleanGame_win_2(intx,inty){//纵向判断输赢
intx1,y1,t=1;
x1=x;
y1=y;
for(inti=1;i<5;i++){
if(x1>15){
break;
}
if(intGame_Body[x1][y1+i]==intGame_Body[x][y]){
t+=1;
}
else{
break;
}
}
for(inti=1;i<5;i++){
if(x1<1){
break;
}
if(intGame_Body[x1][y1-i]==intGame_Body[x][y]){
t+=1;
}
else{
break;
}
}
if(t>4){
returntrue;
}
else{
returnfalse;
}
}
publicbooleanGame_win_3(intx,inty)//左斜判断输赢{
intx1,y1,t=1;
x1=x;
y1=y;
for(inti=1;i<5;i++){
if(x1>15){
break;
}
if(intGame_Body[x1+i][y1-i]==intGame_Body[x][y]){
t+=1;
}
else{
break;
}
}
for(inti=1;i<5;i++){
if(x1<1){
break;
}
if(intGame_Body[x1-i][y1+i]==intGame_Body[x][y]){
t+=1;
}
else{
break;
}
}
if(t>4){
returntrue;
}
else{
returnfalse;
}}
publicbooleanGame_win_4(intx,inty){//左斜判断输赢
intx1,y1,t=1;
x1=x;
y1=y;
for(inti=1;i<5;i++){
if(x1>15){
break;
}
if(intGame_Body[x1+i][y1+i]==intGame_Body[x][y]){
t+=1;
}
else
{
break;
}
}
for(inti=1;i<5;i++){
if(x1<1){
break;
}
if(intGame_Body[x1-i][y1-i]==intGame_Body[x][y]){
t+=1;
}
else{
break;}}
if(t>4){
returntrue;
}
else{
returnfalse;
}
}
3.3实现聊天功能类
packageNetchatClient;
importjava.awt.*;
importjava.awt.event.*;
import.*;
importjava.io.*;
importjavax.swing.*;
publicclassNetchatClientextendsFrame{
Framex=newFrame("liaotianchengxu");
TextFieldtf=newTextField();
TextAreata=newTextArea();
Sockets=null;
DataOutputStreamdos=null;
publicstaticvoidmain(String[]args){
newNetchatClient().frame();
}
publicvoidframe(){
System.out.println("frame()");
setLocation(20,400);
setSize(300,300);
add(tf,BorderLayout.SOUTH);
add(ta,BorderLayout.NORTH);
pack();
setVisible(true);
connect();
this.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEventarg0){
cconnect();
System.exit(0);
}
});
addWindowListener
(newWindowAdapter()//窗口适配器{
publicvoidwindowClosing(WindowEvente)
{
System.exit(0);//程序退出
}});
tf.addActionListener(newnclistener());
}
publicvoidconnect(){
System.out.println("connnect()..");
try{
s=newSocket("127.0.0.1",8888);//设置客户端的IP和端口
dos=newDataOutputStream(s.getOutputStream());
}catch(UnknownHostExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}}
publicvoidcconnect(){
try{
dos.close();
s.close();
}catch(IOExceptione){
e.printStackTrace();
}}
publicclassnclistenerimplementsActionListener{
publicvoidactionPerformed(ActionEvente){
Stringst=tf.getText();
ta.setText(st);
tf.setText("");
try{
dos.writeUTF(st);
dos.flush();
}catch(IOExceptione1){
e1.printStackTrace();
}}}}
四测试结果
4.1进入游戏的界面
分析:
游戏开始的界面有三个选择项,用户可以选择相应的角色,选择
完毕后点击开始进入游戏。
用户也可以在下面的聊天框中进行聊天。
4.2选择角色,点击开始,开始下棋
分析:
首先达到五个棋子连在一块的赢了,并在红色区域显示谁赢了!
4.3下完后点击重新开始
分析:
下完一盘后游戏停止,点击重新开始,界面回到初始界面,选择角色继续游戏.
4.4游戏过程中退出,自动判输
分析:
在下棋的过程当中谁中途退出,即点击退出,系统自动判断谁输
4.5改进想法
这个系统基本上实现了要求但是在有些方面还不够完善。
1.观看角色点击后不会出发什么事件,虽然观看者并不需要做什么但是点击之后并没有发生任何反应总感觉缺点什么。
想加个什么功能,但是又不知道加什么才不至于画蛇添足。
2.问题比较大的可能是聊天功能了,本来聊天面板应该和棋盘面板在同一个面板上面,但是聊天功能的程序是写在了另一个类里,并且那个类是继承了Frame类的,是一个Application程序,而棋盘是一个Applet程序,所以当我添加这个类到Applet面板上并不能显示,所以我就打包那个NetchatClient类,在棋盘类中加载这个类,并调用该类的方法才实现了聊天功能。
3.聊天功能本身也还不够完善,因为每次发送聊天的容后都会覆盖掉原来的容,这使得用户不能很直观的看到聊天的容。
但是在修改的过程中出现了许多的问题,所以也就将就者先用了。
五设计体会与小结
这个课设题对我来说有一定的挑战性,因为我自己也不知道自己到底学到了一个什么样的境界。
但可以肯定,这个课设题的要求绝对在我的能力围以上。
之所以选择这个题目是想逼着自己去查更多的资料,学到更多的东西。
结果也确实是这样的,我在这次课设中学到了不少东西,也理解了许多原来不理解的东西。
尽管这个系统做的并不是那么的完善。
对于Java中的引用,初始化类等,开始我并不是非常的理解,知道就这么做就能实现相应的功能了,并没有很深刻的去理解它为什么要这么做。
但是真正的要用Java去做一个东西不理解它是不行的,而且其间这课设涉及到了Java中的绝大多数的知识点,如Java图形用户界面设计、Java的异常处理机制、Java中的多线