c++课程设计报告 掷骰子游戏

目录

一、课题设计的内容与主要功能 . ............................ 2 1.1题目内容 ............................................ 2 1.2 功能 ............................................... 2 二.课题分析 ............................................ 2 2.1项目的实现方法 ...................................... 2 2.2 类的声明 ........................................... 3 2.3核心算法及其实现代码 ................................ 4 2.3程序流程图 .......................................... 7 三.主要功能的实现步骤 . .................................. 8 四.程序测试 ............................................ 8 4.1测试计划 ............................................ 8 4.2测试过程 ............................................ 9 五、总结 ............................................... 12 六、参考书籍 ........................................... 14 七、附件 ............................................... 15 7.1 程序的源代码 . ...................................... 15 评分表……………………………………………………………… 27

一、课题设计的内容与主要功能

1.1题目内容

编写程序实现投掷双骰子游戏,游戏规则为:游戏者每次投掷两颗骰子, 每颗骰子是一个正方体, 有6面上面分别标有1、2、3、4、5、6个圆点, 当骰子停止时, 将每颗骰子朝上的点的数相加, 在第一次投掷骰时, 如果所得到的和为7或11, 那么游戏者为赢得胜利; 如果所得到的和为2、3或12,那么游戏者为输掉了; 如果和为4、5、6、8、9或10,那么为游戏者的点数; 如要想赢得胜利,必须继续投掷骰子,直到取得自已的点数为止, 但是如果投掷出的和为7或者连续投掷了6次仍未赚得点数,那么游戏者为输了。

1.2 功能

该游戏的主要功能为:实现随机投掷两个骰子把其所得点数相加,然后根据点数和判断玩家的输、赢或平局。在游戏中有1. 获得帮助 2.玩一手游戏 3.退出游戏 三个提示,分别为玩家提供帮助指示、选择进入新的游戏、退出当前的游戏并为该局游戏显示游戏结果。

二.课题分析

2.1项目的实现方法

这种小型的游戏的开发方法可以采用结构化方法分析与设计。首先,分析软件的逻辑模型,也就是这个软件需要“做什么”。然后,再建立软件的物理模型,既要“怎么做”的工程。该个程序由main()函数、实用的程序软件包utility.h 文件及骰子游戏dice_game.h文件组成,在main()函数中,先建立类

DiceGame 的对象objGame 并调用类DiceGame 的构造函数,为类的数据成员赋初值并开始游戏,再用对象objGame 访问类的成员函数Game(),进入游戏,通过选项玩家选择进入游戏或退出游戏。

在函数Game()中,先调用Help()函数显示游戏规则,并调用utility.h 文件Rand 类中SetRandSeed()函数设定当前时间为随机数种子,进入while 循环中,显示游戏选项,玩家可选择1. 获得帮助 然后调用成员函数Help()显示提示;2. 玩一手游戏 然后调用成员函数RollDice(),把随机的两个骰子的点数赋值给整形数sum ,通过switch()语句判断玩家输、赢或者平局。若玩家第一盘为平局状态为TIE ,则该局骰子和为玩家的点数把sum 赋值给myPoint ,玩家可通过调用utility.h 文件中的UserSaysYes()函数选择继续投骰子,直到赚到该点数时获胜状态为WIN ,但是用if 语句判断如果投掷出的和为7或者连续投掷出六次平局,则游戏者该局为输了LOSE 。最后用while 循环中的if 语句为每一次输赢和平局计数并显示玩家的输赢的语句。3. 退出游戏 然后调用utility.h 文件中的UserSaysYes()函数让玩家确定是否退出,退出后通过调用成员函数Show()显示游戏结果,游戏结束!

2.2 类的声明

文件dice_game.h中定义一个筛子游戏类DiceGame ,其声明如下: class DiceGame {

Private

// 数据成员:

int numOfWin;

// 胜利数次 // 失败数次

// 平局数次

int numOfLose; int numOfTie;

// 辅助函数

int RollDice(); void Help(); void Show();

public: // 方法声明:

// 模拟投掷一次骰子 // 获得帮助 // 显示统计结果

};

DiceGame(); // 无参数的构造函数 // 析构函数 // 模拟游戏

virtual ~DiceGame(){} void Game ();

2.3核心算法及其实现代码

1. 设计当前时间为随机数种子,模拟投掷一次两个骰子, 返回值为所投掷的两颗骰子向上一面的点数之和。代码如下:

int DiceGame::RollDice() // 模拟投掷一次骰子, 返回值为所投的两颗

骰子向上一面的点数之和

{

int numOfDice1; // 所投掷的第1颗骰子向上一面的点数 int numOfDice2 int sum;

numOfDice1 = 1 + Rand::GetRand(6); // 模拟所投掷骰子1的点数

// 所投掷的第2颗骰子向上一面的点数 // 所投掷的两颗骰子向上一面的点数之和

numOfDice2 = 1 + Rand::GetRand(6); // 模拟所投掷骰子2的点数

sum = numOfDice1 + numOfDice2;// 计算所投掷两颗骰子向上一面的点

数之和

cout

2. 通过if 选择语句进入游戏项目2,模拟第一次投掷骰子,并用switch 开关语句来判断枚举量status 的状态是输、赢或者平局,如果是平局,则记录点数。代码如下:

if(select==2) //输入2 {

// 返回所掷骰子向上一面点数之和

sum=RollDice(); //模拟掷骰子 switch(sum) {

case 7: //掷得7或11胜利

case 11:

status=WIN; numOfWin++; break;

case 2: //投掷得2、3、12,输了

case 3: case 12:

status=LOSE;

numOfLose++; break;

default: //投得其他数值,处于平局 }

status=TIE; myPoint=sum; numOfTie++;

cout

3. 通过status 的状态用if 条件语句判断玩家的输赢,如果是平局,既status==TIE时,利用UserSaysYes()函数让玩家选择是否继续游戏。若玩家选择继续游戏,则依然用if 条件语句判断status 的状态来判断输赢,只有玩家在六次以内再次投掷到相同的点数时,玩家即胜利,但是,若首先投掷到的点数和为7或者连续6次都是平局,则游戏为输了。代码如下: while(1) {

if(status==WIN)

{ }

if(status==LOSE) {

cout

}

break;

while(status==TIE) {

cout

{

int again;

again=RollDice(); //处于平局再次掷骰子

if(myPoint==again) //掷得自己的点数,赢得胜利

{

status=WIN; numOfWin++;

break;

}

else if(again==7) //掷得7,输了 {

status=LOSE; numOfLose++; break; }

else //平局

{

numOfTie++;

if(numOfTie == 6) //平局6次,输了 {

status=LOSE;

cout

}

}

}

}

