// RSC.h
#ifndef _RSC_H_
#define _RSC_H_
#include <iostream>
#include <string>
#include <ctime>
using std::cout;
using std::cin;
using std::endl;
//////////////////////////////////////////////////////////////////////////
#ifndef NULL
#define NULL 0
#endif // NULL
const int MAX_SIZE = 80;
//////////////////////////////////////////////////////////////////////////
// 選項
typedef enum { ROCK, SCISSOR, CLOTH, DISPLAY, HELP, QUIT } SelectType;
// 結果
typedef enum { WIN, LOSE, TIE } ResultType;
//////////////////////////////////////////////////////////////////////////
class CRSCGame
{
public:
CRSCGame(void);
~CRSCGame(void);
// 遊戲主框架,為遊戲主體開始處
void Game(void);
// 顯示提示信息(這裏相當地簡陋) 可以寫為內聯
void Helps(void);
protected:
// 獲得輸入,處理玩家的選擇
void GetChoice(void);
// 對電腦和玩家選擇的選項的處理,並產生結果
void MsgProc(void);
// 輸出遊戲信息,選擇的選項,遊戲結果如何
void Informations(SelectType comsLastChoice);
// 轉換函數,將選擇的選項轉換為相應的字符串
std::string ChoiceToStr(SelectType selectType);
private:
SelectType m_select; // 選擇
ResultType m_result; // 結果
int m_sum[3]; // 統計遊戲結果(輸贏次數)
};
//////////////////////////////////////////////////////////////////////////
CRSCGame::CRSCGame()
: m_select(HELP), m_result(TIE)
{
for (int i=0; i<3; ++i)
{// sum[0]為遊戲已進行的總局數,sum[1]為玩家贏的次數,sum[2]為平局次數
m_sum[i] = 0;
}
}
CRSCGame::~CRSCGame()
{
}
// public
void CRSCGame::Game()
{
while (true)
{
try
{
GetChoice();
}
catch (const char *szInfo)
{
std::cout << szInfo << std::endl;
continue;
}
if (QUIT == m_select)
{
break;
}
MsgProc();
}
return ;
}
void CRSCGame::Helps()
{
std::cout << "設定如下:\n" << "輸入\t\t對應的選擇\n"
<< " r\t\t ROCK\n" << " s\t\t SCISSOR\n" << " c\t\t CLOTH\n"
<< "\n d\t\t DISPLAY\n" << " h\t\t HELP\n" << " q\t\t QUIT\n";
return ;
}
// protected
void CRSCGame::MsgProc()
{
// 電腦隨機選取
SelectType comsSelect = SelectType(rand()%3);
switch (m_select)
{
case HELP:
Helps();
return ;
break;
case DISPLAY:
{
std::cout << "已進行局數:" << m_sum[0] << std::endl;
std::cout << "玩家獲勝:" << m_sum[1] << " "
<< "平局數:" << m_sum[2] << std::endl;
}
return ;
break;
default:
break;
}
++m_sum[0];
if (((ROCK==m_select)&&(SCISSOR==comsSelect))
|| ((SCISSOR==m_select)&&(CLOTH==comsSelect))
|| ((CLOTH==m_select)&&(ROCK==comsSelect)))
{
m_result = WIN; // 該局獲勝
++m_sum[1];
}
else if (m_select == comsSelect)
{
m_result = TIE; // 平手
++m_sum[2];
}
else
{
m_result = LOSE; // 玩家輸了
}
Informations(comsSelect);
return ;
}
void CRSCGame::GetChoice()
{
char szSelectBuf[MAX_SIZE];
std::cout << "請輸入(r/s/c/d/h/q):";
std::cin.getline(szSelectBuf, MAX_SIZE);
switch (szSelectBuf[0])
{
case 'd':
m_select = DISPLAY;
break;
case 'h':
m_select = HELP;
break;
case 'r':
m_select = ROCK;
break;
case 's':
m_select = SCISSOR;
break;
case 'c':
m_select = CLOTH;
break;
case 'q':
m_select = QUIT;
break;
default:
throw "Unknown Input!Try again please...";
break;
}
return ;
}
void CRSCGame::Informations(SelectType comsLastChoice)
{
std::cout << "此次電腦的選擇:" << ChoiceToStr(comsLastChoice) << std::endl;
std::cout << "此次妳的選擇:\t" << ChoiceToStr(m_select) << std::endl;
switch (m_result)
{
case WIN:
{
std::cout << "妳贏了!" << std::endl;
}
break;
case LOSE:
{
std::cout << "唉,妳輸嘞!" << std::endl;
}
break;
case TIE:
{
std::cout << "咦,是個平局!" << std::endl;
}
break;
default:
break;
}
return ;
}
std::string CRSCGame::ChoiceToStr(SelectType selectType)
{
switch (selectType)
{
case ROCK:
return "ROCK";
break;
case SCISSOR:
return "SCISSOR";
break;
case CLOTH:
return "CLOTH";
break;
default:
break;
}
return "";
}
#endif // _RSC_H_
// Main_RSC.cpp
#include "RSC.h"
//////////////////////////////////////////////////////////////////////////
int main(int argc, char **argv)
{
CRSCGame theGame;
srand(unsigned(time(NULL)));
theGame.Helps();
theGame.Game();
return 0;
} // end main