Java程序设计五子棋综合实验报告.docx
- 文档编号:8082167
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:38
- 大小:57.17KB
Java程序设计五子棋综合实验报告.docx
《Java程序设计五子棋综合实验报告.docx》由会员分享,可在线阅读,更多相关《Java程序设计五子棋综合实验报告.docx(38页珍藏版)》请在冰豆网上搜索。
Java程序设计五子棋综合实验报告
“Java程序设计”综合实验报告
一、前言
1、项目背景
通过五子棋这个课程设计。
可以让我们更加熟悉Java程序设计这门课程,加强对Eclipse这个软件的使用,加深对Java语言的掌握,提高编程水平。
同时培养能力,为将来的工作打下坚实的基础。
2、目标和意义
目标:
锻炼我们的能力,提高组中每一个人对Java语言的认识,培养编程兴趣。
让每一个人都能参与进来,提高团队合作意识。
意义:
通过编写综合类的程序,运用已经学过的知识,和自主学习一些新的知识,提高了学习能力,掌握了一些自主学习的方法。
3、开发分工及进度安排
二、功能分析
1、主要模块
本项目主要分为3个大的模块,分别为整体布局;界面绘制;与对战的算法。
由于游戏规则的设置,这里的游戏模式分为人机对战和人人对战。
黑白双方依次落子,由黑子先下,当任意一方在棋盘上形成横向,竖向,斜向连续五个相同颜色的棋子的一方获胜。
主要功能
①实现在2种模式下五子棋的游戏。
②实现通过鼠标的点击位置放置棋子,达到下棋的目的。
③实现游戏玩家对游戏模式的自主选择。
④实现对在每种游戏模式下的黑子先手下棋的规定,先达到5子即为胜利。
三、关键功能的设计与实现
1、数据结构与算法
数据结构:
项目中主要数据结构为二维数组。
用于存储棋盘上棋子的信息,和保存棋型表。
主要算法:
(一)iswin()函数:
用来判断输赢,通过鼠标事件所得到的点或者电脑下的点的坐标,来扫描该点八个方向的相邻的相同棋子数,上下,左右,斜左上下,斜右上下为四组,任意一组等于5即为胜利,由于本程序没有考虑禁手原则,只考虑了民间规则,所以大于5也为胜利。
publicintiswin1(intx,inty,intheqi){
intk,s1,s2,s3,s4,s5,s6,s7,s8;
s1=0;
s2=0;
s3=0;
s4=0;
s5=0;
s6=0;
s7=0;
s8=0;
if(heqi==256)
return-1;
for(k=1;k<5;k++){
if(y+k<16&&qipanqizi[x][y+k]==qipanqizi[x][y])
s1++;
else
break;
}
for(k=1;k<5;k++){
if(y-k>-1&&qipanqizi[x][y-k]==qipanqizi[x][y])
s2++;
else
break;
}
for(k=1;k<5;k++){
if(x+k<16&&y+k<16
&&qipanqizi[x+k][y+k]==qipanqizi[x][y])
s3++;
else
break;
}
for(k=1;k<5;k++){
if(x-k>-1&&y-k>-1
&&qipanqizi[x-k][y-k]==qipanqizi[x][y])
s4++;
else
break;
}
for(k=1;k<5;k++){
if(x+k<16&&qipanqizi[x+k][y]==qipanqizi[x][y])
s5++;
else
break;
}
for(k=1;k<5;k++){
if(x-k>-1&&qipanqizi[x-k][y]==qipanqizi[x][y])
s6++;
else
break;
}
for(k=1;k<5;k++){
if(x-k>-1&&y+k<16
&&qipanqizi[x-k][y+k]==qipanqizi[x][y])
s7++;
else
break;
}
for(k=1;k<5;k++){
if(x+k<16&&y-k>-1
&&qipanqizi[x+k][y-k]==qipanqizi[x][y])
s8++;
else
break;
}
if(s1+s2>=4||s3+s4>=4||s5+s6>=4||s7+s8>=4){
return1;
}else
return0;
}
(二)人机对战
通过对整个棋盘上每一个点的扫描,获得了电脑和玩家的棋型表,表中数据为该点的权值。
根据权值来考虑下一步应该下在哪里。
棋型表中的权值通过引用下表的值来计算。
publicvoidrenji(){
inti,j,max,jx=0,jy=0,k=0;
max=-10;
q=getGraphics();
if(gameover==false){
if(isblack==true){
if(qipanqizi[y1][x1]==-1){
Pointlinshi=newPoint(x1,y1,Color.black);
point[ii]=newPoint(linshi,q);
isblack=false;
qipanqizi[y1][x1]=0;//0代表黑棋,1代表白棋,-1代表空
if(iswin1(y1,x1,ii)==1){
Stringmsg=String.format("恭喜,你赢了!
");
JOptionPane.showMessageDialog(this,msg);
gameover=true;
}
if(iswin1(y1,x1,ii)==-1){
Stringmsg=String.format("和棋!
");
JOptionPane.showMessageDialog(this,msg);
gameover=true;
}
ii++;
}
}
if(isblack==false){
qixing();
for(i=0;i<16;i++)
for(j=0;j<16;j++){
if(qixingPC[i][j]!
=0&&max max=qixingPC[i][j]; jx=i; jy=j; } } for(i=0;i<16;i++) for(j=0;j<16;j++){ if(qixingPlayer[i][j]! =0&&max max=qixingPlayer[i][j]; jx=i; jy=j; } } Pointlinshi1=newPoint(jy,jx,Color.white); point[ii]=newPoint(linshi1,q); qipanqizi[jx][jy]=1; isblack=true; if(iswin1(jx,jy,ii)==1){ Stringmsg=String.format("哦,你输啦! "); JOptionPane.showMessageDialog(this,msg); gameover=true; } if(iswin1(jx,jy,ii)==-1){ Stringmsg=String.format("和棋! "); JOptionPane.showMessageDialog(this,msg); gameover=true; } ii++; } } } publicvoidqixing(){ inti,j; for(i=0;i<16;i++) for(j=0;j<16;j++){ qixingPC[i][j]=0; qixingPlayer[i][j]=0; } for(i=0;i<16;i++){ for(j=0;j<16;j++){ if(qipanqizi[i][j]==-1){//此处没有棋子 qixingPC[i][j]=heng(i,j,1,0)+shu(i,j,1,0) +zuoxie(i,j,1,0)+youxie(i,j,1,0); qixingPlayer[i][j]=heng(i,j,0,1)+shu(i,j,0,1) +zuoxie(i,j,0,1)+youxie(i,j,0,1); } } } } publicintheng(inthang,intlie,intnum1,intnum2){//num1当前棋子颜色,num2对方棋子颜色 inti; intleft[]=newint[4]; intright[]=newint[4]; for(i=1;i<5;i++) if(lie-i>-1&&qipanqizi[hang][lie-i]==num1) left[i-1]=num1; elseif(lie-i>-1&&qipanqizi[hang][lie-i]==-1)//空 left[i-1]=-1; elseif(lie-i>-1&&qipanqizi[hang][lie-i]==num2)//不空,为对方棋子 left[i-1]=num2; elseif(lie-i<=-1)//边界,越界置-2 left[i-1]=-2; for(i=1;i<5;i++) if(lie+i<16&&qipanqizi[hang][lie+i]==num1) right[i-1]=num1; elseif(lie+i<16&&qipanqizi[hang][lie+i]==-1)//空 right[i-1]=-1; elseif(lie+i<16&&qipanqizi[hang][lie+i]==num2)//不空,为对方棋子 right[i-1]=num2; elseif(lie+i>=16)//边界 right[i-1]=-2; returnjieguo(left,right,num1,num2); } publicintshu(inthang,intlie,intnum1,intnum2){ inti; intleft[]=newint[4]; intright[]=newint[4]; for(i=1;i<5;i++) if(hang-i>-1&&qipanqizi[hang-i][lie]==num1) left[i-1]=num1; elseif(hang-i>-1&&qipanqizi[hang-i][lie]==-1)//空 left[i-1]=-1; elseif(hang-i>-1&&qipanqizi[hang-i][lie]==num2)//不空,为对方棋子 left[i-1]=num2; elseif(hang-i<=-1)//边界 left[i-1]=-2; for(i=1;i<5;i++) if(hang+i<16&&qipanqizi[hang+i][lie]==num1) right[i-1]=num1; elseif(hang+i<16&&qipanqizi[hang+i][lie]==-1)//空 right[i-1]=-1; elseif(hang+i<16&&qipanqizi[hang+i][lie]==num2)//不空,为对方棋子 right[i-1]=num2; elseif(hang+i>=16)//边界 right[i-1]=-2; returnjieguo(left,right,num1,num2); } publicintzuoxie(inthang,intlie,intnum1,intnum2){/// inti; intleft[]=newint[4]; intright[]=newint[4]; for(i=1;i<5;i++) if(hang+i<16&&lie-i>-1 &&qipanqizi[hang+i][lie-i]==num1) left[i-1]=num1; elseif(hang+i<16&&lie-i>-1 &&qipanqizi[hang+i][lie-i]==-1)//空 left[i-1]=-1; elseif(hang+i<16&&lie-i>-1 &&qipanqizi[hang+i][lie-i]==num2)//不空,为对方棋子 left[i-1]=num2; elseif(lie-i<=-1||hang+i>=16)//边界 left[i-1]=-2; for(i=1;i<5;i++) if(hang-i>-1&&lie+i<16 &&qipanqizi[hang-i][lie+i]==num1) right[i-1]=num1; elseif(hang-i>-1&&lie+i<16 &&qipanqizi[hang-i][lie+i]==-1)//空 right[i-1]=-1; elseif(hang-i>-1&&lie+i<16 &&qipanqizi[hang-i][lie+i]==num2)//不空,为对方棋子 right[i-1]=num2; elseif(lie+i>=16||hang-i<=-1)//边界 right[i-1]=-2; returnjieguo(left,right,num1,num2); } publicintyouxie(inthang,intlie,intnum1,intnum2){//\ inti; intleft[]=newint[4]; intright[]=newint[4]; for(i=1;i<5;i++) if(hang-i>-1&&lie-i>-1 &&qipanqizi[hang-i][lie-i]==num1) left[i-1]=num1; elseif(hang-i>-1&&lie-i>-1 &&qipanqizi[hang-i][lie-i]==-1)//空 left[i-1]=-1; elseif(hang-i>-1&&lie-i>-1 &&qipanqizi[hang-i][lie-i]==num2)//不空,为对方棋子 left[i-1]=num2; elseif(lie-i<=-1||hang-i<=-1)//边界 left[i-1]=-2; for(i=1;i<5;i++) if(hang+i<16&&lie+i<16 &&qipanqizi[hang+i][lie+i]==num1) right[i-1]=num1; elseif(hang+i<16&&lie+i<16 &&qipanqizi[hang+i][lie+i]==-1)//空 right[i-1]=-1; elseif(hang+i<16&&lie+i<16 &&qipanqizi[hang+i][lie+i]==num2)//不空,为对方棋子 right[i-1]=num2; elseif(lie+i>=16||hang+i>=16)//边界 right[i-1]=-2; returnjieguo(left,right,num1,num2); } publicintjieguo(intleft[],intright[],intnum1,intnum2){ inti,j; intqixing[]=newint[9]; qixing[0]=left[3]; qixing[1]=left[2]; qixing[2]=left[1]; qixing[3]=left[0]; qixing[4]=num1; qixing[5]=right[0]; qixing[6]=right[1]; qixing[7]=right[2]; qixing[8]=right[3]; for(i=0;i<=4;i++){ if(qixing[i]==num1&&qixing[i+1]==num1 &&qixing[i+2]==num1&&qixing[i+3]==num1 &&qixing[i+4]==num1) return3000000; } for(i=0;i<=3;i++){ if(qixing[i]==-1&&qixing[i+1]==num1 &&qixing[i+2]==num1&&qixing[i+3]==num1 &&qixing[i+4]==num1&&qixing[i+5]==-1){ return300000;//? AAAA? } } for(i=0;i<=4;i++){ if(qixing[i]==num1&&qixing[i+1]==num1 &&qixing[i+2]==num1&&qixing[i+3]==num1 &&qixing[i+4]==-1) return2500;//AAAA? } for(i=0;i<=4;i++){ if(qixing[i]==-1&&qixing[i+1]==num1 &&qixing[i+2]==num1&&qixing[i+3]==num1 &&qixing[i+4]==num1) return2500;//? AAAA } for(i=0;i<=4;i++){ if(qixing[i]==num1&&qixing[i+1]==num1 &&qixing[i+2]==num1&&qixing[i+3]==-1 &&qixing[i+4]==num1){ return3000;//AAA? A } } for(i=0;i<=4;i++){ if(qixing[i]==num1&&qixing[i+1]==-1 &&qixing[i+2]==num1&&qixing[i+3]==num1 &&qixing[i+4]==num1){ return3000;//A? AAA } } for(i=0;i<=4;i++){ if
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 程序设计 五子棋 综合 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)