4. 如果玩家的输入有误,则需用if 条件语句判断,并提示正确的输入。代码如下:

if(select!=1&&select!=2&&select!=3) //若输入不是 1,2,3 重新输入 {

cout

continue; }

2.3程序流程图

三.主要功能的实现步骤

1. 获得帮助

玩家输入选择select 为1,通过条件语句if(select==1)判断是否满足条件,然后再调用类的成员函数Help(),则显示帮助信息。

2. 选择一手游戏

玩家输入选择select 为2,在while 循环中通过if(select==2)语句判断是否符合条件,再调用类的成员函数RollDice()模拟投掷一次骰子, 返回值为所投掷的两颗骰子向上一面的点数之和,把RollDice()的返回值赋值给sum ,再通过开关语句switch(sum)判断玩家第一手的输赢。若为平局,则该点数为玩家的点数,玩家可选择是否继续游戏if(UserSaysYes()),若玩家选择y, 则可以再次投掷骰子again=RollDice(),掷自己的点数if(myPoint==again)则胜利;若玩家先投掷出点数7既 else if(again==7)或者平局次数达到6次if(numOfTie == 6) ,则判断玩家为输了。

3. 退出游戏

玩家输入选择select 为3,在while()驯悍中通过语句else if(select==3)判断,用语句if(UserSaysYes())确认玩家是否要退出游戏,若回答为”y ”则 跳出循环break ,最后程序会调用类的成员函数Show()显示玩家游戏的结果。

四.程序测试

4.1测试计划

● 游戏开始进入的界面及显示提示 ● 获得帮助

● 进入游戏并测试每一个路径(既测试每一种可能的结果) ● 退出游戏选项的测试

4.2测试过程

1. 游戏开始时的界面及玩家选项的提示

2. 若玩家输入有误,则需提醒玩家输入正确的选项进入游戏

3. 若玩家中途忘记游戏规则,则课选择选项1,进入帮助提醒的界面

4. 玩家选择选项2,进入游戏,并在第一次投掷中获得胜利

5. 玩家进入游戏,第一次投掷获得点数,但最后投掷出了点数是7,所以失败了

6. 玩家第一希投掷为平局,获得点数,但在接下来的次投掷中连续6次平局,由游戏规则可知,玩家在此局中又失败了

7. 玩家玩完了游戏,选择选项3退出游戏,并显示玩家在此次游戏中的结果

五、总结

课程设计是培养学生综合运用所学知识, 发现, 提出, 分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察的过程。而C++作为一门编程语言,对于我们自动化专业以后的学习和工作有着重要的作用,所以我们必须努力学习好并灵活运用。

回顾此次C++课程设计,至今我仍感慨颇多。的确,从分析课题到最终的完成报告,从理论到实践,在整整一个星期的日子里,可以说得上是苦多于甜。但是通过这次课程设计确实学到了很多很多的的东西,不仅巩固了大一时学习的C++知识,而且通过多次上机操作学到了很多在书本上所没有学到过的知识,同时通过这一次实习,更加熟练了自己的使用编程软件VC6.0的操作技能。在这一次的实习中,把学习的C++知识运用到编写一个小型游戏软件,也学习了一些软件工程基本的内容和过程。自己亲身编写一个软件,虽然过程是艰难的,但是当最终看到自己的程序运行出了预期的结果时,那一刻,心里的确挺自豪的,也是

通过这一次实习的过程,发现编程是一个挺有成就感的工作,点燃了自己对编程的热情。我想,在这次实习之后,我会多看看这方面的书籍,发展自己编程方面的兴趣。同时,在设计的过程中我也发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说对程序编译后的错误的分析不熟练、对编程软件中的功能也不能很熟练的使用、对较复杂的各个语句的关系的分析不是很清楚„„所以在这次课程设计之后,我一定要多注意练习这些方面的不足之处,努力完善自己。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。回想自己在最开始的编写程序的过程,的确充满了困难,如:在怎么把自己的想法用C++语言来实现上;各个循环语句、条件语句、开关语句的运用和包含关系,真的让我耗尽了精力!记得在《软件工程》这本书中看过一句话“测试只能证明错误的存在,但不能证明错误的不存在”,由测试结果得出,我所完成的程序已完成了计划的内容和功能,符合了最初的研制要求,并适当改进和实现了游戏的规则(游戏平局次数不能超过6次,否则这一句为游戏者输了),但是我相信这个程序还是有很多地方可以改进,例如:尽管已近设定了条件语句if(select!=1&&select!=2&&select!=3)来限制玩家的选择,但是当玩家进入游戏时,输入错误的提示若为字母,则程序会自动进入一个死循环„„等这些还是需要自己后续的改进。在自己这一次亲身体会编写程序中,切身实际的感受到C++语言的特点。如:C++的通过类和对象来实现封装性。我所编写的Game ()函数就是类DiceGame 的成员函数,其中就涉及到了许多类的数据成员和成员函数的访问。同时,我感受到C++语言的风格也是比较简练明了的。

