c五子棋实验报告doc.docx
- 文档编号:13264372
- 上传时间:2023-06-12
- 格式:DOCX
- 页数:11
- 大小:19.43KB
c五子棋实验报告doc.docx
《c五子棋实验报告doc.docx》由会员分享,可在线阅读,更多相关《c五子棋实验报告doc.docx(11页珍藏版)》请在冰点文库上搜索。
c五子棋实验报告doc
c五子棋实验报告
篇一:
五子棋对战实验报告
实验项目五子棋网络对战和聊天实验日期XX0406实验报告要求:
一、实验目的:
学习和使用socket编程,熟练软件开发
二、实验原理:
使用socket进行网络通信,java作为编程语言
三、实验要求:
编写五子棋程序可以实现联机网络对战,并且可以进行聊天
四、实验步骤、结果(程序+注释+截图)及分析:
首先拟定编程语言与开发方案,选择java语言,考虑到java可以跨平台运行,
然后决定把这个程序拆分为客户端、服务器两个部分,每个部分再分成5个小的部分实现不同功能。
1、然后考虑使用java的swing包,创建ClientChessPanel类负责棋盘部分,包括判断输赢,使用数组chesses[i][j]记录棋盘上棋子的分布,对数组进行不同的赋值表示网格节点上无棋、黑棋、白棋;使用playChessHandler作为鼠标单击事件,单击事件调用Clientskt中的函数传送棋子坐标以及输赢信息。
drawChess函数画棋子,drawGrids画网格,gameOver判断棋盘棋子分布,输赢情况。
importjavax.swing.*;
importjava.awt.*;
;
importChatOneToOneClient.Clientskt;
classClientChessPanelextendsJPanel{
privatestaticfinallongserialVersionUID=1L;
privateintspace=20;//网格间的距离
privateintgrids=30;//棋盘的网格数
privateintradius=space/2;//棋的半径
Clientsktskt;
//当chesses[i][j]=0,表示网格节点(i,j)上无棋
//当chesses[i][j]=1,表示网格节点(i,j)上放白棋
//当chesses[i][j]=2,表示网格节点(i,j)上放黑棋
privateint[][]chesses=newint[grids+1][grids+1];
privateintcurrColor=1;//当前棋的颜色
privateMouseListenerplayChessHandler=newMouseAdapter(){
publicvoidmouseClicked(MouseEvente){
if(skt.reMouseGo()){
intx=e.getX();
inty=e.getY();
//放一颗棋子
if(x=0&&y=0)
if(chesses[round(x)][round(y)]==0){
chesses[round(x)][round(y)]=currColor;
repaint();//刷新图形
skt.dataout("x:
"+String.valueOf(round(x)));
skt.dataout("y:
"+String.valueOf(round(y)));
skt.setMouseGo(false);
if(gameOver(currColor)){
skt.dataout("g:
你输了");
ClientMyDialog(skt.chat,"你赢了");
;
}
currColor=currColor==1?
2:
1;//切换棋子的颜色
}
}
}
};
publicintround(floata){//获得接近a的网格节点坐标
floatf=a/space;
returnMath.round(f);
}
publicClientChessPanel(intspace,intgrids,Clientsktskt){
this.space=space;
this.grids=grids;
this.radius=space/2;
this.skt=skt;
setBackground(Color.BLUE);
setSize(space*grids,space*grids);
addMouseListener(playChessHandler);
startChess();
}
publicvoidstartChess(){
clearGrids();//清空棋盘
currColor=1;
repaint();//刷新图形
}
privatevoidclearGrids(){
for(inti=0;i for(intj=0;j chesses[i][j]=0;
}
//画一颗棋子
privatevoiddrawChess(Graphicsg,intx,inty,intcolor){
g.setColor(color==1?
Color.GREEN:
Color.BLACK);
g.fillOval(x*space-radius,y*space-radius,radius*2,radius*2);
}
//画网格
privatevoiddrawGrids(Graphicsg){
g.setColor(Color.DARK_GRAY);
for(inti=0;i g.drawLine(0,i*space,grids*space,i*space);
g.drawLine(i*space,0,i*space,grids*space);
}
}
//接收对方下的棋坐标
publicvoidpaintChess(intx,inty){
if(x=0&&y=0){
if(chesses[x][y]==0){
chesses[x][y]=currColor;
currColor=currColor==1?
2:
1;//切换棋子的颜色
skt.setMouseGo(false);
skt.setMouseGo(true);
repaint();//刷新图形
}
}
}
//判断游戏是否结束
publicbooleangameOver(intgameOver){
intfive=0;//用于判断是否有连续5个子
for(inti=0;i for(intj=0;j if(chesses[i][j]==gameOver){
five++;
for(in(本文来自:
小草范文网:
c五子棋实验报告)tk=1;k if(chesses[i][j+k]==gameOver){
five++;
if(five==5){
returntrue;
}
}
else{
five=1;
k=5;
}
}
for(intk=1;k if(chesses[i+k][j]==gameOver){
five++;
if(five==5){
returntrue;
}
}
else{
five=1;
k=5;
}
}
for(intk=1;k if(chesses[i+k][j+k]==gameOver){
five++;
if(five==5){
returntrue;
}
}
else{
five=1;
k=5;
}
}
for(intk=1;k4;k++){//左斜向比较
if(chesses[i+k][j-k]==gameOver){
five++;
if(five==5){
returntrue;
}
}
else{
five=1;
k=5;
}
}
}
}
five=0;
}
returnfalse;
}
publicvoidpaintComponent(Graphicsg){//覆盖paintComponent()方法
super.paintComponent(g);//必须先调用父类的方法
drawGrids(g);//画网格
for(inti=0;i for(intj=0;j if(chesses[i][j]!
=0)
drawChess(g,i,j,chesses[i][j]);//画棋子
}
}
2、ClientComponentPopupMenu类主要负责聊天的部分,使用JTextField并且对其添加单击事件以及鼠标事件,可以实现文本的剪贴、复制粘贴等功能。
importjava.awt.*;
;
;
importjavax.swing.*;
;
publicclassClientComponentPopupMenuextendsJPopupMenuimplementsMouseListener,ActionListener{
privatestaticfinallongserialVersionUID=1L;
publicstaticClientComponentPopupMenusharedInstance=null;
publicstaticvoidinstallToComponent(JTextComponentc){
if(cinstanceofJTextArea&&!
(cinstanceofJPasswordField)){
c.addMouseListener(ClientComponentPopupMenu.getSharedInstance());
}
elseif(cinstanceofJTextField&&!
(cinstanceofJPasswordField)){
c.addMouseListener(ClientComponentPopupMenu.getSharedInstance());
}
}
publicstaticvoiduninstallFromComponent(JTextComponentc){
if(cinstanceofJTextArea&&!
(cinstanceofJPasswordField)){
c.removeMouseListener(getSharedInstance());
}
elseif(cinstanceofJTextField&&!
(cinstanceofJPasswordField)){
c.removeMouseListener(getSharedInstance());
}
}
JMenuItemcutItem,copyItem,pasteItem,deleteItem,selectAllItem,printItem;
//构造器
篇二:
五子棋课程设计实验报告
西南交通大学
程序语言综合课程设计
五子棋游戏
课程《程序语言综合课程设计》学院信息科学与技术学
专业软件工程
姓名
学号XX9050
日期XX年月日
目录
第一章课程设计的目的和要求..............................................................3
1.1课程设计的目的...........................................................................3
1.2课程设计的要求...........................................................................3
1.3课程设计的实验环境...................................................................3
第二章功能描述.......................................................................................4
第三章总体设计.......................................................................................5
3.1功能模块设计...............................................................................5
3.1.1任务执行流程图..................................................................5
3.1.2下棋函数流程图..................................................................6
3.2数据结构设计...............................................................................7
3.2.1定义结构体..........................................................................7
3.2.2定义数组..............................................................................7
3.2.3全局变量..............................................................................7
3.3函数功能描述...............................................................................7
第四章程序实现.......................................................................................8
4.1源码分析.........................................................................................8
4.2运行结果及界面介绍..................................................................22
第五章后记.............................................................................................27
第一章课程设计的目的和要求
1.1课程设计的目的
1.加深对C语言数据类型,运算,语句结构及其程序设计的基本方法理解和掌握;
2.熟练掌握流程图的绘制、程序设计文档的书写;
3.通过编写一个完整的程序,一方面可以检查我们这学期的学习情况,为以后的学习打下坚实的基础;
4.熟悉C语言游戏编程,掌握五子棋游戏开发的基本原理,从而为以后的程序开发奠定基础。
1.2课程设计的要求
1、编写程序代码,调试所写程序使其能够正确运行;
2、能进行基本的五子棋操作,有图形界面,能够用键盘操作;
3、能够实现悔棋、存档和读档等附加功能
1.3课程设计的实验环境
该课程设计在设计与实验过程中需要在windowsXP系统/windowsXX以上系统中进行,程序设计要求在visualC++6.0平台中进行,完成代码的编写、编译、调试、测试等工作。
本游戏对计算机硬件和操作系统要求极低,所以在这里只是把自己的电脑硬件参数和系统参数列下:
硬件:
Cpu:
2.1GHZ,内存,2GB,硬盘:
320GB,操作系统:
windowsxp软件环境:
安装VC++6.0
第二章功能描述
本程序用C语言实现了五子棋游戏,能进行基本的五子棋操作。
程序能实现界面的初始化功能、下棋功能、人机智能对战功能、胜负判断功能、悔棋功能、读档及存档功能,通过键盘操作控制下棋。
(1)显示欢迎界面。
在游戏开始时出现一个欢迎的界面同时介绍了游戏的规则;
(2)初始化功能。
程序初始化屏幕和棋盘,默认玩家先行。
(3)下棋操作。
利用W、S、A、D及空格键实现下棋操作,在下棋过程中能随时按ESC键退出。
(4)人机智能对战功能。
电脑根据玩家的下棋对棋盘进行智能分析,然后下棋,实现人机对弈。
(5)悔棋功能。
玩家可以有三次悔棋机会。
(6)胜负判断功能。
程序能对下棋的结果进行判断,分出胜负。
并显示获胜方。
(7)读档、存档功能。
游戏中途退出会提示是否存档,如果存档,则下次开始的时候会提示是否读档继续上次的游戏。
第三章总体设计
3.1功能模块设计
3.1.1任务执行流程图
篇三:
五子棋源码实验报告及人机对战说明
1.五子棋对战说明
2.实验报告
3.源代码
五子棋
作品特点:
C语言程序五子棋
作品功能:
五子棋人机对战,人人对战。
目录:
1五子棋介绍。
2五子棋棋型介绍。
3人人对战的实现。
4电脑下子的实现。
5棋型价值的计算。
6胜利及棋型的判断。
7补充说明
1五子棋介绍。
五子棋是一种两人对弈的纯策略型棋类游戏。
只要任意一方在棋盘上且同一个回合上连为五子为胜。
还有禁手规则,在本程序中不作讨论。
2五子棋棋型介绍。
本程序中的棋型均为本人自定义。
本程序总共设计35种棋型。
●表示玩家的棋子,◎表示电脑的棋子。
以下称电脑方为己方,玩家方为对方。
从一空点向某一方向判断该方向的棋型。
某一方向指1-8方向从右顺时针开始数。
(1)空棋型。
从一空点向一方向看连续2个为空的棋
型。
空棋型共1种。
如图,从左端的空点向右看会发现
有连续2个空点。
(2)活棋型。
2端无挡的棋型为活棋型。
活棋型共8
种:
己方4种,对方4种。
左图为己活3。
从左端的空点
向右看会发现己方有连续的3个子,且右端无挡。
故
该点的1方向为己活3。
左图为对活2
(3)冲棋型。
1端无挡的棋型为冲棋型。
冲棋型共9
种:
己方4种,对方4种,边界1种。
左图为边界冲棋型。
空点的右端为边界。
或左图为己冲2。
从左
端的空点向右看会发现己方有连续的2个子,且右端
有挡(此处有挡表示有对方的子或为边界)。
故该点的
1方向为己冲2。
左图为对冲4。
(4)空活棋型。
从一空点向一方向看有1个空点,继
续看有己方或对方的活棋型。
空活棋型共8种:
己方4种,对方4种。
左图为己空活2。
从左端的空点
向右看有1个空点,继续看会发现己方有连续的2个
子,且右端无挡。
故该点的1方向为己空活2。
左图为对空活1。
(5)空冲棋型。
从一空点向一方向看有1个空点,继
续看有己方或对方或边界冲棋型。
空冲棋型共9
种:
己方4种,对方4种,边界1种。
左图为边界空冲棋型。
空点的右端为空点再
右看为边界。
或左图为己空冲2。
从左端的空点向右看有1个空点,继续看会发现己方
有连续的2个子,且右端有挡。
故该点的1方向为己
空冲2。
3人人对战的实现。
双方玩家轮流下子,直到一方形成五连即判为胜方。
下子时输入棋盘上显示的对应坐标。
如果某方需要悔棋,则输入1515即可。
悔棋只能悔一步。
在人机对战中亦可悔棋。
4电脑下子的实现。
人机对战中电脑下子是通过AI(int*p,int*q)这个函数实现的。
用p、q返回下子的坐标。
先历遍棋盘上所有点,如发现一个空点则调用函数value(intp,intq)计算该空点的价值。
每个点又由8个方向的棋型组成。
调用函数qixing(intn,intp,intq)判断空点pq在n方向上的棋型号。
对每种棋型进行赋值,然后对各个方向的棋型进行分析。
最后计算出该空点的价值。
如此找到棋盘上价值最大的空点,则电脑在该处下子。
5棋型价值的计算。
棋型价值的计算是通过函数value(intp,intq)实现
的。
先调用函数qixing(intn,intp,intq)判断空点pq在n方向上的棋型号。
n为1-8方向从右顺时针开始数。
对8个方向的棋型进行分析后给出该点的价值。
各种棋型的价值存在数组a[2][4][4]中。
本程序将两相反方向的棋型进行合在一起进行分析。
本程序分为六类进行讨论。
①空棋型and其他。
②边界冲棋型and其他。
③边界空冲棋型and其他。
④己活己活己活己冲对活对活对活对冲。
⑤己活对活己活对冲己冲对活己冲对冲。
⑥其他棋型。
⑦
6胜利及棋型的判断。
胜利及棋型的判断都调用了函数yiwei(intn,int*i,int*j)。
在n方向上对坐标ij移位。
n为1-8方向从右顺时针开始数。
胜利的判断:
每下一次子从该点向1方向移位,移位后判断新点是否与下的子相同。
如相同则继续移位判断,否则转向判断即n+=4;如转向后仍然没五连,则换下一个方向判断即n-=3;直到出现五连则胜利,如果8个方向判断完都没有五连则返回0,表示还未胜利。
棋型的判断:
棋型的判断主要运用switch语句。
在某一方向移位后判断该点的状态。
最后得出该方向上的棋型号。
7补充说明
1.在WIN7环境下用VC++运行棋盘之间有空隙,影响美观。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 五子棋 实验 报告 doc