C++骰子游戏课程设计(含源码)

一、目的与要求

1.1课程设计题目

在碰运气游戏中最常见到的是“投掷双骰子”游戏,这种游戏在影视作品中经常会见到。游戏规则是:游戏者每次投掷两颗骰子,每颗骰子是一个正方体,有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功能

设计该程序中应包括以下几个功能:

1. 主菜单界面。包含所具有所有功能的选项。

2. 获得游戏帮助功能。告诉游戏者游戏规则。

3. 显示游戏数据功能。在游戏结束时,显示游戏者获得的游戏数据。

4. 模拟游戏功能。选择进入,开始游戏。

5. 退出模拟游戏功能。玩完游戏后退出程序。

二、工具/准备工作

Visual Studio 2017

三、分析

3.1项目的实现方法

先建立类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()显示游戏结果,游戏结束!

3.2  类的声明

定义一个骰子游戏类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 <string>					    // 标准串和操作
#include <iostream>					// 标准流操作
#include <ctime>       				// 日期和时间函数
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<iostream>
using namespace std;
int main(void)					 // 主函数main(void)
{
	DiceGame objGame;				 // 骰子游戏对象
	objGame.Game();				 // 运行游戏     

	system("PAUSE");				 // 调用库函数system()
	return 0;						 // 返回值0, 返回操作系统
}

如有UI界面需求,请点击:QT5编程入门教学

猜你喜欢

转载自blog.csdn.net/m0_61684063/article/details/124087082