同时,在这次课程设计中,我深刻感受到与人合作的力量的强大。特别是在编写程序中出现错误时,而由于自己身在“程序之中”,一时无法发现自己的一些潜意识的错误,此时,别人的帮助检查程序的确帮我省了很多无用功,也非常感谢老师和同学给与了我很多对程序改进的建议。

这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的辛勤指导下,最终还是迎刃而解。同时,对给过我帮助的所有同学和各位指导老师表示忠心的感谢

六、参考书籍

《 C++语言程序设计教程 》吕凤翥著 人民邮电出版社

《实用面向对象软件工程教程》Edward Yourdon,Carl Argila著 电子工业出版社

《C++编程思想:标准C++导引》,(美)Bruce Eckel 著 机械工业出版社

七、附件

7.1 程序的源代码

★Main()文件: // 文件路径名:dice_game\main.cpp #include "utility.h"

// 实用程序软件包 // 骰子游戏

#include "dice_game.h"

int main(void) { }

system("PAUSE"); return 0;

DiceGame objGame; objGame.Game();

// 主函数main(void)

// 骰子游戏对象 // 运行游戏

// 调用库函数system() // 返回值0, 返回操作系统

★dice_game.h文件: // 文件路径名: dice_game\dice_game.h #ifndef __DICE_GAME_H__ #define __DICE_GAME_H__

typedef enum{WIN, LOSE, TIE} GameStatus; // WIN:赢,LOSE:输,TIE:平局

// 骰子游戏类DiceGame 声明 class DiceGame {

private: // 数据成员:

// 如果没有定义__DICE_GAME_H__ // 那么定义__DICE_GAME_H__

int numOfWin; int numOfLose; int numOfTie;

// 胜利数次 // 失败数次

// 平局数次

// 辅助函数

public:

// 方法声明: };

// 骰子游戏类DiceGame 的实现部分 DiceGame::DiceGame() { }

int DiceGame::RollDice() // 模拟投掷一次骰子, 返回值为所投掷

的两颗骰子向上一面的点数之和

{

numOfDice1 = 1 + Rand::GetRand(6); // 模拟所投掷骰子1的点数 numOfDice2 = 1 + Rand::GetRand(6); // 模拟所投掷骰子2的点数 int numOfDice1; int numOfDice2; int sum;

// 所投掷的第1颗骰子向上一面的点数 // 所投掷的第2颗骰子向上一面的点数 // 所投掷的两颗骰子向上一面的点数之和

numOfWin = 0; numOfLose = 0; numOfTie = 0;

// 胜利数次 // 失败数次

// 初始化骰子游戏

DiceGame();

// 无参数的构造函数 // 析构函数 // 模拟游戏

int RollDice(); void Help(); void Show();

// 模拟投掷一次骰子 // 获得帮助 // 显示统计结果

virtual ~DiceGame(){} void Game();

// 平局数次

cout

sum = numOfDice1 + numOfDice2; // 计算所投掷两颗骰子向上一面的

点数之和

cout

void DiceGame::Help() {

cout

cout

cout

cout

// 显示统计结果

// 获得帮助

return sum;

// 返回所掷骰子向上一面点数之和

void DiceGame::Show() { }

cout

" 获胜"

cout

void DiceGame::Game() {

while(select!=3) {

cout > select;

// 输入选择

Rand::SetRandSeed(); Help();

// 设置当前时间为随机数种子 // 获得帮助

int select = 1; int sum, myPoint; GameStatus status;

// 游戏状态

// 模拟游戏

if(select!=1&&select!=2&&select!=3) //若输入不是 1,2,3 重新输

{

cout

continue;

} if(1) {

while(select==1) //输入1,帮助

{

Help();

break;

}

if(select==2) //输入2

{

sum=RollDice(); //模拟掷骰子 switch(sum) {

case 7: //掷得7或11胜利

case 11:

status=WIN; numOfWin++;

break;

case 2: //投掷得2、3、12,输了

status=LOSE; numOfLose++;

break;

default: //投得其他数值,处于平局 status=TIE; myPoint=sum; numOfTie++;

cout

} while(1) { if(status==WIN) { cout

if(status==LOSE)

case 3: case 12:

{ }

while(status==TIE) {

cout

if(UserSaysYes())

{

int again;

again=RollDice(); //处于平局再次掷骰子 if(myPoint==again) //掷得自己的点数,赢得胜利

{

status=WIN; numOfWin++;

break;

}

else if(again==7) //掷得7,输了

{

status=LOSE; numOfLose++; break; }

else //平局

{

numOfTie++;

if(numOfTie == 6) //平局6次,输了 {

status=LOSE;

cout

}

} }

}

}

}

else if(select==3) //

{

if(UserSaysYes()) // break; else

select=1; // }

}

} Show();

} #endif

★Utility.h 文件: #ifndef __UTILITY_H__ #define __UTILITY_H__

// 实用程序工具包

#ifdef _MSC_VER

#if _MSC_VER == 1200

// 标准库头文件 #include

输入为3 退出游戏 返回游戏

// 显示统计结果

// 如果没有定义__UTILITY_H__ // 那么定义__UTILITY_H__

// 表示是Visual C++

表示Visual C++6.0

// 标准串和操作

//

#include #include #include

// 标准流操作 // 极限

// 数据函数 // 文件输入输出 // 字符处理

#include #include #include

// 日期和时间函数 #include // #include

#include // #include // #include

#else

//

// ANSI C++标准库头文件 #include

// #include

#include // #include // #include

#include

// #include #include

#include // #include

// #include // #include

// using namespace std;

// #endif // _MSC_VER == 1200 #else

// 标准库 // 标准输入输出

输入输出流格式设置 支持变长函数参数 // 支持断言

其它版本的Visual C++

标准串和操作 // 标准流操作

极限 数据函数 // 文件输入输出

字符处理 // 日期和时间函数 // 标准库

标准输入输出 输入输出流格式设置 支持变长函数参数 支持断言

标准库包含在命名空间std 中非Visual C++

// ANSI C++标准库头文件 #include

// 标准串操作 // 标准流操作 // 极限 // 数据函数 // 文件输入输出 // 字符处理 // 日期和时间函数

// 标准库

#include #include #include #include #include

#include #include

#include #include

// 标准输入输出

// 输入输出流格式设置 // 支持变长函数参数 // 支持断言

#include #include

using namespace std; #endif

// 实用函数

// 标准库包含在命名空间std 中

// _MSC_VER

char GetChar(istream &inStream = cin); // 从输入流inStream 中跳过空格

及制表符获取一字符

bool UserSaysYes(); // 当用户肯定回答(yes)时, 返回true,

用户否定回答(no)时, 返回false

// 函数模板

template

void Swap(ElemType &e1, ElemType &e2); // 交换e1, e2之值 template

void Display(ElemType elem[], int n); // 显示数组elem 的各数据元素值

// 实用类 class Timer;

// 计时器类Timer

class Error; class Rand;

// 通用异常类

// 随机数类Rand

char GetChar(istream &in) // 从输入流in 中跳过空格及制表一字符 {

char ch;

while ((ch = in.peek()) != EOF // 文件结束符(peek()函数从输入流中

// 临时变量

接受1 流 }

bool UserSaysYes() // 当用户肯定回答(yes)时, 返回true, 用户否定回答

(no)时, 返回false

{

do

{ // 循环直到用户输入恰当的回答为止

if (initialResponse) cout

// 非初始回答

char ch;

// 用户回答字符

// 的当前位置向后移1个位置)

// 字符, 流的当前位置不变)

&& ((ch = in.get()) == ' ' // 空格(get()函数从输入流中接受1字符,

|| ch == '\t')); return ch;

// 制表符

// 返回字符

bool initialResponse = true; // 初始回答

while ((ch = GetChar()) == '\n'); // 跳过空格, 制表符及换

行符获取一字符

initialResponse = false;

// 非初始回答

} while (ch != 'y' && ch != 'Y' && ch != 'n' && ch != 'N'); while (GetChar() != '\n');

// 跳过当前行后面的字符

}

if (ch == 'y' || ch == 'Y') return true; // 肯定回答返回true else return false;

// 否定回答返回false

template

void Swap(ElemType &e1, ElemType &e2) // 交换e1, e2之值 { ElemType temp;

temp = e1; e1 = e2; e2 = temp; }

