《C++程序设计 ISS1060》程序设计实践第一次作业指导书PC.docx
- 文档编号:4649075
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:39
- 大小:5.60MB
《C++程序设计 ISS1060》程序设计实践第一次作业指导书PC.docx
《《C++程序设计 ISS1060》程序设计实践第一次作业指导书PC.docx》由会员分享,可在线阅读,更多相关《《C++程序设计 ISS1060》程序设计实践第一次作业指导书PC.docx(39页珍藏版)》请在冰点文库上搜索。
《C++程序设计ISS1060》程序设计实践第一次作业指导书PC
软件工程系
《C++程序设计I(SS1060)》
程序设计实践(第一次作业)指导书
(PC平台)
2009-2010学年第二学期
课程名称:
C++程序设计I(IBMCY320)
课程代码:
SS2008
计划学时:
72学分:
4
课程性质:
必修、考试面向专业:
软件工程
课程负责人:
邹立杰
授课教师:
邹立杰、毛养红、刘志伟、聂长红
班级:
姓名:
学号:
广州大学华软软件学院
SouthChinaInstituteofSoftwareEngineering,GuangZhouUniversity
1、课程设计题目C++实现三分查找与扑克牌猜牌游戏
2、程序功能:
游戏说明:
游戏的名叫作围猎你(Huntyou)、或者叫做捕获你的思想(CaptureYourMind)
在程序界面上的3列扑克牌中,在你的意念中记住一张牌,然后用鼠标点击这颗牌所在的列下方的按钮,再次点击你刚才的意念中所记住的那颗牌所在的列下方的按钮,如此再做一次。
那么你刚才在你的意念中所记住的那颗牌就会被捕捉到。
程序的运行界面如下图。
2、程序设计中的知识要点和主要算法:
实际上整个游戏过程是一种快速查找过程。
实现该算法是用2个数组,以及用这2个数组的相互转换来实现。
这种查找算法是可以被成为三分查找的算法。
数据结构与算法中有一种二分查找的算法,是对有序的线性结构中的快速查找算法。
这种三分查找是比二分查找更快的在线性结构中的快速查找算法。
整个过程是:
随机从54张牌中抽取27张放到一个数组All[27]中,然后将其变换打9行3列的数组col[9][3]中,把该数组中对应牌绘制到软件界面上,玩家记住一颗牌,并指定所在的列,按下对应列的按钮,程序做col->All变换,再做All->col变换,并把col中对应的牌会知道软件界面上;同样的操作,选择3次即可找出你在意念中所记住的那颗牌。
程序涉及到数组、函数、变量、数组做函数形参等多方面C++程序设计语言知识和技巧。
(1)发牌操作函数,数组b到数组a的变换
发牌示意图:
将从54张扑克牌中随机抽取27张,放到数组b[27]中,发牌到数组a中,在软件界面按照a数组排列。
发牌规则如下图所示:
图中左边是b数组,右边是a数组。
图中可以看出b数组和a数组元素的对应关系,即发牌规则。
b[27]
b[0]
b[1]
b[2]
b[3]
b[4]
b[5]
b[6]
b[7]
b[8]
b[9]
b[10]
b[11]
B12]
b[13]
b[14]
b[15]
b[16]
b[17]
b[18]
b[19]
b[20]
b[21]
b[22]
b[23]
b[24]
b[25]
b[26]
a[9][3]
b[0]
b[1]
b[2]
b[3]
b[4]
b[5]
b[6]
b[7]
b[8]
b[9]
b[10]
b[11]
b[12]
b[13]
b[14]
b[15]
b[16]
b[17]
b[18]
b[19]
b[20]
b[21]
b[22]
b[23]
b[24]
b[25]
b[26]
发牌操作定义一个函数,这个函数能实现从数组b到数组a的转换,即发牌。
函数定义如下:
voidCPukeView:
:
swap2(inta[9][3],intb[27])
{
for(intn=0;n<27;n++)
{
a[n/3][n%3]=b[n];
}
}
(2)数组a到数组b的变换函数
做发牌操作后,根据玩家给出的他所记忆的牌所在的列x,做a->b变换,变换后再次按上边的算法发牌,变换27张牌做3分查找,变换3次即可查找的玩家所记忆的那张牌。
算法可从下边给出的函数看出。
下面是数组a到数组b变换的示意图。
a[0][1]
a[1][1]
a[2][1]
a[3][1]
a[4][1]
a[5][1]
a[6][1]
a[7][1]
a[8][1]
a[0][1]
a[1][1]
a[2][1]
a[3][1]
a[4][1]
a[5][1]
a[6][1]
a[7][1]
a[8][1]
a[0][2]
a[1][2]
a[2][2]
a[3][2]
a[4][2]
a[5][2]
a[6][2]
a[7][2]
a[8][2]
x=1时
a[9][3]
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
a[2][0]
a[2][1]
a[2][2]
a[3][0]
a[3][1]
a[3][2]
a[4][0]
a[4][1]
a[4][2]
a[5][0]
a[5][1]
a[5][2]
a[6][0]
a[6][1]
a[6][2]
a[7][0]
a[7][1]
a[7][2]
a[8][0]
a[8][1]
a[8][2]
b[27]
a[0][0]
a[1][0]
a[2][0]
a[3][0]
a[4][0]
a[5][0]
a[6][0]
a[7][0]
a[8][0]
a[0][1]
a[1][1]
a[2][1]
a[3][1]
a[4][1]
a[5][1]
a[6][1]
a[7][1]
a[8][1]
a[0][2]
a[1][2]
a[2][2]
a[3][2]
a[4][2]
a[5][2]
a[6][2]
a[7][2]
a[8][2]
x=2时
a[9][3]
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
a[2][0]
a[2][1]
a[2][2]
a[3][0]
a[3][1]
a[3][2]
a[4][0]
a[4][1]
a[4][2]
a[5][0]
a[5][1]
a[5][2]
a[6][0]
a[6][1]
a[6][2]
a[7][0]
a[7][1]
a[7][2]
a[8][0]
a[8][1]
a[8][2]
b[27]
a[0][0]
a[1][0]
a[2][0]
a[3][0]
a[4][0]
a[5][0]
a[6][0]
a[7][0]
a[8][0]
a[0][2]
a[1][2]
a[2][2]
a[3][2]
a[4][2]
a[5][2]
a[6][2]
a[7][2]
a[8][2]
a[0][1]
a[1][1]
a[2][1]
a[3][1]
a[4][1]
a[5][1]
a[6][1]
a[7][1]
a[8][1]
x=3时
a[9][3]
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
a[2][0]
a[2][1]
a[2][2]
a[3][0]
a[3][1]
a[3][2]
a[4][0]
a[4][1]
a[4][2]
a[5][0]
a[5][1]
a[5][2]
a[6][0]
a[6][1]
a[6][2]
a[7][0]
a[7][1]
a[7][2]
a[8][0]
a[8][1]
a[8][2]
b[27]
a->b变换函数:
voidCPukeView:
:
swap1(inta[9][3],intb[27],intx)
{
switch(x)
{
case1:
{
for(inti=0;i<9;i++)
{
b[i]=a[i][1];
b[i+9]=a[i][0];
b[i+18]=a[i][2];
}
break;
}
case2:
{
for(inti=0;i<9;i++)
{
b[i]=a[i][0];
b[i+9]=a[i][1];
b[i+18]=a[i][2];
}
break;
}
case3:
{
for(inti=0;i<9;i++)
{
b[i]=a[i][0];
b[i+9]=a[i][2];
b[i+18]=a[i][1];
}
break;
}
}
}
(3)从54张牌中随机抽取27张牌函数
使用该函数构造发牌数组All[27],实际发牌操作是将A[27]作为实参,调用上边定义的发牌函数。
从54张牌中随机抽取27张牌函数定义如下:
voidCPukeView:
:
range(int[])
{
ntk;
boolcardID[55]={false};
cardID[54]=true;
for(intn=0;n<27;n++)
{
k=54;
int&c=All[n];
while(cardID[k])
{
k=rand()%54;
}
cardID[k]=true;
c=k;
}
}
3、程序设计要求:
(1)先使用真正的扑克牌,实际操作该项目中的猜牌游戏,理解游戏的原理规则。
(2)根据使用真正的扑克牌游戏的操作,构造算法。
(3)参考本程序设计指导书,使用VC++6.0或更高版本实现本项目中要求的游戏程序功能。
(4)程序界面美观,能正确实现游戏功能。
(5)本次作业要求完成项目后,撰写《C++程序设计I(SS1060)》程序设计实践(第一次作业)报告书,封面和内容格式参考相关文件。
(在作业FTP上下载)。
本次作业在第8周开始布置、第11周上交,上交打包项目文件(上传到FTP服务器)和打印好的报告书。
报告书撰写要格式规范、封面严格按照给定的模板。
姓名、学号、班级信息打印齐全。
否则重新打印。
本次作业3学分。
4、程序设计指导:
下面是使用VC++6.0实现该软件的详细过程。
(1)程序框架
1)启动VC++6.0,建立一个MFCSDI工程,缺省配置;
项目类结构图如下类视图:
VC++APPWizard自动生成了如图中5个类。
本程序代码只涉及到其中2个类CMainFrame类和CPukeView类,主要算法都在CPukeView类中实现。
类视图截图如下图:
2)修改VmainFrame类的PreCreateWindow(CREATESTRUCT&cs)函数:
BOOLCMainFrame:
:
PreCreateWindow(CREATESTRUCT&cs)
{
if(!
CFrameWnd:
:
PreCreateWindow(cs))
returnFALSE;
cs.style=WS_CAPTION|FWS_ADDTOTITLE|WS_SYSMENU|WS_MINIMIZEBOX;
cs.hMenu=0;
cs.x=100;
cs.y=50;
cs.cx=1034;
cs.cy=650;
returnTRUE;
}
运行:
(2)给View类添加消息、按钮、消息映射
1)定义消息ID:
在CPukeView类的头文件中添加消息ID定义:
#defineID_OK0100
#defineID_OK1101
#defineID_OK2102
#defineID_OK3103
项目代码截图如下图:
2)添加消息处理函数
在CPukeView类的头文件里添加函数定义
voidOnOK0();
voidOnOK1();
voidOnOK2();
voidOnOK3();
在CPukeView类的实现文件里添加函数实现
voidCPukeView:
:
OnOK0()
{
}
voidCPukeView:
:
OnOK1()
{
}
voidCPukeView:
:
OnOK2()
{
}
voidCPukeView:
:
OnOK3()
{
}
项目代码截图如下图:
3)在CPukeView类的实现文件里添加消息映射
ON_BN_CLICKED(ID_OK0,OnOK0)
ON_BN_CLICKED(ID_OK1,OnOK1)
ON_BN_CLICKED(ID_OK2,OnOK2)
ON_BN_CLICKED(ID_OK3,OnOK3)
项目代码截图如下图:
4)给CPukeView类添加按钮变量:
CButtonb1,b2,b3,b4;
项目代码截图如下图:
5)使用CalssWizard给CPukeView类添加OnCtreate()函数:
选择菜单项View/ClassWizard打开类向导对话框,选择MessageMaps选项卡,选择CPukeView类,在Messages中找到WM_CREATE消息,单击AddFunction按钮,
OnCreate()函数就添加到CPukeView类中。
6)修改OnCreate()函数:
把按钮绑定到消息ID上,使按钮能响应消息事件。
intCPukeView:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CView:
:
OnCreate(lpCreateStruct)==-1)
return-1;
b1.Create(_T("打开"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,CRect(130,480,230,510),this,ID_OK0);
b2.Create(_T("保存"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,CRect(280,480,380,510),this,ID_OK1);
b3.Create(_T("关闭"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,CRect(430,480,530,510),this,ID_OK2);
b4.Create(_T("查找"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,CRect(130,530,530,560),this,ID_OK3);
return0;
}
项目代码截图如下图:
运行效果:
(3)添加背景图片。
准备好大小合适的背景图片,BMP格式,放到res\文件夹下,要求为256色,更多色,如64K色,亦可,只是不能在VC++工程中显示,不影响编程使用。
1)为工程添加图片资源,资源ID为IDB_BK,在“插入”菜单中选插入资源菜单项,在出现的对话框中选择资源。
2)在CPukeView类的头文件中添加变量:
CDCbackground;
CBitmapm_background;
项目代码截图如下图:
3)修改CPukeView:
:
PreCreateWindow(CREATESTRUCT&cs)函数:
BOOLCPukeView:
:
PreCreateWindow(CREATESTRUCT&cs)
{
//TODO:
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
m_background.LoadBitmap(IDB_BK);
returnCView:
:
PreCreateWindow(cs);
}
项目代码截图如下图:
4)删除intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)函数中由AppWizard自动生成的代码,下边红色部分代码,以去掉界面上的工具栏。
intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CFrameWnd:
:
OnCreate(lpCreateStruct)==-1)
return-1;
if(!
m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP
|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||
!
m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failedtocreatetoolbar\n");
return-1;//failtocreate
}
if(!
m_wndStatusBar.Create(this)||
!
m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failedtocreatestatusbar\n");
return-1;//failtocreate
}
//TODO:
Deletethesethreelinesifyoudon'twantthetoolbarto
//bedockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return0;
}
运行效果:
(4)在程序界面上摆放扑克牌和All数组、col数组交换算法
1)添加位图资源:
(添加方法参照添加背景位图资源),资源标示为Card。
添加方法见上边添加背景资源。
位图大小为923x480,每颗牌大小为71x96(71x13=923,96x5=480)如下图:
用54个数字(0-53)表示54棵扑克牌。
在位图中对应的位置为:
黑桃A为0,黑桃2为1,以此类推,黑桃K为12,红桃A为13,…,最后大王牌为53。
在View类中声明一个整形数组All[27]来存放软件界面上的27张牌。
这27张拍是从54棵牌中随机选出27张牌且不能有重复,并把对应的表示扑克牌的数字放到整形数组All[27]中。
在程序中使用下边的函数来实现:
voidCPukeView:
:
range(int[])
{
intk;
boolcardID[55]={false};
cardID[54]=true;
for(intn=0;n<27;n++)
{
k=54;
int&c=All[n];
while(cardID[k])
{
k=rand()%54;
}
cardID[k]=true;
c=k;
}
}
在软件界面上把这27张牌等分成三列摆放,对应的表示扑克牌的数字存放到一个9x3整形数组中,数组声明为col[9][3]。
表示牌的数字与位图中对应牌的位置的对应关系:
设表示扑克牌的数字为n,在应位图的行为m,列为n,则:
m=n/13
n=n%13
那么对应的扑克牌的位图的左上角坐标为:
(n*71,m*96)
如红桃10的n值为22,则其在资源位图上的行列值为:
m=22/13=1;
n=22%13=9;
所以红桃10在资源上的左上角坐标为:
(n*71,m*96)=(9*71,1*96)=(639,96)
程序中可以根据这个坐标从位图资源上找到扑克牌的对应的位图左上角坐标位置。
数组col[9][3]对应软件界面上的3列扑克牌,数组元素的值对应一棵特定的扑克牌,那么把col[9][3]对应的三列扑克牌绘制到软件界面上可用下面的函数:
voidCPukeView:
:
drawBK()
{
CDC*pdc=GetDC();
pdc->BitBlt(0,0,1024,640,&background,0,0,SRCCOPY);
for(intn=0;n<9;n++)
{
pdc->BitBlt(150,100+n*30,71,96,&card,((col[n][0])%13)*71,((col[n][0])/13)*96,SRCCOPY);
pdc->BitBlt(300,100+n*30,71,96,&card,((col[n][1])%13)*71,((col[n][1])/13)*96,SRCCOPY);
pdc->BitBlt(450,100+n*30,71,96,&card,((col[n][2])%13)*71,((col[n][2])/13)*96,SRCCOPY);
}
b1.Invalidate(true);
b2.Invalidate(true);
b3.Invalidate(true);
b4.Invalidate(true);
}
2)All和col矩阵变换算法:
voidCPukeView:
:
swap1(inta[9][3],intb[27],intx)
{
switch(x)
{
case1:
{
for(inti=0;i<9;i++)
{
b[i]=a[i][1];
b[i+9]=a[i][0];
b[i+18]=a[i][2];
}
break;
}
case2:
{
for(inti=0;i<9;i++)
{
b[i]=a[i][0];
b[i+9]=a[i][1];
b[i+18]=a[i][2];
}
break;
}
case3:
{
for(inti=0;i<9;i++)
{
b[i]=a[i][0];
b[i+9]=a[i][2];
b[i+18]=a[i][1];
}
break;
}
}
}
voidCPukeView:
:
swap2(inta[9][3],
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+程序设计 ISS1060 C+程序设计 ISS1060程序设计实践第一次作业指导书PC C+ 程序设计 ISS1060 实践 第一次 作业 指导书 PC