五子棋设计报告完整版.docx
- 文档编号:27723356
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:14
- 大小:30.40KB
五子棋设计报告完整版.docx
《五子棋设计报告完整版.docx》由会员分享,可在线阅读,更多相关《五子棋设计报告完整版.docx(14页珍藏版)》请在冰豆网上搜索。
五子棋设计报告完整版
《计算机网络》设计报告
题目:
局域网五子棋设计
班级:
计算机08.2班
姓名:
颜晓云
指导教师:
杨松波
2011年7月15日
目录
1、概论-2-
2、功能介绍-2-
3、程序流程图-2-
4、实现代码-3-
5、总结体会-9-
6、参考文献-9-
第一章绪论
主要运用了GUI(用户图形界面)和API(应用程序借口)来实现。
当然,Event监听器等也是这个程序的重要部分。
程序没有用到图片的引用,棋盘和棋子的设计完全是应用坐标来绘制,再加入按钮、及实现本游戏的用户界面布局。
程序编写的思路来源于网上和书上的资料,程序在编写过程中遇到的问题主要集中在前期的棋盘绘制和后期的棋子算法。
第二章功能介绍
(1)程序在设计初就定义黑棋先行,白棋随后。
从第一个棋子开始开始相互顺
序落子。
(2)通过坐标索引算出最先在棋盘的横向、竖向、斜向形成连续的相同色五棋
子的一方为胜利。
(3)在游戏过程中或下完时可选择重新开始。
(4)赢家对话框提示。
第三章程序流程图
第四章实现代码
importjava.awt.BorderLayout;
importjava.awt.Color;
importjava.awt.FlowLayout;
importjava.awt.Graphics;
importjava.awt.Point;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.InputEvent;
importjava.awt.event.MouseAdapter;
importjava.awt.event.MouseEvent;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JOptionPane;
importjavax.swing.JPanel;
publicclassChessFrmextendsJFrameimplementsActionListener{
intstep;
JButtonbutnStart=newJButton("重新开始");
FiveChesschess=newFiveChess();
FlowLayoutflow=newFlowLayout();
JPanelpanelPaint=newJPanel(),panelEast=newJPanel();//panelPaint为画五子棋的面板
ChessFrm(Strings){
super(s);
setBounds(100,100,600,600);
setLayout(newBorderLayout());
setVisible(true);
setResizable(false);
add(panelPaint);
panelEast.add(butnStart);
add(panelEast,BorderLayout.EAST);
butnStart.addActionListener(this);
addMouseListener(newMouseAdapter(){
publicvoidmouseClicked(MouseEvente){
if(e.getModifiers()==InputEvent.BUTTON3_MASK)
return;
intx=e.getX()-3;//鼠标单击位置为在整个窗体中的位置,包括标题栏和侧边
inty=e.getY()-23;
System.out.println("鼠标单击位置:
"+x+","+y);
Pointindex=chess.getIndex(x,y);//得到行列
if(index!
=null){
drawNode(index.x,index.y);
step++;
if(chess.isWin(index.x,index.y)){
Stringstr=chess.white?
"黑棋":
"白棋";
System.out.println(str+"在第"+step+"步赢了");
intoption=JOptionPane.showConfirmDialog(
ChessFrm.this,
str+"在第"+step+"步赢了,是否再来一局","五子棋",
JOptionPane.YES_NO_OPTION);
if(option==JOptionPane.YES_OPTION){
step=0;//重新置为零
clearExist();//清除已有棋子
chess.restate();//数据清零
repaint();
}
}
}
}
});
repaint();
validate();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
publicvoiddrawNode(inti,intj){
intx=chess.node[i][j].x;
inty=chess.node[i][j].y;
intstate=chess.node[i][j].state;
Graphicsg=panelPaint.getGraphics();
if(state==1)
g.setColor(Color.black);
elseif(state==2)
g.setColor(Color.white);
g.drawOval(x-6,y-6,12,12);
g.fillOval(x-6,y-6,12,12);
}
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==butnStart){
if(step!
=0){
intoption=JOptionPane.showConfirmDialog(ChessFrm.this,"是否放弃重来",
"五子棋",JOptionPane.YES_NO_OPTION);
if(option==JOptionPane.YES_OPTION){
clearExist();
chess.restate();
step=0;
repaint();
}
}
}
}
publicvoidpaint(Graphicsgg){//Graphics是在整个窗体描绘
super.paint(gg);
Graphicsg=panelPaint.getGraphics();
g.setColor(Color.magenta);
for(inti=1;i<=FiveChess.row_column;i++){
g.drawLine(10,i*FiveChess.interval,548,i*FiveChess.interval);
g.drawLine(i*FiveChess.interval,10,i*FiveChess.interval,540);
}
drawExistNode();
}
voiddrawExistNode(){
Graphicsg=panelPaint.getGraphics();
for(inti=0;i for(intj=0;j if(chess.node[i][j].state==1||chess.node[i][j].state==2){ if(chess.node[i][j].state==1) g.setColor(Color.black); elseif(chess.node[i][j].state==2) g.setColor(Color.white); g.drawOval(chess.node[i][j].x-6,chess.node[i][j].y-6, 12,12); g.fillOval(chess.node[i][j].x-6,chess.node[i][j].y-6, 12,12); } } } publicvoidclearExist(){ Graphicsg=panelPaint.getGraphics(); g.clearRect(0,0,600,600); } publicstaticvoidmain(String[]args){ ChessFrmcFrm=newChessFrm("五子棋"); } } classFiveChess{ booleanwhite; publicstaticfinalintbound=7;//在离中心为7的范围内单击为有效单击(即下棋) publicstaticfinalintrow_column=20; publicstaticfinalintinterval=26;//五子棋之间的距离 Nodenode[][]; publicFiveChess(){ init(); } privatevoidinit(){ node=newNode[row_column][row_column]; for(inti=0;i for(intj=0;j node[i][j]=newNode(); node[i][j].x=(i+1)*interval; node[i][j].y=(j+1)*interval; } } PointgetIndex(intx,inty){ inti=x/interval-1; intj=y/interval-1; if(i==-1)//边界 i++; if(j==-1) j++; for(intp=i;p for(intq=j;q if(p>row_column-1||q>row_column-1){ System.out.println("越界"); returnnull; } if(x>node[p][q].x-bound&&x &&y>node[p][q].y-bound&&y if(node[p][q].state==0){//在范围内且此处没棋,才有效 node[p][q].state=white? 2: 1; white=! white; returnnewPoint(p,q); } } returnnull; } booleanisWin(inti,intj){ return(horizontal(i,j)||vertical(i,j)||diagonalSE(i,j)||diagonalNE( i,j)); } privatebooleanvertical(inti,intj){ intcount=1; intup=j-1;//垂直向上方向判断 while(up>=0&&node[i][up].state==node[i][j].state){ count++; up--;//千万注意自增自减运算 if(count>=5) returntrue; } intdown=j+1;//接着垂直向下方向判断 while(down count++; down++; if(count>=5) returntrue; } returnfalse; } privatebooleanhorizontal(inti,intj){ intcount=1; intleft=i-1;//水平向左判断 while(left>=0&&node[left][j].state==node[i][j].state){ count++; left--; if(count>=5) returntrue; } intright=i+1;//水平向右判断 while(right count++; right++; if(count>=5) returntrue; } returnfalse; } privatebooleandiagonalSE(inti,intj){ intcount=1; intnorth=j-1; intwest=i-1;//西北方向判断 while(north>=0&&west>=0 &&node[west][north].state==node[i][j].state){ count++; north--; west--; if(count>=5) returntrue; } intsouth=j+1; inteast=i+1;//接着东南方向判断 while(south &&node[east][south].state==node[i][j].state){ count++; south++; east++; if(count>=5) returntrue; } returnfalse; } privatebooleandiagonalNE(inti,intj){ intcount=1; intnorth=j-1; inteast=i+1;//东北方向判断 while(north>=0&&east &&node[east][north].state==node[i][j].state){ count++; north--; east++; if(count>=5) returntrue; } intwest=i-1; intsouth=j+1;//接着西南方向判断 while(west>=0&&south &&node[west][south].state==node[i][j].state){ count++; west--; south++; if(count>=5) returntrue; } returnfalse; } voidrestate(){ for(inti=0;i for(intj=0;j node[i][j].state=0; white=false; } } } classNode{ intx; inty; intstate;//0无棋子,1黑棋,2白棋 } 第五章总结与体会 通过这次对JAVA的学习,让我渐渐体会到了JAVA的博大精深。 以及怎么学习JAVA,怎么学习计算机语言,怎样对问题进行解决和运用JAVAGUI,查找JAVAAPI的使用都用了更进一步的理解。 对于Java中的引用,初始化类等,开始我并不是非常的理解,知道就这么做就能实现相应的功能了,并没有很深刻的去理解它为什么要这么做。 但是真正的要用Java去做一个东西不理解它是不行的,而且其间这课设涉及到了Java中的绝大多数的知识点,如Java图形用户界面设计、Java的异常处理机制、Java中的多线程程序设计、Java输入输出流,要应用这些东西更要求我去好好理解Java的这些规则。 好在有一定的C++基础Java与C++语法类似,并把C++中一些较低级和较难以理解的功能都去掉了,如多继承、指针等,同时Java增强了部分功能。 所以理解起来也比较容易。 但是理解了Java的规则要把这个课设做好也不是那么容易,最难的部分是如何实现各个功能的划分和类的通讯问题。 我在这方面就遇到了不少的问题。 总结这次课设,我还是收获不少。 虽然界面也不是很美观,有点功能间的连接做的也不是特别的好,但是我能认识到自己的不足,并且在跟同学的交流中也学到了一些他们的设计思路,也知道今后要加强哪些方面的知识。 参考文献: 1、《JAVA编程案例精解》电子工业出版社; 2、 3、
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 五子棋 设计 报告 完整版