在碰运气游戏中最常见到的是“投掷双骰子”游戏,这种游戏在影视作品中经常会见到。游戏规则是:游戏者每次投掷两颗骰子,每颗骰子是一个正方体,有6面,上面分别标有1、2、3、4、5、6个圆点,当骰子停止时,将每个骰子朝上的点数相加,在第一次投掷骰子时,如果所得到的和为7或11,那么游戏者为赢得胜利;如果所得到的和为2、3或12,那么游戏者输掉了;如果和为4、5、6、8、9或10,那么此和为游戏者的点数,如果想要赢得胜利,必须继续投掷骰子,直到取得自己的点数(也就是第一次投掷出的4、5、6、8、9或10)为止,如果投掷出的和为7,那么游戏者输掉了游戏。
设计该程序中应包括以下几个功能:
1. 主菜单界面。包含所具有所有功能的选项。
2. 获得游戏帮助功能。告诉游戏者游戏规则。
3. 显示游戏数据功能。在游戏结束时,显示游戏者获得的游戏数据。
4. 模拟游戏功能。选择进入,开始游戏。
5. 退出模拟游戏功能。玩完游戏后退出程序。
Visual Studio 2017
先建立类DiceGame的对象objGame并调用类DiceGame的构造函数,为类的数据成员赋初值并开始游戏,再用对象objGame访问类的成员函数Game(),进入游戏,通过选项玩家选择进入游戏或退出游戏。在函数Game()中,先调用Help()函数显示游戏规则,并调用Rand类中SetRandSeed()函数设定当前时间为随机数种子,进入while循环中,显示游戏选项,玩家可选择1.获得帮助。 然后调用成员函数Help()显示提示;2.开始游戏。 然后调用成员函数RollDice(),把随机的两个骰子的点数赋值给整形数sum,通过switch()语句判断玩家输、赢或者平局。若玩家第一盘为平局状态为TIE,则该局骰子和为玩家的点数把sum赋值给myPoint通过调用UserSaysYes()函数选择继续投骰子,直到赚到该点数时获胜状态为WIN,但是用if语句判断如果投掷出的和为7或者连续投掷出六次平局,则游戏者该局为输了LOSE。最后用while循环中的if语句为每一次输赢和平局计数并显示玩家的输赢的语句。3.退出游戏 。然后调用UserSaysYes()函数让玩家确定是否退出,退出后通过调用成员函数Show()显示游戏结果,游戏结束!
定义一个骰子游戏类DiceGame,其声明如下:
class DiceGame
{
Private
// 数据成员:
int numOfWin; // 胜利数次
int numOfLose; // 失败数次
int numOfTie; // 平局数次
// 辅助函数
int RollDice(); // 模拟投掷一次骰子
void Help(); // 获得帮助
void Show(); // 显示统计结果
public:
// 方法声明:
DiceGame(); // 无参数的构造函数
virtual ~DiceGame(){} // 析构函数
void Game (); // 模拟游戏
};
定义随机数Rand类:
// 随机数类Rand
class Rand
{
public:
// 方法声明
static void SetRandSeed() { srand((unsigned)time(NULL)); }
// 设置当前时间为随机数种子
static int GetRand(int n) { return rand() % n; }
// 生成0 ~ n-1之间的随机数
//static int GetRand() { return rand(); } // 生成0 ~ n-1之间的随机数
};
1.获得帮助
玩家输入选择select为1,通过条件语句if(select==1)判断是否满足条件,然后再调用类的成员函数Help(),则显示帮助信息。
void DiceGame::Help() // 获得帮助
{
cout << " 游戏者每次投掷两颗骰子,每个骰子是一个正方体,有" << endl;
cout << "6面上面分别标有1、2、3、4、5、6个圆点,当骰子停止时" << endl;
cout << ",将每个骰子朝上的点的数相加,在第一次投掷骰时, 如果" << endl;
cout << "所得到的和为7或11,那么游戏者为赢得胜利; 如果所得到" << endl;
cout << "的和为2、3或12,那么游戏者为输掉了;如果和为4、5、6" << endl;
cout << "、8、9或10,那么为游戏者的点数;如要想赢得胜利,必" << endl;
cout << "须继续投掷骰子,直到取得自已的点数为止, 但是如果投" << endl;
cout << "掷出的和为7或投掷6次仍未赚到该点数,则游戏者为输了." << endl << endl;
}
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) ,则判断玩家为输了。
void DiceGame::Game() // 模拟游戏
{
int select = 1;
int sum, myPoint;
GameStatus status; // 游戏状态
Rand::SetRandSeed(); // 设置当前时间为随机数种子
Help(); // 获得帮助
while (select != 3)
{
cout << endl << endl << "请选择:" << endl;
cout << "1. 游戏规则" << endl;
cout << "2. 开始游戏" << endl;
cout << "3. 退出游戏" << endl;
cin >> select; // 输入选择
if (select != 1 && select != 2 && select != 3) //若输入不是 1,2,3 重新输入
{
cout << "请用1,2,3回答" << endl;
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,输了
case 3:
case 12:
status = LOSE;
numOfLose++;//统计
break;
default: //投得其他数值,处于平局
status = TIE;
myPoint = sum;
numOfTie++;
cout << "点数" << myPoint << endl;
}
while (1)
{
if (status == WIN)
{
cout << "恭喜你,赢得游戏!" << endl;
break;
}
if (status == LOSE)
{
cout << "很遗憾,你输了!" << endl;
break;
}
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 << "你已平局6次,";
break;
}
}
}
}
}
}
else if (select == 3) //输入为3
{
if (UserSaysYes()) //退出游戏
break;
else
select = 1; //返回游戏
}
}
}
Show(); // 显示统计结果
}
3. 退出游戏
玩家输入选择select为3,在while()驯悍中通过语句else if(select==3)判断,用语句if(UserSaysYes())确认玩家是否要退出游戏,若回答为”y”则 跳出循环break,最后程序会调用类的成员函数Show()显示玩家游戏的结果。
void DiceGame::Show() // 显示统计结果
{
cout << "选手游戏统计:" << endl;
cout << "获胜" << numOfWin << "次" << endl;
cout << "失败" << numOfLose << "次" << endl;
cout << "平局" << numOfTie << "次" << endl;
cout << " <<<欢迎您下次再来玩>>> " << endl;
cout << " <<<再见>>> " << endl;
cout << "--------------------------------------------------" << endl;
}
1.骰子游戏开始界面
图 5.1
2.未按照规则输入1、2、3,给出提示
图 5.2
3.选择1,获得游戏帮助
图 5.3
4.选择2开始游戏,直接获得胜利。
图5.4
5.选择2开始游戏,当遇到平局时,提示是否继续游戏。
图5.5
6.输掉游戏。
图5.6
7.选择3,结束游戏并打印获胜、失败及平局的次数。
图5.7
对于本次课程设计,有很多的心得体会。以下省略。
头文件dice_game.h代码如下:
typedef enum { WIN, LOSE, TIE } GameStatus; // WIN:赢,LOSE:输,TIE:平局
// 骰子游戏类DiceGame声明
class DiceGame
{
private:
// 数据成员:
int numOfWin; // 胜利数次
int numOfLose; // 失败数次
int numOfTie; // 平局数次
// 辅助函数
int RollDice(); // 模拟投掷一次骰子
void Help(); // 获得帮助
void Show(); // 显示统计结果
public:
// 方法声明:
DiceGame(); // 无参数的构造函数
~DiceGame() {} // 析构函数
void Game(); // 模拟游戏
};
// 骰子游戏类DiceGame的实现部分
DiceGame::DiceGame() // 初始化骰子游戏
{
numOfWin = 0; // 胜利数次
numOfLose = 0; // 失败数次
numOfTie = 0; // 平局数次
cout << "游戏开始" << endl;
}
int DiceGame::RollDice() // 模拟投掷一次骰子,返回值为所投掷的两颗骰子向上一面的点数之和
{
int numOfDice1; // 所投掷的第1颗骰子向上一面的点数
int numOfDice2; // 所投掷的第2颗骰子向上一面的点数
int sum; // 所投掷的两颗骰子向上一面的点数之和
numOfDice1 = 1 + Rand::GetRand(6); // 模拟所投掷骰子1的点数
numOfDice2 = 1 + Rand::GetRand(6); // 模拟所投掷骰子2的点数
sum = numOfDice1 + numOfDice2; // 计算所投掷两颗骰子向上一面的点数之和
cout << "第一个点数" << numOfDice1 << endl;
cout << "第二个点数" << numOfDice2 << endl;
cout << "总点数" << sum << endl;
return sum; // 返回所掷骰子向上一面点数之和
}
void DiceGame::Help() // 获得帮助
{
cout << " 游戏者每次投掷两颗骰子,每个骰子是一个正方体,有" << endl;
cout << "6面上面分别标有1、2、3、4、5、6个圆点,当骰子停止时" << endl;
cout << ",将每个骰子朝上的点的数相加,在第一次投掷骰时, 如果" << endl;
cout << "所得到的和为7或11,那么游戏者为赢得胜利; 如果所得到" << endl;
cout << "的和为2、3或12,那么游戏者为输掉了;如果和为4、5、6" << endl;
cout << "、8、9或10,那么为游戏者的点数;如要想赢得胜利,必" << endl;
cout << "须继续投掷骰子,直到取得自已的点数为止, 但是如果投" << endl;
cout << "掷出的和为7或投掷6次仍未赚到该点数,则游戏者为输了." << endl << endl;
}
void DiceGame::Show() // 显示统计结果
{
cout << "选手游戏统计:" << endl;
cout << "获胜" << numOfWin << "次" << endl;
cout << "失败" << numOfLose << "次" << endl;
cout << "平局" << numOfTie << "次" << endl;
cout << " <<<欢迎您下次再来玩>>> " << endl;
cout << " <<<再见>>> " << endl;
cout << "--------------------------------------------------" << endl;
}
void DiceGame::Game() // 模拟游戏
{
int select = 1;
int sum, myPoint;
GameStatus status; // 游戏状态
Rand::SetRandSeed(); // 设置当前时间为随机数种子
Help(); // 获得帮助
while (select != 3)
{
cout << endl << endl << "请选择:" << endl;
cout << "1. 游戏规则" << endl;
cout << "2. 开始游戏" << endl;
cout << "3. 退出游戏" << endl;
cin >> select; // 输入选择
if (select != 1 && select != 2 && select != 3) //若输入不是 1,2,3 重新输入
{
cout << "请用1,2,3回答" << endl;
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,输了
case 3:
case 12:
status = LOSE;
numOfLose++;//统计
break;
default: //投得其他数值,处于平局
status = TIE;
myPoint = sum;
numOfTie++;
cout << "点数" << myPoint << endl;
}
while (1)
{
if (status == WIN)
{
cout << "恭喜你,赢得游戏!" << endl;
break;
}
if (status == LOSE)
{
cout << "很遗憾,你输了!" << endl;
break;
}
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 << "你已平局6次,";
break;
}
}
}
}
}
}
else if (select == 3) //输入为3
{
if (UserSaysYes()) //退出游戏
break;
else
select = 1; //返回游戏
}
}
}
Show(); // 显示统计结果
}
头文件Utility.h代码如下:
#include // 标准串和操作
#include // 标准流操作
#include // 日期和时间函数
using namespace std; // 标准库包含在命名空间std中
// 实用函数
char GetChar(istream &inStream = cin); // 从输入流inStream中跳过空格及制表符获取一字符
bool UserSaysYes(); // 当用户肯定回答(yes)时, 返回true, 用户否定回答(no)时,返回false
// 实用类
class Rand; // 随机数类Rand
char GetChar(istream &in) // 从输入流in中跳过空格及制表一字符
{
char ch; // 临时变量
while ((ch = in.peek()) != EOF // 文件结束符(peek()函数从输入流中接受1
// 字符,流的当前位置不变)
&& ((ch = in.get()) == ' ' // 空格(get()函数从输入流中接受1字符,流
// 的当前位置向后移1个位置)
|| ch == '\t')); // 制表符
return ch; // 返回字符
//当未到文件末尾 读下一个字符,该字符为空格或制表符时,不断循环
}
bool UserSaysYes() // 当用户肯定回答(yes)时, 返回true, 用户否定回答(no)时,返回false
{
char ch; // 用户回答字符
bool initialResponse = true; // 初始回答
do
{ // 循环直到用户输入恰当的回答为止
if (initialResponse) cout << "(y, n)?"; // 初始回答
else cout << "用y或n回答:"; // 非初始回答
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
}
// 随机数类Rand
class Rand
{
public:
// 方法声明
static void SetRandSeed() { srand((unsigned)time(NULL)); }
// 设置当前时间为随机数种子
static int GetRand(int n) { return rand() % n; }
// 生成0 ~ n-1之间的随机数
//static int GetRand() { return rand(); } // 生成0 ~ n-1之间的随机数
};
源文件game.cpp代码如下:
#include"Utility.h"
#include "dice_game.h" // 骰子游戏
#include
using namespace std;
int main(void) // 主函数main(void)
{
DiceGame objGame; // 骰子游戏对象
objGame.Game(); // 运行游戏
system("PAUSE"); // 调用库函数system()
return 0; // 返回值0, 返回操作系统
}
如有UI界面需求,请点击:QT5编程入门教学