《c 程序设计 i(ss1060)》程序设计实践(第一次作业)指导书_第1页
《c 程序设计 i(ss1060)》程序设计实践(第一次作业)指导书_第2页
《c 程序设计 i(ss1060)》程序设计实践(第一次作业)指导书_第3页
《c 程序设计 i(ss1060)》程序设计实践(第一次作业)指导书_第4页
《c 程序设计 i(ss1060)》程序设计实践(第一次作业)指导书_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

软件工程系

《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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论