五子棋Java课程设计.docx

上传人:b****8 文档编号:30402111 上传时间:2023-08-14 格式:DOCX 页数:21 大小:109.03KB
下载 相关 举报
五子棋Java课程设计.docx_第1页
第1页 / 共21页
五子棋Java课程设计.docx_第2页
第2页 / 共21页
五子棋Java课程设计.docx_第3页
第3页 / 共21页
五子棋Java课程设计.docx_第4页
第4页 / 共21页
五子棋Java课程设计.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

五子棋Java课程设计.docx

《五子棋Java课程设计.docx》由会员分享,可在线阅读,更多相关《五子棋Java课程设计.docx(21页珍藏版)》请在冰豆网上搜索。

五子棋Java课程设计.docx

五子棋Java课程设计

《面向对象程序设计》

课程设计报告

 

实验时间:

2010年10月26日

实验班级:

**********************

实验报告总份(片)数:

1份(片)

实验指导老师:

*****

 

*******设计小组

湖南省吉首市吉首大学

课程设计报告

简单的游戏——五子棋

小组成员(姓名、学号):

**(组长)**

****

****

一、实验分工

姓名

职责

**

编写程序、修改程序、设计流程图、设计实验报告

**

修改程序、分析运行结果、搜索相关资料

**

修改程序、分析运行结果、整理实验报告

二、开发环境(实验编译以及测试环境)

硬件环境:

CPU:

Intel奔腾双核E5200主频2.5GHz

内存:

2G

软件环境:

操作系统:

Windows7

编程环境JDK7.0

开发工具:

EclipseSDK

三、使用环境(用户运行环境)

硬件环境:

CPU主频在500MHZ以上,内存在128M以上

软件环境:

JAVA运行环境+WindowsXP或Windows2000以上操作系统

 

 

第一章总体设计

1.1设计的目的

《面向对象程序设计》课程设计是计算机科学与技术专业集中实践性环节之一,是学习完《面向对象程序设计》课程后进行的一次全面的综合练习。

本课程设计主要目的在于加深学生对面向对象基础理论和基本知识的理解,掌握面向对象程序设计的基本方法,进一步使学生综合运用所学知识和增强实际动手能力。

通过课程设计,学生在下述各方面的能力应该得到锻炼:

1.通过本次设计,实现对本学期内容的回顾与综合运用,包括类的建立,用类创建对象,方法的调用,图形组件的使用方法,图形界面的布局形式,事件处理机制,文件对话框的使用,文件操作的基本方法,数据读写的基本用法等。

2.对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。

3.掌握自顶而下的设计方法,将大问题进行模块化、对象化,领会面向对象程序设计的方法。