template

void Show(ElemType elem[], int n) { for (int i = 0; i

}

cout

}

// 计时器类Timer class Timer {

private: // 数据成员

clock_t startTime;

public:

// 方法声明

Timer(){ startTime = clock(); } 开始时间构造对象 double ElapsedTime() const

{

clock_t endTime = clock(); // 临时变量 // 循环赋值实现交换e1, e2

// 显示数组elem 的各数据元素值

显示elem[i]

换行

// 构造函数, 由当前时间作为

// 返回已过的时间

// 结束时间

// //

return (double)(endTime - startTime) / (double)CLK_TCK;

// 计算已过时间

};

}

void Reset(){ startTime = clock(); } // 重置开始时间

// 通用异常类Error #define MAX_ERROR_MESSAGE_LEN 100 class Error {

private: // 数据成员

char message[MAX_ERROR_MESSAGE_LEN]; // 异常信息

public:

// 方法声明

Error(char mes[] = "一般性异常!"){ strcpy(message, mes); }

// 构造函数

void Show() const{ cout

// 显示异常信息

}; // 随机数类Rand class Rand {

public:

// 方法声明

static void SetRandSeed(){ srand((unsigned)time(NULL)); }

// 设置当前时间为随机数种子

static int GetRand(int n){ return rand() % n; }

// 生成0 ~ n-1之间的随机数

}; #endif

static int GetRand(){ return rand(); } // 生成0 ~ n-1之间的随机数

计算机与通信学院课程设计评分表

教师签名: 日 期:

(注:1.此页附在课程设计报告之后;2.综合成绩按优、良、中、及格和不及格五级评定。)

目录

一、课题设计的内容与主要功能 . ............................ 2 1.1题目内容 ............................................ 2 1.2 功能 ............................................... 2 二.课题分析 ............................................ 2 2.1项目的实现方法 ...................................... 2 2.2 类的声明 ........................................... 3 2.3核心算法及其实现代码 ................................ 4 2.3程序流程图 .......................................... 7 三.主要功能的实现步骤 . .................................. 8 四.程序测试 ............................................ 8 4.1测试计划 ............................................ 8 4.2测试过程 ............................................ 9 五、总结 ............................................... 12 六、参考书籍 ........................................... 14 七、附件 ............................................... 15 7.1 程序的源代码 . ...................................... 15 评分表……………………………………………………………… 27

一、课题设计的内容与主要功能

1.1题目内容

编写程序实现投掷双骰子游戏,游戏规则为:游戏者每次投掷两颗骰子, 每颗骰子是一个正方体, 有6面上面分别标有1、2、3、4、5、6个圆点, 当骰子停止时, 将每颗骰子朝上的点的数相加, 在第一次投掷骰时, 如果所得到的和为7或11, 那么游戏者为赢得胜利; 如果所得到的和为2、3或12,那么游戏者为输掉了; 如果和为4、5、6、8、9或10,那么为游戏者的点数; 如要想赢得胜利,必须继续投掷骰子,直到取得自已的点数为止, 但是如果投掷出的和为7或者连续投掷了6次仍未赚得点数,那么游戏者为输了。

1.2 功能

该游戏的主要功能为:实现随机投掷两个骰子把其所得点数相加,然后根据点数和判断玩家的输、赢或平局。在游戏中有1. 获得帮助 2.玩一手游戏 3.退出游戏 三个提示,分别为玩家提供帮助指示、选择进入新的游戏、退出当前的游戏并为该局游戏显示游戏结果。

