版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
软件工程系
《C++程序设计I(SS1060)》
程序设计实践(第一次作业)指导书
(PC平台)
2009-2010学年第二学期
课程名称:C++程序设计I(IBMCY320)
课程代码:SS2008
计划学时:72学分:4
课程性质:必修、考试面向专业:软件工程
课程负责人:邹立杰
授课教师:邹立杰、毛养红、刘志伟、聂长红
班级:_________________________
姓名:_________________________
学号:________________________
广州大学华软软件学院
SouthChinaInstituteofSoftwareEngineering,GuangZhouUniversity
课程设计指导书C++程序设计I(SS1060)
1、课程设计题目C++实现三分查找与扑克牌猜牌游戏
2、程序功能:
游戏说明:游戏的名叫作围猎你(Huntyou)、或者叫做捕获你的思想(CaptureYourMind)
在程序界面上的3列扑克牌中,在你的意念中记住一张牌,然后用鼠标点击这颗牌所在的列下方的
按钮,再次点击你刚才的意念中所记住的那颗牌所在的列下方的按钮,如此再做一次。那么你刚才在你
的意念中所记住的那颗牌就会被捕捉到。
程序的运行界面如下图。
2、程序设计中的知识要点和主要算法:
实际上整个游戏过程是种快速查找过程。实现该算法是用2个数组,以及用这2个数组的相互转
换来实现。这种查找算法是可以被成为三分查找的算法。数据结构与算法中有一种二分查找的算法,是
对有序的线性结构中的快速查找算法。这种三分查找是比二分查找更快的在线性结构中的快速查找算法。
整个过程是:
随机从54张牌中抽取27张放到一个数组All[27]中,然后将其变换打9行3列的数组col[9]⑶中,把该
数组中对应牌绘制到软件界面上,玩家记住一颗牌,并指定所在的列,按下对应列的按钮,程序做col->All
变换,再做All->col变换,并把col中对应的牌会知道软件界面上;同样的操作,选择3次即可找出你在
意念中所记住的那颗牌。
程序涉及到数组、函数、变量、数组做函数形参等多方面C++程序设计语言知识和技巧。
第2页
课程设计指导书C++程序设计I(SS1060)
(1)发牌操作函数,数组b到数组a的变换
发牌示意图:将从54张扑克牌中随机抽取27张,放到数组b[27]中,发牌到数组a中,在软件界面
按照a数组排列。发牌规则如下图所示:图中左边是b数组,右边是a数组。图中可以看出b数组和a
数组元素的对应关系,即发牌规则。
b[27]
b[0]
b[l]
b[2]
b[3J
b[4]
b[5]
a[9][3]
b[6]
b[7]
b[8]b[0]bfl]bf2]
b[9]b[3]b[4]b[5]
b[10]b[6]b[7]b[8]
b[ll]b[9]b|10]b[H]
B12]b[12]b[13]b[14]
b[13]b[15]b[16]b[17]
b[14]b[18]b[191b[201
b[15]b[21]b[22Jb[23J
b[16]b[24Jb[25Jb[26J
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];
}
)
第3页
课程设计指导书C++程序设计I(SS1060)
(2)数组a到数组b的变换函数
做发牌操作后,根据玩家给出的他所记忆的牌所在的列x,做a->b变换,变换后再次按上边的算法
发牌,变换27张牌做3分查找,变换3次即可查找的玩家所记忆的那张牌。算法可从下边给出的函数看
出。下面是数组a到数组b变换的示意图。
a[0]⑴
x=l时
a[9][3]
a⑺[1]
a⑼[1]
a⑴⑴
b[27]a⑵[1]
a[0][0]a[0][l]a[0H-
a[l][0]a[l][l]a[l][2]
a[2][0]a[2][l]a[2][2]a⑸[1]
a[3][0Ja[3][lja[3][2]a⑹⑴
a[4]lOJa[4][lja[4J[2]a⑺[1]
a[5][0]a[5][l]a[5][2]
a⑼⑼
a[6][0]a[6][l]a[6][2]a[0]⑵
⑴⑼
a[71[0]a[7][l]a[7][2]a[l]⑵a
a[2][0]
a[8J[0Ja[8][l]a[8H2]a[2][2]
a[3北2]a[3][0]
a[4][2]a⑷⑼
a[5][2]a[5][0]
a⑹[0]
a⑹⑵
a⑺⑵a⑺[0]
北
a[8][2]a[80]
a⑼[1]
a⑵[1]
x=2时
a[9][3]a⑸⑴
a⑺[1]
a[0][0Ja[0][lJa[0][2]b[27]
a[l][0]a[l][l]a[l][2]
a[0][2]
a[2][0]a[2][l]a[2][2]
a[3][01a[3][lla[3][2]a[l]⑵
⑵⑵
a[4]f0]a[4][l]a[4][2]a
a[5][0]a[5][l]a[5][2]a[3][2]
⑷⑵
a[6][0Ja[6][lja[6][2]a
⑸⑵
a[7][0]a[7][l]a[7][2]a
a[8][01a[8][lla[8][2]a[6][2]
a⑺⑵
a[8][2]
第4页
课程设计指导书C++程序设计I(SS1060)
x=3时a[0][0]
a[l]⑼
a[2][0]
a[9][3]
a[3][0]
a[4][0]
a[01[0]a[0][l]a[0][2]a[5][0]
a[l][01a[l][l]a[l][2]a⑹[0]
a[2][0]a[2][l]a[2][2]a⑺⑼
a[8][0]
a[3][0Ja[3][l]a[3J[2Jb[27]
a[4][0]a[4][l]a[4][2]a[0][2]
a[5][0]a[5][l]a[5][2]
a[61[0]a[6][lla[6][2]a[2][2]
a[7][0]a[7][l]a[7][2]a[3][2]
a[8J[0Ja[8][lja[8J[2]a[4]⑵
a[5][2]
a[6][2]
a[7][2]
a->b变换函数:a[8][2]
gmi
voidCPukeView::swap1(inta[9][3],intb[27],intx)
a[l]⑴
(
a[2][l]
switch(x)
a[3][l]
(
a[41[l]
case1:
a[5]⑴
(
a网⑴
for(inti=0;i<9;i++)
(
b[i]=a[i][l];
b[i+9]=a[i][0];
b[i+18]=a[i][2];
)
break;
)
case2:
(
for(inli=0;i<9;i++)
(
b[i]=a[i][0];
b[i+9]=a[i][l];
b[i+18]=a[i]⑵;
)
break;
)
case3:
(
for(inti=0;i<9;i++)
(
b[i]=a[i]lOJ;
b[i+9]=a[i][2];
b[i+18]=a[i][l];
}
break;
)
第5页
课程设计指导书C++程序设计I(SS1060)
(3)从54张牌中随机抽取27张牌函数
使用该函数构造发牌数组All[27],实际发牌操作是将A[27]作为实参,调用上边定义的发牌函数。
从54张牌中随机抽取27张牌函数定义如下:
voidCPukeView::range(int[J)
(
ntk;
boolcardID[55]={false);
cardID[54]=true;
for(intn=0;n<27;n++)
(
k=54;
int&c=All[n];
while(cardID[kJ)
(
k=rand()%54;
)
cardID[k]=true;
c=k;
)
)
3、程序设计要求:
(i)先使用真正的扑克牌,实际操作该项目中的猜牌游戏,理解游戏的原理规则。
(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类中实现。
类视图截图如下图:
第6页
课程设计指导书C++程序设计I(SS1060)
工作空间x
一阚pukeclasses:
ECAboutDIg
+飞CMainFrame
由飞CPukeApp
+飞CPukeDoc
+飞CPukeView
+口Globals
■:ClassView峭ResourcWiew司FileView
2)修改VmainFrame类的PreCreateWindow(CREATESTRUCT&cs)函数:
BOOLCMainFrame::PreCreateWindow(CREATESTRUCT&cs)
(
if(!CFrameWnd::PreCreateWindow(cs))
returnFALSE;
cs.style=WS_CAPTIONIFWS_ADDTOTITLEIWS_SYSMENUIWS_MINIMIZEBOX;
cs.hMenu=0;
cs.x=100;
cs.y=5O;
cs.cx=1034;
cs.cy=650;
returnTRUE;
)
运行:
第7页
课程设计指导书C++程序设计I(SS1060)
(2)给View类添加消息、按钮、消息映射
1)定义消息ID:
在CPukeView类的头文件中添加消息ID定义:
#defineID_OKO100
#defineID_OK1101
#defineID_OK2102
#defineID_OK3103
项目代码截图如下图:
//pukelliew.h:interfaceoftheCPukeUiew
//
///////////////////////////////////////////
ttif?deFined(AFX_PUKEUIEW_H_B99A156C_A954_
^defineAFX_PUKEUIEW_H_B99A156C_A954Z40CDZ
ttif_MSC_UER>1000
ttpragnaonce
ttendif//_MSC_UER>1000
林defineID_OK0100
ttdefineID^OKI101
ttdeFineID[()K2102
UdeFineID10K3103
classCPukeUiew:publicCUiew
2)添加消息处理函数
在CPukeView类的头文件里添加函数定义
voidOnOKO();
voidOnOKl();
voidOnOK2();
voidOnOK3();
在CPukeView类的实现文件里添加函数实现
voidCPukeView::OnOKO()
voidCPukeView::OnOKl()
voidCPukeView::OnOK2()
voidCPukeView::OnOK3()
项目代码截图如下图:
第8页
课程设计指导书C++程序设计I(SS1060)
//pukeUiew.h:interfaceoftheCPukeUiewcl
/////////////////////////////////////////////
ttif?del:ined(AFX_PUKEUIEW_H_B99A156C_A954_4(
ttdefineAFX_PUKEUIEW_H_B99A156C_A95O0CDZBE
ttiF_MSC_UER>1000
ttpragmaonce
ttendif//_MSC_UER>1000
UdeFineID_0K81GG
UdeFineID10K1181
ttdefineID[()K2102
ttdeFineID二0K3103
classCPukeUiew:publicCUiew
<
protected://createfromserializationonly
CPukeUiew();
DECLARE_DVNCREATE(CPukeUiew)
//Attributes
public:
CPukeDoc*GetDocunent();
uoid0n0K0();
uoid0n0K1();
uoid0n0K2();
uoid0n0K3();
3)在CPukeView类的实现文件里添加消息映射
ON_BN_CLICKED(ID_OKO,OnOKO)
ON_BN_CLICKED(ID_OKl,OnOKl)
ON_BN_CLICKED(ID_OK2,OnOK2)
ON_BN_CLICKED(ID_OK3,OnOK3)
项目代码截图如下图:
第9页
课程设计指导书C++程序设计I(SS1060)
//pukeUiew.cpp:implementationoftheCPukeUi
^include"stdafx.h"
^include,,puke.h"
ttinclude"pukeDoc.h"
^include"pukeUiew.h"
ttifdef_DEBUG
ttdefine~newDEBUG_NEW
ttundefTHIS_FILE-
staticchar_THIS__FILE[]=_FILE_;
ttendif
///////////////////////////////////////////////
//CPukeUiew
IMPLEMENT_DVNCREATE(CPukeUiew,CUiew)
BEGIN_MESSAGE_MAP(CPukeUiew,CUiew)
//<{AFX__MSG_MAP(CPukeUievi)
ON__WM_CREATE()
//}}AFX_MSG_MAP
//Standardprintingcommands
ON_BN_CLICKED(ID_OK0,OnOKO)
ONZBNZCLICKED(ID^OKI,0n0K1)
ON-BN2CLICKED(ID_0K2,0n0K2)
ONZBN2CLICKED(ID2OKa,0n0K3)
4)给CPukeView类添加按钮变量:
CButtonbl,b2,b3,b4;
项目代码截图如下图:
//pukeUiew.h:interfaceoftheCPukeUiewcla
//////////////////////////////////////////////
ttif?deFined(AFX_PUKEUIEW_H_B99A156C_A954_40C
ttdefineAFX_PUKEUIEW_H_B99A156C_A95O0CDZBBB
ttiF_MSC_UER>1000
ttpragvnaonce
ttendiF//_MSC_UER>1000
ttdefineID_OKO100
ttdefineID^OKI181
ttdefineID二0K2102
“defineID二0K3103
classCPukeUiew:publicCUiew
<
protected://createfromserializationonly
CPukeUiew();
DECLARE_DYNCREATE(CPukeUiew)
CButton-b1,b2,b3,b4;
第io页
课程设计指导书C++程序设计I(SS1060)
5)使用CalssWizard给CPukeView类添加OnCtreate()函数:
选择菜单项View/ClassWizard打开类向导对话框,选择MessageMaps选项卡,选择
CPukeView类,在Messages中找到WMJ2REATE消息,单击AddFunction按钮,
OnCreate()函数就添加到CPukeView类中。
6)修改OnCreate()函数:把按钮绑定到消息ID上,使按钮能响应消息事件。
intCPukeView::OnCreate(LPCREATESTRUCTIpCreateSlruct)
if(CView::OnCreate(lpCreateSlruct)==-1)
return-1;
bl.Create(_T("打开"),WS_CHILDIWS_VISIBLEIBS_PUSHBUTTON,CRect(130,480,230,510),this,ID_OK0);
b2.Create(_T("保存)WS_CHILDIWS_VISIBLEIBS_PUSHBUTTON,CRect(280,480,380,5I0),this,ID_OKl);
b3.Create(_T("关闭)WS_CHlLDIWS_VISIBLEIBS_PUSHBUTTON,CRect(430,480,530,510),this,ID_0K2);
b4.Create(_T("查找"),WS_CHILDIWS_VISIBLEIBS_PUSHBUTTON,CRect(130,530,530,560),this,ID_OK3);
return0;
项目代码截图如下图:
第11页
课程设计指导书C++程序设计I(SS1060)
/〃〃/〃〃//〃〃〃〃〃〃〃//〃///〃〃〃〃〃〃〃//〃〃〃/〃〃〃〃〃〃/〃〃/〃/
//CMylUiewmessagehandlers
uoidCPukeUiew::0n0K0()
uoidCPukeUiew::0n0K1()
uoidCPukeUiew::0n0K2()
uoidCPukeUiew::0n0K3()
intCMy1Uiew::0nCreate(LPCREATESTRUCTIpCreateStruct)
<
if(CUiew::OnCreate(lpCreateStruct)==-1)
return-1;
b1.Create(_T("打开・,),WS_CHILD|WS_UISIBLE|BS_PUSHBUTTON,CRect(130,480,230,510).this,ID_OK0);
b2."eate(1T(喉存,WS二CHILD|WSJHSIBLE|BS二PUSHBUTTON,CRect(28G,48G,38G,51G),this,ID_0K1);
b3.Create(_T(“关例,•),WS_CHILD|WSJHSIBLE|BS_PUSHBUTT0N,CRect(,3G,480,533516),this,IDJJK2);
bU.CreatedTC•查找”),WS二CHILD|WS[UISIBLE|BS二PUSHBUTTON,CRect(130,53G,53G,56°),this,ID[0K3);
return0;
运行效果:
(3)添加背景图片。
准备好大小合适的背景图片,BMP格式,放到res\文件夹下,要求为256色,更多色,如64K色,
亦可,只是不能在VC++工程中显示,不影响编程使用。
1)为工程添加图片资源,资源ID为IDB_BK,在“插入”菜单中选插入资源菜单项,在出现的对
话框中选择资源。
第12页
课程设计指导书C++程序设计I(SS1060)
InsertResource?|X
Resourcetype:
*Accelerator
嘛||Bitmap]
a汾
3Cursor
®-Dialog
虫查找范围建):口g二e向cjHI-
HTML
「
Icon
邕backgroundl.bmp理puke.rc2
Menubackground.bmp^JpukeDoc.ico
abcStringTable城|card.bmp[^Toolbar.bmp
业
画Toolbarccll.BMP
VersionccllO.BMP
1puke,ico
文件名理):|ccll.BMPImport
文件类型①:]所有文件(*.*):]取消
uoid0n0K1();Openas:<Auto
uoid0n0K2();
..——_1c—c,,c,、-
—
S1resources*
田口Accelerator
B骨Bitmap
^IDBBK|
-口
B:-
:口
B:-Icon
:口
B-Menu
:□
B-Table
:0
SI-Toolbar
:0
[±1-Uersion
2)在CPukeView类的头文件中添加变量:
CDCbackground;
CBitmapm_background;
项目代码截图如下图:
第13页
课程设计指导书C++程序设计I(SS1060)
//lUiew.h:interfaceoftheCMylUiewclass
//
////////////////////////////////////////////
Ulf•defined(AFX_5UIEW_H_EE7CD916_7A75_401D
ttdeFineAFX_1UIEW_H_EE7CD916_7A75_401D二B89F
ttiF_MSC_UER>1000
ttpragnaonce
ttendiF//_MSC_UER>1000
ttdeFineID_OK0100
ttdeFineID-0K1101
ItdeFineID_0K2102
“defineID二0K3103
classCMylUiew:publicCUievi
<
protected://createFromserializationonly
CMy1Uiew();
DECLARE_DVNCREATE(CMy1Uiew)
CButtonb1,b2,b3,b4;
CDCbackground;
CBitmapm_background;
3)修改CPukeView::PreCreateWindow(CREATESTRUCT&cs)函数:
BOOLCPukeView::PreCreateWindow(CREATESTRUCT&cs)
(
//TODO:ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
m_background.LoadBitmap(IDB_BK);
returnCView::PreCreateWindow(cs);
)
项目代码截图如下图:
//IUUU:aooconsrrucrioncooenere
CMylUiew::~CMy1Uiew()
BOOLCMylUiew::PreCreateWindow(CREATESTRUCT&cs)
<
//TODO:ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
nbackground.LoadBitmap(IDBBK);
returnCUiew::PreCreateWindow(cs);
}
4)删除intCMainFrame::OnCreate(LPCREATESTRUCTIpCreateStmict)函数中由AppWizard自
动生成的代码,下边红色部分代码,以去掉界面上的工具栏。
intCMainFrame::OnCreate(LPCREATESTRUCTIpCreateStruct)
(
if(CFrameWnd::OnCreate(lpCreateStruct)==-1)
return-1;
if(!m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS.CHILDIWS_VISIBLEICBRS.TOP
第14页
课程设计指导书C++程序设计I(SS1060)
ICBRS_GRIPPERICBRS_TOOLTIPSICBRS_FLYBYICBRS_SIZE_DYNAMIC)II
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACEO(nFailedtocreatetoolbar'rT);
return-1;//failtocreate
)
if(!m_wndStatusBar.Create(this)II
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
(
TRACEO(nFailedtocreatestatusbar\n");
return-1;//failtocreate
//TODO:Deletethesethreelinesifyoudon'twantthetoolbarto
//bedockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return0;
)
运行效果:
第15页
课程设计指导书C++程序设计I(SS1060)
(4)在程序界面上摆放扑克牌和AH数组、col数组交换算法
1)添加位图资源:(添加方法参照添加背景位图资源),资源标示为Card。添加方法见上边添加背
景资源。
位图大小为923x480,每颗牌大小为71x96(71x13=923,96x5=480)如下图:
I・•沁.
翁4b今今
♦•今•■♦6fWBl
*♦.;♦
V♦*♦*♦♦*■♦*6M*
A♦”♦Ry
♦♦颗
...♦♦♦♦••i
AA咻,嗝1园
V*?,£e•M*M,M11
A10.•
♦1****AX*n4k*X***总
**A*AA*A4
■**6t
V♦!♦?♦*E*♦鹏
1♦1♦?♦♦?♦♦?♦♦
♦♦♦
♦♦♦♦♦♦
■MlJ!购
V♦2♦£♦♦;♦g♦*9♦♦*8♦♦:1
41"%
Bl)■
用54个数字(0-53)表示54棵扑克牌。在位图中对应的位置为:黑桃A为0,黑桃2为1,以此类
推,黑桃K为12,红桃A为13.........最后大王牌为53。
在View类中声明一个整形数组AH[27]来存放软件界面上的27张牌。这27张拍是从54棵牌中随机
选出27张牌且不能有重复,并把对应的表示扑克牌的数字放到整形数组All[27]中。在程序中使用下边的
函数来实现:
voidCPukeView::range(int[])
(
intk;
boolcardID[55J={false};
cardID[54]=true;
for(intn=0;n<27;n++)
(
k=54;
int&c=All[n];
while(cardID[k])
(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高中二年级下学期生物《生态系统概念和结构模型构建》教学课件
- 施工升降机基础及附着施工方案
- 大学英语四级完形填空高频词
- 承插型键槽式连接钢管高大支模安全专项施工方案
- 卫生洁具安装施工工艺
- 四级作文 三部分作文法
- 2024年石油钻井工(中级工)职业资格考试题库-上(单选题)
- 2024年全国职业院校技能大赛高职组(新型电力系统技术与应用赛项)考试题库-中(多选题)
- 2024年江苏省百万城乡建设职工职业技能竞赛水务行业化学检验员决赛试题库-下(多选、简答题)
- 《Java Web技术》课程期末考试复习题库(含答案)
- 无线广播电视传输中的信号覆盖质量评估考核试卷
- 2024年统编版新教材语文小学一年级上册第一单元测试题及答案
- 煤矿应急叫应、回应、响应机制
- 旋挖钻孔灌注桩施工技术交底记录(干作业)
- 活动三《创意剪纸》教案 小学劳动 三年级
- 小学二年级下册数学《填空题》100道及一套参考答案
- 2024-2030年中国树莓汁行业发展分析及投资前景预测研究报告
- 循证护理实践理论考核试题及答案
- 马工程-公共财政概论-课程教案
- GB/T 226-2015钢的低倍组织及缺陷酸蚀检验法
- 公共政策学-陈振明课件
评论
0/150
提交评论