课程设计报告
简单的游戏——五子棋
小组成员(姓名、学号):
**(组长) **
** **
** **
一、实验分工
二、开发环境(实验编译以及测试环境)
硬件环境:
CPU:Intel 奔腾双核E5200 主频 2.5GHz
内存:2G
软件环境:
操作系统:Windows 7
编程环境 JDK7.0
开发工具:Eclipse SDK
三、使用环境(用户运行环境)
硬件环境:
CPU主频在500MHZ以上,内存在128M以上
软件环境:
JAVA运行环境 + Windows XP或Windows 20## 以上操作系统
目 录
第一章 总体设计... 1
1.1设计的目的... 1
1.2本系统的主要功能... 1
1.3系统包含的类及类之间的关系。... 1
1.4 Java源文件及其功能... 2
1.5 项目构建思路... 2
第二章 模块功能介绍... 11
2.1主类Chess. 11
2.2类Autoplay. 12
2.3类Scan. 12
第三章 功能测试及运行效果... 14
3.1系统主界面... 14
3.2参考文献... 15
3.3工作总结... 15
第一章 总体设计
1.1设计的目的
《面向对象程序设计》课程设计是计算机科学与技术专业集中实践性环节之一,是学习完《面向对象程序设计》课程后进行的一次全面的综合练习。本课程设计主要目的在于加深学生对面向对象基础理论和基本知识的理解,掌握面向对象程序设计的基本方法,进一步使学生综合运用所学知识和增强实际动手能力。
通过课程设计,学生在下述各方面的能力应该得到锻炼:
1. 通过本次设计,实现对本学期内容的回顾与综合运用,包括类的建立,用类创建对象,方法的调用,图形组件的使用方法,图形界面的布局形式,事件处理机制,文件对话框的使用,文件操作的基本方法,数据读写的基本用法等。
2. 对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。
3. 掌握自顶而下的设计方法,将大问题进行模块化、对象化,领会面向对象程序设计的方法。
4. 熟练掌握JAVA语言(C#)的基本语法,灵活运用各种预定义类、线程和事件处理。
1.2本系统的主要功能
本系统可以实现电脑可以自动下棋,扫描整个棋盘记录连在一起的黑白棋子数,实现人与电脑有次序的下棋,判断人与电脑的胜负,为电脑下棋提供帮助
1.3系统包含的类及类之间的关系。
本系统共包6个Java源文件。类之间的关系如图1-1所示。
1.4 Java源文件及其功能
1.5 项目构建思路
此程序旨在打造一个小型五子棋娱乐游戏,经过认真分析和探索。终于,在大家的共同努力之下,完成了这个小型五子棋游戏。
游戏编辑思路,五子棋是一种互动性的益智游戏。需要棋盘、棋子、棋手、裁判。
首先,我们绘制一个五子棋棋盘,关键代码如下:
//绘制棋盘函数
publicvoid paint(Graphics g){
for (int i=40;i<=400;i=i+20){
g.drawLine(40,i,400,i);
} //绘制棋盘 行
for(int j=40;j<=400;j=j+20){
g.drawLine(j,40,j,400);
} //绘制棋盘 列
g.fillOval(97,97,6,6); //使用当前颜色填充外接指定矩形框的椭圆
g.fillOval(337,97,6,6);
g.fillOval(97,337,6,6);
g.fillOval(337,337,6,6);
g.fillOval(217,217,6,6);
}
其次,我们生成两种颜色不一样的棋子,关键代码如下:
黑色棋子代码如下:
//ChessPoint_black 类 继承 Canvas类
classChessPoint_blackextends Canvas implements MouseListener{
ChessPad chesspad=null;
ChessPoint_black(ChessPad p){
setSize(20,20); //设置棋盘每一小格的长宽
addMouseListener(this);
chesspad=p;
}
publicvoid paint(Graphics g){
g.setColor(Color.black); //设置黑色棋子的颜色
g.fillOval(0,0,18,18); //使用黑色填充椭圆棋子
}
白色棋子代码如下:
classChessPoint_whiteextends Canvas implements MouseListener{
ChessPad chesspad=null;
ChessPoint_white(ChessPad p){
setSize(20,20);
addMouseListener(this);
chesspad=p;
}
publicvoid paint(Graphics g){ //绘制棋子的颜色
g.setColor(Color.white);//设置为白色
g.fillOval(0,0,18,18);//填充白子
}
再次,为实现双方行棋,我们实现了电脑自动下棋的函数,一共分为8种情况,关键代码如下:
class AutoPlay{ //AutoPlay类实现电脑可以自动下棋
int x,y; //X统计玩家的连起来的棋子数
//Y电脑玩家的连起来的棋子数
void autoPlay(int chesspad[][],int a,int b){
int randomNumber=(int)(Math.random()*8)+1; //获取一个随机数
switch(randomNumber){ //分情况实现电脑自动下棋
case(1): //通过a,b的值 执行不同的运算,最后返回不同的
//值。达到执行不同的操作。
if(chesspad[a-1][b-1]==0)
{x=a-1;y=b-1;}
if(chesspad[a-1][b+1]==0)
{x=a-1;y=b+1;}
elseif(chesspad[a-2][b-2]==0)
{x=a-2;y=b-2;}
else {x=a-3;y=b-3;}
break;
case(2):
if(chesspad[a-1][b]==0)
{x=a-1;y=b;}
elseif(chesspad[a-2][b]==0)
{x=a-2;y=b;}
else {x=a-3;y=b;}
break;
case(3):
if(chesspad[a-1][b+1]==0)
{x=a-1;y=b+1;}
elseif(chesspad[a-2][b+2]==0)
{x=a-2;y=b+2;}
else {x=a-3;y=b+3;}
break;
case(4):
if(chesspad[a][b+1]==0)
{x=a;y=b+1;}
elseif(chesspad[a][b+2]==0)
{x=a;y=b+2;}
else {x=a;y=b+3;}
break;
case(5):
if(chesspad[a+1][b+1]==0)
{x=a+1;y=b+1;}
elseif(chesspad[a+2][b+2]==0)
{x=a+2;y=b+2;}
else {x=a+3;y=b+3;}
break;
case(6):
if(chesspad[a+1][b]==0)
{x=a+1;y=b;}
else if(chesspad[a+2][b]==0)
{x=a+2;y=b;}
else {x=a+3;y=b;}
break;
case(7):
if(chesspad[a+1][b-1]==0)
{x=a+1;y=b-1;}
elseif(chesspad[a+2][b-2]==0)
{x=a+2;y=b-2;}
else {x=a+3;y=b-3;}
break;
case(8):
if(chesspad[a][b-1]==0)
{x=a;y=b-1;}
elseif(chesspad[a][b-2]==0)
{x=a;y=b-2;}
else{x=a;y=b+3;}
break;
}
}
}
第四,为规范双方行棋的先后顺序,我们实现了一个判断函数,关键代码如下:
class Sort{ //sort类 实现人与电脑有次序的下棋
publicvoid sort(int shape[][][]){
int temp;
for(int i=0;i<19;i++)
for(int j=0;j<19;j++){
for(int h=1;h<=4;h++){
for(int w=3;w>=h;w--){
if(shape[i][j][w-1]<shape[i][j][w]){
//如果前者小于后者,则交换
temp=shape[i][j][w-1];
shape[i][j][w-1]=shape[i][j][w];
shape[i][j][w]=temp;
}
}
}
}
}
}
第五,脑只是简单的执行代码,没有智能思考的能力。在行棋之前,他需要对整个棋盘上的棋子做一个判断,然后决定该怎么行棋,关键代码如下:
class Evaluate{ //Evaluate类
int max_x,max_y,max;
publicvoid evaluate(int shape[][][]){
int i=0,j=0;
for(i=0;i<19;i++)
for(j=0;j<19;j++){
switch(shape[i][j][0]) {
//电脑根据传进来的三维数组决定该怎么行棋,
case 5:
shape[i][j][4]=200;
break;
case 4:
switch(shape[i][j][1]){
case 4:
shape[i][j][4]=150+shape[i][j][2]+
shape[i][j][3];
break;
case 3:
shape[i][j][4]=100+
shape[i][j][2]+
shape[i][j][3];
break;
default:
shape[i][j][4]=50+
shape[i][j][2]+
shape[i][j][3];
}
break;
case 3:
switch(shape[i][j][1]){
case 3:
shape[i][j][4]=75+
shape[i][j][2]+
shape[i][j][3];
break;
default:
shape[i][j][4]=20+
shape[i][j][2]+
shape[i][j][3];
}
break;
case 2:
shape[i][j][4]=10+shape[i][j][1]
+shape[i][j][2]
+shape[i][j][3];
break;
case 1:
shape[i][j][4]=shape[i][j][0]+shape[i][j][1]
+shape[i][j][2]
+shape[i][j][3];
default : shape[i][j][4]=0;
}
}
int x=0,y=0;
max=0;
for(x=0;x<19;x++)
for(y=0;y<19;y++)
if(max<shape[x][y][4]){
max=shape[x][y][4];
max_x=x; max_y=y;}
}
}
第六,在双方行棋后,我们需要判断那一方赢。裁判的功能代码如下
//判断人与电脑的胜负
class Judge{
staticboolean judge(int a[][],int color){
int i,j,flag;
for(i=0;i<19;i++){ //行
flag=0;
for(j=0;j<19;j++)//列
if(a[i][j]==color){
flag++; //棋子计数器
if (flag==5) //如果棋子数等于5
returntrue;} //返回true
else flag=0; //返回false
}
for(j=0;j<19;j++){
flag=0; //棋子计数器
for(i=0;i<19;i++)
if(a[i][j]==color) //每一列的棋子颜色一样
{
flag++;
if(flag==5) //棋子数为5
returntrue;} //返回true 否则返回true
else flag=0;
}
for(j=4;j<19;j++){
flag=0;
int m=j;
for(i=0;i<=j;i++){
if(a[i][m--]==color){ //对角线棋字数一样
flag++;
if(flag==5) //为5 则返回true
returntrue;}
else flag=0;} //棋子计数器归零
}
for(j=14;j>=0;j--){
flag=0; int m=j;
for(i=0;i<=18-j;i++){
if(a[i][m++]==color){ //对角线棋子数是否一样
flag++;
if(flag==5)
returntrue;} //棋子书为5 则返回true
else flag=0;} //否则归零
}
for(i=14;i>=0;i--){
flag=0; int n=i;
for(j=0;j<19-i;j++){
if(a[n++][j]==color){
flag++;
if(flag==5)
returntrue;}
else flag=0;}
}
for(j=14;j>=0;j--){
flag=0; int m=j;
for(i=18;i>=j;i--){
if(a[i][m++]==color){
flag++;
if(flag==5)
returntrue;}
else flag=0;}
}
returnfalse;}
}
最后,我们最终的程序是急于可视化的,所以,需要容器及组建来实现,关键代码如下:
classChessPadextends Panel implements MouseListener,ActionListener{
//创建棋盘
int array[][]=newint[19][19];//创建二维数组,生成棋盘
Sort sort=new Sort();
int i=0; //控制棋子颜色
int x=-1,y=-1,棋子颜色=1;
Button button=new Button("重新开局"); //确定按钮
TextField text_1=new TextField("请黑棋下子"), //创建文本组件 并初始化第一个
text_2=new TextField(),
text_3=new TextField();
ChessPad(){ //ChessPad函数的构造函数
setSize(440,440); //
setLayout(null);
setBackground(Color.pink); //设置背景为粉色
addMouseListener(this);
add(button);//向组件添加指定的重新开局菜单
button.setBounds(10,5,60,26);
//移动组件并调整其大小。由 x 和 y 指定左上角的新位置,由 width 和 height 指定新的大小。
button.addActionListener(this); //添加指定的操作侦听器,以接收来自此按钮的操作事件
add(text_1); text_1.setBounds(90,5,90,24);
add(text_2); text_2.setBounds(290,5,90,24);
add(text_3); text_3.setBounds(200,5,80,24);
for(int i=0;i<19;i++)
for(int j=0;j<19;j++)
{array[i][j]=0;} //初始化数组为0
for(int i=0;i<19;i++)
for(int j=0;j<19;j++)
for(int h=0;h<5;h++)
{scanp.shape[i][j][h]=0;
scanc.shape[i][j][h]=0;} //初始化三维数组为0
text_1.setEditable(false);
text_2.setEditable(false); //设置文本组件为不可编辑
}
第二章 模块功能介绍
2.1主类Chess
(1)成员变量见表2-1
(2)方法见表2-2
(3)源代码见文件Chess.java中的公共类 Chess
2.2类Autoplay
(1)成员变量见表2-3
(2)方法见表2-4
(3)源代码见文件Chess.java中的Autoplay类
2.3类Scan
(1)成员变量见表2.5
(2)方法见表2.6
(3)源代码见文件Chess.java中的Scan类
第三章 功能测试及运行效果
3.1系统主界面
图3-1初始化棋盘效果,玩家为黑棋。
图3-2可以统计下棋步数,与下棋的位置。
图3-3可以实现胜负的判断,并终止游戏。
3.2参考文献
面向对象程序设计——Java(第二版).西安电子科技大学出版社2006【教材】
张孝祥. Java就业培训教程[M]. 北京:清华大学出版社,2003
陈国君等编著.Java2程序设计基础.北京:清华大学出版社,2006
3.3工作总结
一个编程语言最强大的地方不是它是容易学,或者难学,而是它拥有一个强大的库。JAVA是一个完全面向对象的语言,JAVA的命名规则是很容易让人接受的。而且容易被编程人员记住。经过实践训练,对JAVA的综合应用能力有了较大的提高,另外对JAVA的特点有了更深层次的认识。这次实践中使用的代码虽然不长,但类与类之间也有很强的逻辑关系,这就是面向对象语言的最大优势,这样可使我们更轻松的运用JAVA。
经过努力,查阅相关资料,终于完成该课题,虽然效果不是很好,但亲手做过之后还是很有成就感的。
通过此次课程设计,将我本学期所学的JAVA知识得到巩固和应用,在设计的过程中我遇到了很到问题,不过在老师和同学们的帮助和自己的思考下还是很好的完成了。这此课程设计还让我懂得了写程序不能闭门造车,要努力拓宽知识面,开阔视野,拓展思维。它还让我学会了在网上查阅那些无限的资料。通过对此课题的开发,使我对用Eclipse开发平台有了一个比较清楚的认识,体会到理论和实践的重要性。由于自己的分析设计和程序经验不足,该系统设计和实现过程中,还有许多没有完善的地方,比如用户界面设计不够美观,异常出错处理比较差等多方面问题,这些都有待进一步完善和提高。对于文中出现的不足和系统中出现的问题敬请老师指导。