二.课题分析

2.1项目的实现方法

这种小型的游戏的开发方法可以采用结构化方法分析与设计。首先,分析软件的逻辑模型,也就是这个软件需要“做什么”。然后,再建立软件的物理模型,既要“怎么做”的工程。该个程序由main()函数、实用的程序软件包utility.h 文件及骰子游戏dice_game.h文件组成,在main()函数中,先建立类

DiceGame 的对象objGame 并调用类DiceGame 的构造函数,为类的数据成员赋初值并开始游戏,再用对象objGame 访问类的成员函数Game(),进入游戏,通过选项玩家选择进入游戏或退出游戏。

在函数Game()中,先调用Help()函数显示游戏规则,并调用utility.h 文件Rand 类中SetRandSeed()函数设定当前时间为随机数种子,进入while 循环中,显示游戏选项,玩家可选择1. 获得帮助 然后调用成员函数Help()显示提示;2. 玩一手游戏 然后调用成员函数RollDice(),把随机的两个骰子的点数赋值给整形数sum ,通过switch()语句判断玩家输、赢或者平局。若玩家第一盘为平局状态为TIE ,则该局骰子和为玩家的点数把sum 赋值给myPoint ,玩家可通过调用utility.h 文件中的UserSaysYes()函数选择继续投骰子,直到赚到该点数时获胜状态为WIN ,但是用if 语句判断如果投掷出的和为7或者连续投掷出六次平局,则游戏者该局为输了LOSE 。最后用while 循环中的if 语句为每一次输赢和平局计数并显示玩家的输赢的语句。3. 退出游戏 然后调用utility.h 文件中的UserSaysYes()函数让玩家确定是否退出,退出后通过调用成员函数Show()显示游戏结果,游戏结束!

2.2 类的声明

文件dice_game.h中定义一个筛子游戏类DiceGame ,其声明如下: class DiceGame {

Private

// 数据成员:

int numOfWin;

// 胜利数次 // 失败数次

// 平局数次

int numOfLose; int numOfTie;

// 辅助函数

int RollDice(); void Help(); void Show();

public: // 方法声明:

// 模拟投掷一次骰子 // 获得帮助 // 显示统计结果

};

DiceGame(); // 无参数的构造函数 // 析构函数 // 模拟游戏

virtual ~DiceGame(){} void Game ();

2.3核心算法及其实现代码

1. 设计当前时间为随机数种子,模拟投掷一次两个骰子, 返回值为所投掷的两颗骰子向上一面的点数之和。代码如下:

int DiceGame::RollDice() // 模拟投掷一次骰子, 返回值为所投的两颗

骰子向上一面的点数之和

{

int numOfDice1; // 所投掷的第1颗骰子向上一面的点数 int numOfDice2 int sum;

numOfDice1 = 1 + Rand::GetRand(6); // 模拟所投掷骰子1的点数

// 所投掷的第2颗骰子向上一面的点数 // 所投掷的两颗骰子向上一面的点数之和

numOfDice2 = 1 + Rand::GetRand(6); // 模拟所投掷骰子2的点数

sum = numOfDice1 + numOfDice2;// 计算所投掷两颗骰子向上一面的点

数之和

cout

2. 通过if 选择语句进入游戏项目2,模拟第一次投掷骰子,并用switch 开关语句来判断枚举量status 的状态是输、赢或者平局,如果是平局,则记录点数。代码如下:

if(select==2) //输入2 {

// 返回所掷骰子向上一面点数之和

sum=RollDice(); //模拟掷骰子 switch(sum) {

case 7: //掷得7或11胜利

case 11:

status=WIN; numOfWin++; break;

case 2: //投掷得2、3、12,输了

case 3: case 12:

status=LOSE;

numOfLose++; break;

default: //投得其他数值,处于平局 }

status=TIE; myPoint=sum; numOfTie++;

cout

3. 通过status 的状态用if 条件语句判断玩家的输赢,如果是平局,既status==TIE时,利用UserSaysYes()函数让玩家选择是否继续游戏。若玩家选择继续游戏,则依然用if 条件语句判断status 的状态来判断输赢,只有玩家在六次以内再次投掷到相同的点数时,玩家即胜利,但是,若首先投掷到的点数和为7或者连续6次都是平局,则游戏为输了。代码如下: while(1) {

if(status==WIN)

{ }

if(status==LOSE) {

cout

}

break;

while(status==TIE) {

cout

{

int again;

again=RollDice(); //处于平局再次掷骰子

if(myPoint==again) //掷得自己的点数,赢得胜利

{

status=WIN; numOfWin++;

break;

}

else if(again==7) //掷得7,输了 {

status=LOSE; numOfLose++; break; }

else //平局

{

numOfTie++;

if(numOfTie == 6) //平局6次,输了 {

status=LOSE;

cout

}

}

}

}

4. 如果玩家的输入有误,则需用if 条件语句判断,并提示正确的输入。代码如下:

if(select!=1&&select!=2&&select!=3) //若输入不是 1,2,3 重新输入 {

cout

continue; }

2.3程序流程图

三.主要功能的实现步骤

1. 获得帮助

玩家输入选择select 为1,通过条件语句if(select==1)判断是否满足条件,然后再调用类的成员函数Help(),则显示帮助信息。

2. 选择一手游戏

玩家输入选择select 为2,在while 循环中通过if(select==2)语句判断是否符合条件,再调用类的成员函数RollDice()模拟投掷一次骰子, 返回值为所投掷的两颗骰子向上一面的点数之和,把RollDice()的返回值赋值给sum ,再通过开关语句switch(sum)判断玩家第一手的输赢。若为平局,则该点数为玩家的点数,玩家可选择是否继续游戏if(UserSaysYes()),若玩家选择y, 则可以再次投掷骰子again=RollDice(),掷自己的点数if(myPoint==again)则胜利;若玩家先投掷出点数7既 else if(again==7)或者平局次数达到6次if(numOfTie == 6) ,则判断玩家为输了。