4.熟练掌握JAVA语言(C#)的基本语法,灵活运用各种预定义类、线程和事件处理。

1.2本系统的主要功能

本系统可以实现电脑可以自动下棋,扫描整个棋盘记录连在一起的黑白棋子数,实现人与电脑有次序的下棋,判断人与电脑的胜负,为电脑下棋提供帮助

1.3系统包含的类及类之间的关系。

本系统共包6个Java源文件。

类之间的关系如图1-1所示。

 

1.4Java源文件及其功能

表1-1java源文件及其功能

序号

文件名

主要功能

备注

1

Chess

本程序的主函数

初始化棋盘

2

Autoplay

实现电脑可以自动下棋

分为8种情况

3

Scan

扫描整个棋盘记录连在一起的黑白棋子数

为判断胜负服务

4

Sort

实现人与电脑有次序的下棋

黑棋白棋有序的下

5

Judge

判断人与电脑的胜负

可以在文本框中显示胜负结果

6

Evaluate

电脑估计

为电脑下棋提供帮助

1.5项目构建思路

此程序旨在打造一个小型五子棋娱乐游戏,经过认真分析和探索。

终于,在大家的共同努力之下,完成了这个小型五子棋游戏。

游戏编辑思路,五子棋是一种互动性的益智游戏。

需要棋盘、棋子、棋手、裁判。

首先,我们绘制一个五子棋棋盘,关键代码如下:

//绘制棋盘函数

publicvoidpaint(Graphicsg){

for(inti=40;i<=400;i=i+20){

g.drawLine(40,i,400,i);

}//绘制棋盘行

for(intj=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_blackextendsCanvasimplementsMouseListener{

ChessPadchesspad=null;

ChessPoint_black(ChessPadp){

setSize(20,20);//设置棋盘每一小格的长宽

addMouseListener(this);

chesspad=p;

}

publicvoidpaint(Graphicsg){

g.setColor(Color.black);//设置黑色棋子的颜色

g.fillOval(0,0,18,18);//使用黑色填充椭圆棋子

}

白色棋子代码如下:

classChessPoint_whiteextendsCanvasimplementsMouseListener{

ChessPadchesspad=null;

ChessPoint_white(ChessPadp){

setSize(20,20);

addMouseListener(this);

chesspad=p;

}

publicvoidpaint(Graphicsg){//绘制棋子的颜色

g.setColor(Color.white);//设置为白色

g.fillOval(0,0,18,18);//填充白子

}

 

再次,为实现双方行棋,我们实现了电脑自动下棋的函数,一共分为8种情况,关键代码如下:

classAutoPlay{//AutoPlay类实现电脑可以自动下棋

intx,y;//X统计玩家的连起来的棋子数

//Y电脑玩家的连起来的棋子数

voidautoPlay(intchesspad[][],inta,intb){

intrandomNumber=(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;}

elseif(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;

}

}

}

第四,为规范双方行棋的先后顺序,我们实现了一个判断函数,关键代码如下:

classSort{//sort类实现人与电脑有次序的下棋

publicvoidsort(intshape[][][]){

inttemp;

for(inti=0;i<19;i++)

for(intj=0;j<19;j++){

for(inth=1;h<=4;h++){

for(intw=3;w>=h;w--){

if(shape[i][j][w-1]

//如果前者小于后者,则交换

temp=shape[i][j][w-1];

shape[i][j][w-1]=shape[i][j][w];

shape[i][j][w]=temp;

}

}

}

}

}

}

第五,脑只是简单的执行代码,没有智能思考的能力。

在行棋之前,他需要对整个棋盘上的棋子做一个判断,然后决定该怎么行棋,关键代码如下:

classEvaluate{//Evaluate类

intmax_x,max_y,max;

publicvoidevaluate(intshape[][][]){

inti=0,j=0;

for(i=0;i<19;i++)

for(j=0;j<19;j++){

switch(shape[i][j][0]){

//电脑根据传进来的三维数组决定该怎么行棋,

case5:

shape[i][j][4]=200;

break;

case4:

switch(shape[i][j][1]){

case4:

shape[i][j][4]=150+shape[i][j][2]+

shape[i][j][3];

break;

case3:

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;

case3:

switch(shape[i][j][1]){

case3:

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;

case2:

shape[i][j][4]=10+shape[i][j][1]

+shape[i][j][2]

+shape[i][j][3];

break;

case1:

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;

}

}

intx=0,y=0;

max=0;

for(x=0;x<19;x++)

for(y=0;y<19;y++)

if(max

max=shape[x][y][4];

max_x=x;max_y=y;}

}

}

第六,在双方行棋后,我们需要判断那一方赢。

裁判的功能代码如下

//判断人与电脑的胜负

classJudge{

staticbooleanjudge(inta[][],intcolor){

inti,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

elseflag=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

elseflag=0;

}

for(j=4;j<19;j++){

flag=0;

intm=j;

for(i=0;i<=j;i++){

if(a[i][m--]==color){//对角线棋字数一样

flag++;

if(flag==5)//为5则返回true

returntrue;}

elseflag=0;}//棋子计数器归零

}

for(j=14;j>=0;j--){

flag=0;intm=j;

for(i=0;i<=18-j;i++){

if(a[i][m++]==color){//对角线棋子数是否一样

flag++;

if(flag==5)

returntrue;}//棋子书为5则返回true

elseflag=0;}//否则归零

}

for(i=14;i>=0;i--){

flag=0;intn=i;

for(j=0;j<19-i;j++){

if(a[n++][j]==color){

flag++;

if(flag==5)

returntrue;}

elseflag=0;}

}

for(j=14;j>=0;j--){

flag=0;intm=j;

for(i=18;i>=j;i--){

if(a[i][m++]==color){

flag++;

if(flag==5)

returntrue;}

elseflag=0;}

}

returnfalse;}

}

最后,我们最终的程序是急于可视化的,所以,需要容器及组建来实现,关键代码如下:

classChessPadextendsPanelimplementsMouseListener,ActionListener{

//创建棋盘

intarray[][]=newint[19][19];//创建二维数组,生成棋盘

Sortsort=newSort();

inti=0;//控制棋子颜色

intx=-1,y=-1,棋子颜色=1;

Buttonbutton=newButton("重新开局");//确定按钮

TextFieldtext_1=newTextField("请黑棋下子"),//创建文本组件并初始化第一个

text_2=newTextField(),

text_3=newTextField();

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(inti=0;i<19;i++)

for(intj=0;j<19;j++)

{array[i][j]=0;}//初始化数组为0

for(inti=0;i<19;i++)

for(intj=0;j<19;j++)

for(inth=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-1主要成员变量(属性)

成员变量描述

变量类型

名称

控制棋子颜色

int

i

重新开局

Button

Button

请黑棋下子

TextField

text_1

请白棋下子

TextField

text_2

这是第"+i+"步

TextField

text_3

(2)方法见表2-2

表2-2主要方法

方法名称

返回类型

功能

备注

ChessPad()

初始化棋盘

设置棋盘颜色,

ChessPad()

Voidpaint(Graphicsg)

对棋子等图像进行初始化

设置棋子大小,颜色等

Voidpaint(Graphicsg)

PublicvoidmousePressed(MouseEvente)

鼠标的实践监听

单击实践

publicvoidmousePressed(MouseEvente)

publicvoidpaint(Graphicsg)

画出图像

控制图像的大小范围

publicvoidpaint(Graphicsg)

publicvoidmousePressed(MouseEvente)

处理按下鼠标的事件

选中下棋的位置

publicvoidmousePressed(MouseEvente)

publicvoidmouseReleased(MouseEvente)

处理鼠标离开的事件

本步下棋结束

publicvoidmouseReleased(MouseEvente)

publicvoidmouseExited(MouseEvente)

处理鼠标离开棋盘时

鼠标离开组件不实现任何事件

publicvoidmouseExited(MouseEvente)

publicvoidmouseClicked(MouseEvente)

处理发生单击的事件

实现下棋以及重新开始游戏

publicvoidmouseClicked(MouseEvente)

(3)源代码见文件Chess.java中的公共类Chess

2.2类Autoplay

(1)成员变量见表2-3

表2-3主要成员变量

成员变量描述

变量类型

名称

统计玩家的连起来的棋子数

int

X

电脑玩家的连起来的棋子数

Int

Y

(2)方法见表2-4

表2-4主要方法

方法名

功能

备注

voidautoPlay(intchesspad[][],inta,intb)

分情况实现电脑自动下棋

使用switch语句分为8种情况来下棋

(3)源代码见文件Chess.java中的Autoplay类

2.3类Scan

(1)成员变量见表2.5

表2-5Scan

成员变量描述

变量类型

名称

统计棋盘种五个连起来的棋子数

数组

intshape[][][]

控制行数

int

i

控制列数

int

j

(2)方法见表2.6

表2-6Scan

方法名

功能

备注

voidscan(intchesspad[][],intcolour){

判断棋盘上连在一起的黑白棋子个数。

(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知识得到巩固和应用,在设计的过程中我遇到了很到问题,不过在老师和同学们的帮助和自己的思考下还是很好的完成了。

这此课程设计还让我懂得了写程序不能闭门造车,要努力拓宽知识面,开阔视野,拓展思维。

它还让我学会了在网上

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1