3. 退出游戏

玩家输入选择select 为3,在while()驯悍中通过语句else if(select==3)判断,用语句if(UserSaysYes())确认玩家是否要退出游戏,若回答为”y ”则 跳出循环break ,最后程序会调用类的成员函数Show()显示玩家游戏的结果。

四.程序测试

4.1测试计划

● 游戏开始进入的界面及显示提示 ● 获得帮助

● 进入游戏并测试每一个路径(既测试每一种可能的结果) ● 退出游戏选项的测试

4.2测试过程

1. 游戏开始时的界面及玩家选项的提示

2. 若玩家输入有误,则需提醒玩家输入正确的选项进入游戏

3. 若玩家中途忘记游戏规则,则课选择选项1,进入帮助提醒的界面

4. 玩家选择选项2,进入游戏,并在第一次投掷中获得胜利

5. 玩家进入游戏,第一次投掷获得点数,但最后投掷出了点数是7,所以失败了

6. 玩家第一希投掷为平局,获得点数,但在接下来的次投掷中连续6次平局,由游戏规则可知,玩家在此局中又失败了

7. 玩家玩完了游戏,选择选项3退出游戏,并显示玩家在此次游戏中的结果

五、总结

课程设计是培养学生综合运用所学知识, 发现, 提出, 分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察的过程。而C++作为一门编程语言,对于我们自动化专业以后的学习和工作有着重要的作用,所以我们必须努力学习好并灵活运用。

回顾此次C++课程设计,至今我仍感慨颇多。的确,从分析课题到最终的完成报告,从理论到实践,在整整一个星期的日子里,可以说得上是苦多于甜。但是通过这次课程设计确实学到了很多很多的的东西,不仅巩固了大一时学习的C++知识,而且通过多次上机操作学到了很多在书本上所没有学到过的知识,同时通过这一次实习,更加熟练了自己的使用编程软件VC6.0的操作技能。在这一次的实习中,把学习的C++知识运用到编写一个小型游戏软件,也学习了一些软件工程基本的内容和过程。自己亲身编写一个软件,虽然过程是艰难的,但是当最终看到自己的程序运行出了预期的结果时,那一刻,心里的确挺自豪的,也是

通过这一次实习的过程,发现编程是一个挺有成就感的工作,点燃了自己对编程的热情。我想,在这次实习之后,我会多看看这方面的书籍,发展自己编程方面的兴趣。同时,在设计的过程中我也发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说对程序编译后的错误的分析不熟练、对编程软件中的功能也不能很熟练的使用、对较复杂的各个语句的关系的分析不是很清楚„„所以在这次课程设计之后,我一定要多注意练习这些方面的不足之处,努力完善自己。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。回想自己在最开始的编写程序的过程,的确充满了困难,如:在怎么把自己的想法用C++语言来实现上;各个循环语句、条件语句、开关语句的运用和包含关系,真的让我耗尽了精力!记得在《软件工程》这本书中看过一句话“测试只能证明错误的存在,但不能证明错误的不存在”,由测试结果得出,我所完成的程序已完成了计划的内容和功能,符合了最初的研制要求,并适当改进和实现了游戏的规则(游戏平局次数不能超过6次,否则这一句为游戏者输了),但是我相信这个程序还是有很多地方可以改进,例如:尽管已近设定了条件语句if(select!=1&&select!=2&&select!=3)来限制玩家的选择,但是当玩家进入游戏时,输入错误的提示若为字母,则程序会自动进入一个死循环„„等这些还是需要自己后续的改进。在自己这一次亲身体会编写程序中,切身实际的感受到C++语言的特点。如:C++的通过类和对象来实现封装性。我所编写的Game ()函数就是类DiceGame 的成员函数,其中就涉及到了许多类的数据成员和成员函数的访问。同时,我感受到C++语言的风格也是比较简练明了的。

同时,在这次课程设计中,我深刻感受到与人合作的力量的强大。特别是在编写程序中出现错误时,而由于自己身在“程序之中”,一时无法发现自己的一些潜意识的错误,此时,别人的帮助检查程序的确帮我省了很多无用功,也非常感谢老师和同学给与了我很多对程序改进的建议。

这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的辛勤指导下,最终还是迎刃而解。同时,对给过我帮助的所有同学和各位指导老师表示忠心的感谢

六、参考书籍

《 C++语言程序设计教程 》吕凤翥著 人民邮电出版社

《实用面向对象软件工程教程》Edward Yourdon,Carl Argila著 电子工业出版社

《C++编程思想:标准C++导引》,(美)Bruce Eckel 著 机械工业出版社

七、附件

7.1 程序的源代码

★Main()文件: // 文件路径名:dice_game\main.cpp #include "utility.h"

// 实用程序软件包 // 骰子游戏

#include "dice_game.h"

int main(void) { }

system("PAUSE"); return 0;

DiceGame objGame; objGame.Game();

// 主函数main(void)

// 骰子游戏对象 // 运行游戏

// 调用库函数system() // 返回值0, 返回操作系统

★dice_game.h文件: // 文件路径名: dice_game\dice_game.h #ifndef __DICE_GAME_H__ #define __DICE_GAME_H__

typedef enum{WIN, LOSE, TIE} GameStatus; // WIN:赢,LOSE:输,TIE:平局

// 骰子游戏类DiceGame 声明 class DiceGame {

private: // 数据成员:

// 如果没有定义__DICE_GAME_H__ // 那么定义__DICE_GAME_H__

int numOfWin; int numOfLose; int numOfTie;

// 胜利数次 // 失败数次

// 平局数次

// 辅助函数

public:

// 方法声明: };

// 骰子游戏类DiceGame 的实现部分 DiceGame::DiceGame() { }

int DiceGame::RollDice() // 模拟投掷一次骰子, 返回值为所投掷

的两颗骰子向上一面的点数之和

{

numOfDice1 = 1 + Rand::GetRand(6); // 模拟所投掷骰子1的点数 numOfDice2 = 1 + Rand::GetRand(6); // 模拟所投掷骰子2的点数 int numOfDice1; int numOfDice2; int sum;

// 所投掷的第1颗骰子向上一面的点数 // 所投掷的第2颗骰子向上一面的点数 // 所投掷的两颗骰子向上一面的点数之和

numOfWin = 0; numOfLose = 0; numOfTie = 0;

// 胜利数次 // 失败数次

// 初始化骰子游戏

DiceGame();

// 无参数的构造函数 // 析构函数 // 模拟游戏

int RollDice(); void Help(); void Show();

// 模拟投掷一次骰子 // 获得帮助 // 显示统计结果

virtual ~DiceGame(){} void Game();

// 平局数次

cout

sum = numOfDice1 + numOfDice2; // 计算所投掷两颗骰子向上一面的

点数之和

cout

void DiceGame::Help() {

cout

cout

cout

cout

// 显示统计结果

// 获得帮助

return sum;

// 返回所掷骰子向上一面点数之和

void DiceGame::Show() { }

cout

" 获胜"

cout

void DiceGame::Game() {

while(select!=3) {

cout > select;

// 输入选择

Rand::SetRandSeed(); Help();

// 设置当前时间为随机数种子 // 获得帮助

int select = 1; int sum, myPoint; GameStatus status;

// 游戏状态

// 模拟游戏

if(select!=1&&select!=2&&select!=3) //若输入不是 1,2,3 重新输

{

cout

continue;

} if(1) {

while(select==1) //输入1,帮助

{

Help();

break;

}

if(select==2) //输入2

{

sum=RollDice(); //模拟掷骰子 switch(sum) {

case 7: //掷得7或11胜利

case 11:

status=WIN; numOfWin++;

break;

case 2: //投掷得2、3、12,输了

status=LOSE; numOfLose++;

break;

default: //投得其他数值,处于平局 status=TIE; myPoint=sum; numOfTie++;

cout

} while(1) { if(status==WIN) { cout

if(status==LOSE)

case 3: case 12:

{ }

while(status==TIE) {

cout

if(UserSaysYes())

{

int again;

again=RollDice(); //处于平局再次掷骰子 if(myPoint==again) //掷得自己的点数,赢得胜利

{

status=WIN; numOfWin++;

break;

}

else if(again==7) //掷得7,输了

{

status=LOSE; numOfLose++; break; }

else //平局

{

numOfTie++;

if(numOfTie == 6) //平局6次,输了 {

status=LOSE;

cout

}

} }

}

}

}

else if(select==3) //

{

if(UserSaysYes()) // break; else

select=1; // }

}

} Show();

} #endif

★Utility.h 文件: #ifndef __UTILITY_H__ #define __UTILITY_H__

// 实用程序工具包

#ifdef _MSC_VER

#if _MSC_VER == 1200

// 标准库头文件 #include

输入为3 退出游戏 返回游戏

// 显示统计结果

// 如果没有定义__UTILITY_H__ // 那么定义__UTILITY_H__

// 表示是Visual C++

表示Visual C++6.0

// 标准串和操作

//

#include #include #include

// 标准流操作 // 极限

// 数据函数 // 文件输入输出 // 字符处理

#include #include #include

// 日期和时间函数 #include // #include

#include // #include // #include

#else

//

// ANSI C++标准库头文件 #include

// #include

#include // #include // #include

#include

// #include #include

#include // #include

// #include // #include

// using namespace std;

// #endif // _MSC_VER == 1200 #else

// 标准库 // 标准输入输出

输入输出流格式设置 支持变长函数参数 // 支持断言

其它版本的Visual C++

标准串和操作 // 标准流操作

极限 数据函数 // 文件输入输出

字符处理 // 日期和时间函数 // 标准库

标准输入输出 输入输出流格式设置 支持变长函数参数 支持断言

标准库包含在命名空间std 中非Visual C++

// ANSI C++标准库头文件 #include

// 标准串操作 // 标准流操作 // 极限 // 数据函数 // 文件输入输出 // 字符处理 // 日期和时间函数

// 标准库

#include #include #include #include #include

#include #include

#include #include

// 标准输入输出

// 输入输出流格式设置 // 支持变长函数参数 // 支持断言

#include #include

using namespace std; #endif

// 实用函数

// 标准库包含在命名空间std 中

// _MSC_VER

char GetChar(istream &inStream = cin); // 从输入流inStream 中跳过空格

及制表符获取一字符

bool UserSaysYes(); // 当用户肯定回答(yes)时, 返回true,

用户否定回答(no)时, 返回false

// 函数模板

template

void Swap(ElemType &e1, ElemType &e2); // 交换e1, e2之值 template

void Display(ElemType elem[], int n); // 显示数组elem 的各数据元素值

// 实用类 class Timer;

// 计时器类Timer

class Error; class Rand;

// 通用异常类

// 随机数类Rand

char GetChar(istream &in) // 从输入流in 中跳过空格及制表一字符 {

char ch;

while ((ch = in.peek()) != EOF // 文件结束符(peek()函数从输入流中

// 临时变量

接受1 流 }

bool UserSaysYes() // 当用户肯定回答(yes)时, 返回true, 用户否定回答

(no)时, 返回false

{

do

{ // 循环直到用户输入恰当的回答为止

if (initialResponse) cout

// 非初始回答

char ch;

// 用户回答字符

// 的当前位置向后移1个位置)

// 字符, 流的当前位置不变)

&& ((ch = in.get()) == ' ' // 空格(get()函数从输入流中接受1字符,

|| ch == '\t')); return ch;

// 制表符

// 返回字符

bool initialResponse = true; // 初始回答

while ((ch = GetChar()) == '\n'); // 跳过空格, 制表符及换

行符获取一字符

initialResponse = false;

// 非初始回答

} while (ch != 'y' && ch != 'Y' && ch != 'n' && ch != 'N'); while (GetChar() != '\n');

// 跳过当前行后面的字符

}

if (ch == 'y' || ch == 'Y') return true; // 肯定回答返回true else return false;

// 否定回答返回false

template

void Swap(ElemType &e1, ElemType &e2) // 交换e1, e2之值 { ElemType temp;

temp = e1; e1 = e2; e2 = temp; }

template

void Show(ElemType elem[], int n) { for (int i = 0; i

}

cout

}

// 计时器类Timer class Timer {

private: // 数据成员

clock_t startTime;

public:

// 方法声明

Timer(){ startTime = clock(); } 开始时间构造对象 double ElapsedTime() const

{

clock_t endTime = clock(); // 临时变量 // 循环赋值实现交换e1, e2

// 显示数组elem 的各数据元素值

显示elem[i]

换行

// 构造函数, 由当前时间作为

// 返回已过的时间

// 结束时间

// //

return (double)(endTime - startTime) / (double)CLK_TCK;

// 计算已过时间

};

}

void Reset(){ startTime = clock(); } // 重置开始时间

// 通用异常类Error #define MAX_ERROR_MESSAGE_LEN 100 class Error {

private: // 数据成员

char message[MAX_ERROR_MESSAGE_LEN]; // 异常信息

public:

// 方法声明

Error(char mes[] = "一般性异常!"){ strcpy(message, mes); }

// 构造函数

void Show() const{ cout

// 显示异常信息

}; // 随机数类Rand class Rand {

public:

// 方法声明

static void SetRandSeed(){ srand((unsigned)time(NULL)); }

// 设置当前时间为随机数种子

static int GetRand(int n){ return rand() % n; }

// 生成0 ~ n-1之间的随机数

}; #endif

static int GetRand(){ return rand(); } // 生成0 ~ n-1之间的随机数

计算机与通信学院课程设计评分表

教师签名: 日 期:

(注:1.此页附在课程设计报告之后;2.综合成绩按优、良、中、及格和不及格五级评定。)


相关内容

  • 五子棋程序设计报告
  • 宜宾学院 面向对象课程设计 学院:_计算机与信息工程学院_班级: 2014级6班 学生姓名: 郑亮学号:141106020 设计地点(单位)_________宜宾学院__________ 设计题目:____________双人五子棋_____________ 完成日期:2015年 12月 5日 目录 ...

  • 由一枚"骰子"谈中学数学教学
  • 由一枚"骰子"谈中学数学教学 "骰子"俗称"色子",是进行娱乐消遣的一种工具,今天它频频出现在中学数学教学中,成为中学生学习数学的一种学具,其中体现了现代数学方法和思想,为数学增添了丰富多彩的趣味性,和生活气息,从而使数学更生动化.生活化. ...

  • 我的大学计算机生活
  • 我是2005届的学生,毕业快一年了,对自己的大学生活做简要的回顾,并说明一下自己认为的学习计算机比较重要的课程,并推荐一些好书. 我从大一下学期开始学习计算机,刚开始学习VB(学校的公选课) ,认真学习了两个月之后,发现学习VB 主要是拖放一些按钮控件,没有一点挑战性,学会后,也不能构成自己的核心竞 ...

  • 掷一掷教学案例
  • <掷一掷>教学案例 符晓 教材分析:<掷一掷>原是人教版<义务教育课程标准实验教科书数学>三年级上册第九单元的内容.新教材将这一内容移到五年级上学期,概率论是研究不确定现象的规律性的数学分支.教材在学生学习完了"可能性"这一单元后,设计了这个以 ...

  • 超市管理系统 C++实验报告
  • 信息学院 <C++程序设计实践课程> 实践报告 题目: 食品管理系统 专业: 信息管理与信息系统 班级: 0802班 学号: 完成日期: 2011年 6 月 1 日 姓名: 指导教师: 1.实践题目 食品管理系统:通过对C++的继承和派生的运用,开发一个管理食品,实现对基类食品的管理及对 ...

  • 设计题目要求举例
  • 数据结构课程设计题目 地图着色 马踏棋盘 栈的实现 八皇后算法 车厢调度 公园导游图 通讯录实现 同学录实现 导游系统实现 最小生成树实现 统计成绩系统 利用学到的编程知识和编程技巧,通过布置具有一定难度的程序设计题目,让学生自己到图书馆查阅资料或网上咨询独立完成程序的编写,并能运用学过的技巧独立上 ...

  • 研究性学习论文范文
  • 2010 NO.35 China Education Innovation Herald 科 教 创 新 开展研究性学习,培养创新人才① 黄朝兵 肖攸安 吴巍 陈德军 (武汉理工大学信息工程学院 武汉 430070) 摘 要:培养创新人才是高等教育发展的主旋律.以"基于创新人才培养的研究性 ...

  • c++课程设计报告模板
  • 课程名称: 设计题目: 输入一批学生某门课程考试的各题分数,计算 每个人的总分,统计各分数段0-49.50-59.60-69.70-79.80-89.90-100的人数及占总人数的百分比 姓 名: 王 丹 学 号: 1108020204 专业班级: 网络 1102 班 完成日期: 2012年06 月 ...

  • C++高校人员信息管理系统
  • <基于C++的面向对象程序设计实例> 课程设计报告 课题名称 高校人员信息管理系统 专 业 计算机科学与技术 班 级 1220541 学 号 122054113 姓 名 苗鹏程 指导教师 (一).课程设计题目: 高校人员信息管理系统 (二).目的与要求: 1.目的: (1)要求学生达到熟 ...