C++ 實戰(zhàn)開發(fā)一個猜單詞的小游戲
前言
程序內(nèi)的單詞全部保存于word.txt的文本文檔中,玩家排名保存在rand.txt文本文檔中。運行程序時,會自動讀取文本中的內(nèi)容。
游戲規(guī)則:①先請用戶輸入猜的單詞數(shù)量,可以有一個默認值。②隨機抽取單詞,對每個單詞,系統(tǒng)根據(jù)謎底單詞長度在屏幕上顯示相應(yīng)個數(shù)'#',假設(shè)謎底單詞為"hello",則在屏幕上輸出"#####"。③玩家輸入一個字母進行猜測,如果這個字母不在單詞中,系統(tǒng)提示玩家不對;如果猜對字母,比如玩家輸入了一個'l',則在屏幕上輸出"--ll-"。④重復(fù)③,直到玩家在規(guī)定的次數(shù)內(nèi)猜出了單詞或者超過次數(shù)游戲失敗。⑤顯示玩家每個單詞猜對與猜錯次數(shù)等統(tǒng)計信息。如果玩家猜出單詞,計算成績,如進入前五名提示玩家并記錄存儲到記錄文件中。⑥詢問玩家是否開始新一輪猜詞,如果玩家選“否”,則系統(tǒng)退到外面的菜單。
效果展示


一、函數(shù)接口
enum
{
EXIT=0,
START,
CHECK,
CLEAR
};
//玩家結(jié)構(gòu)體聲明
typedef struct
{
string name;
int right;//猜對單詞個數(shù)
int wrong;//猜錯個數(shù)
int score;//得分
}GamePlayer;
void Show_Menu();//展示菜單內(nèi)容
void exitsystem();//退出系統(tǒng)
void PlayGame(char File[200][100], vector<GamePlayer>& v);//開始游戲
void Check();//查看排名
void OpenFile(char File[200][100]);//打開單詞文檔,導(dǎo)入到char數(shù)組中
void Clear();//清空玩家名單
int GuessWordNum(int& GWN);//設(shè)置猜單詞的數(shù)量
string InputName(string& name);//輸入玩家的姓名
void Sort(vector<GamePlayer>& v);//將vector數(shù)組中的玩家按分數(shù)排名
//對自定義類型的數(shù)組排序的前置比較函數(shù)
static bool myCompare(const GamePlayer& player1, const GamePlayer& player2);
void InFile(vector<GamePlayer>& v);//將排好序的玩家排名寫入到"rand.txt"中
二、重要函數(shù)接口詳解
1.菜單內(nèi)容
void Show_Menu()
{
cout << "*****************************************" << endl;
cout << "**********歡迎使用猜單詞小程序!*********" << endl;
cout << "*************0.退出單詞小程序************" << endl;
cout << "*************1.開始游戲******************" << endl;
cout << "*************2.查看玩家排名**************" << endl;
cout << "*************3.清空玩家排名**************" << endl;
cout << endl;
}
2.退出程序
void exitsystem()
{
cout << "歡迎下次使用" << endl;
system("pause");
exit(0);
3.打開單詞文件
void OpenFile(char File[200][100])
{
ifstream ifs;
int iline = 0;
ifs.open("word.txt", ios::in);
if (ifs)
{
while (!ifs.eof())
{
ifs >> File[iline];
iline++;
if (iline >= 200)
{
break;
}
}
}
else
cout << "對不起,讀取的單詞本為空" << endl;
}
4.開始游戲
void PlayGame(char File[200][100], vector<GamePlayer>& v)
{
int flag = 0;
OpenFile(File);
string name;
InputName(name);
int GWN = 0;
GuessWordNum(GWN);
int right = 0;
int wrong = 0;
while (GWN)
{
int Rand = 0;//設(shè)置隨機數(shù),放入到FiIe數(shù)組中
srand(time(NULL));//設(shè)置一個隨機種子
Rand = rand() % 199;//隨機取出單詞
cout << "————————您一共有10次猜的機會——————" << endl;
cout << "————下面是所猜單詞的長度->用#來代替——————" << endl;
int length = strlen(File[Rand]);
for (int i = 0; i < length; i++)
{
cout << "#";
}
cout << endl;
int chance = 10;
while (chance)
{
string guessword;
cin >> guessword;
if (guessword == File[Rand])
{
cout << "恭喜你,猜對了" << endl;
right++;
flag = 1;
break;
}
else
{
chance--;
if (chance >= 1)
{
cout << "對不起,您猜錯了" << endl;
cout << "您還有" << chance << "次機會,請好好把握" << endl;
}
else
{
cout << "對不起,本輪您已經(jīng)沒有機會了" << endl;
cout << "很遺憾,沒猜出..." << endl;
cout << "正確單詞為" << File[Rand] << endl;
break;
}
}
}
GWN--;
if (flag == -1)
{
wrong++;
}
if (GWN == 0)
{
cout << "您是否要進行下一輪游戲" << endl;
cout << "如果確定請輸入Y,如果退出請按任意鍵" << endl;
char s;
cin >> s;
if (s == 'y' || s == 'Y')
{
cout << "請輸入您要猜單詞的個數(shù)" << endl;
int i = 0;
cin >> i;
GWN = i;
}
else
{
int score = 20 * right - 10 * wrong;
cout << "本輪游戲您一共猜對了" << right << "個單詞" << "猜錯了" << wrong << "個單詞" << endl;
cout << "本輪游戲您一共得分為" << score << endl;
GamePlayer GP;
GP.name = name;
GP.right = right;
GP.wrong = wrong;
GP.score = score;
v.push_back(GP);
cout << endl;
cout << endl;
cout << endl;
cout << endl;
}
}
}
}
5.查看玩家排名
void Check()
{
ifstream ifs("rand.txt");
vector<string> show;
string line;
while (getline(ifs, line)) //判斷排名文本是否為空
{
show.push_back(line);
}
int count = show.size();
if (show.size() >= 1)
{
int i = 0;
for (; i < count; i++)
{
cout << show[i] << endl;
}
cout << endl;
cout << endl;
cout << endl;
cout << endl;
cout << endl;
return;
}
else
{
cout << "對不起,暫時沒有排名" << endl;
cout << endl;
cout << endl;
cout << endl;
cout << endl;
cout << endl;
}
6.清空玩家排名
void Clear()
{
cout << "您確定要刪除所有玩家的記錄嗎?" << endl;
cout << "如果確定請輸入Y,如果退出請按任意鍵" << endl;
char s;
cin >> s;
if (s == 'y' || s == 'Y')
{
ofstream file("rand.txt", ios::trunc);
if (!file)
{
cout << "清空文本失敗" << endl;
exit(0);
}
file.close();
return;
}
else
{
return;
}
}
7.玩家排名
這里對玩家的分數(shù)進行排序,利用qsort庫函數(shù)
static bool myCompare(const GamePlayer& player1, const GamePlayer& player2)
{
return player1.score > player2.score;
}
void Sort(vector<GamePlayer>& v)
{
sort(v.begin(), v.end(), myCompare);
InFile(v);
}
全部代碼展示
#include<fstream>
#include<iostream>
#include<string>
#include<vector>
#include<time.h>
#include <algorithm>
using namespace std;
enum
{
EXIT=0,
START,
CHECK,
CLEAR
};
//玩家結(jié)構(gòu)體聲明
typedef struct
{
string name;
int right;//猜對單詞個數(shù)
int wrong;//猜錯個數(shù)
int score;//得分
}GamePlayer;
void Show_Menu();//展示菜單內(nèi)容
void exitsystem();//退出系統(tǒng)
void PlayGame(char File[200][100], vector<GamePlayer>& v);//開始游戲
void Check();//查看排名
void OpenFile(char File[200][100]);//打開單詞文檔,導(dǎo)入到char數(shù)組中
void Clear();//清空玩家名單
int GuessWordNum(int& GWN);//設(shè)置猜單詞的數(shù)量
string InputName(string& name);//輸入玩家的姓名
void Sort(vector<GamePlayer>& v);//將vector數(shù)組中的玩家按分數(shù)排名
//對自定義類型的數(shù)組排序的前置比較函數(shù)
static bool myCompare(const GamePlayer& player1, const GamePlayer& player2);
void InFile(vector<GamePlayer>& v);//將排好序的玩家排名寫入到"rand.txt"中
void Show_Menu()
{
cout << "*****************************************" << endl;
cout << "**********歡迎使用猜單詞小程序!*********" << endl;
cout << "*************0.退出單詞小程序************" << endl;
cout << "*************1.開始游戲******************" << endl;
cout << "*************2.查看玩家排名**************" << endl;
cout << "*************3.清空玩家排名**************" << endl;
cout << endl;
}
void OpenFile(char File[200][100])
{
ifstream ifs;
int iline = 0;
ifs.open("word.txt", ios::in);
if (ifs)
{
while (!ifs.eof())
{
ifs >> File[iline];
iline++;
if (iline >= 200)
{
break;
}
}
}
else
cout << "對不起,讀取的單詞本為空" << endl;
}
int GuessWordNum(int& GWN)
{
cout << "請輸入你想猜單詞的數(shù)量" << endl;
cin >> GWN;
return GWN;
}
string InputName(string& name)
{
cout << "請輸入您的名字: " << endl;
cin >> name;
return name;
}
void exitsystem()
{
cout << "歡迎下次使用" << endl;
system("pause");
exit(0);
}
void InFile(vector<GamePlayer>& v)
{
ofstream ofs;
ofs.open("rand.txt", ios::out);
if (ofs)
{
for (auto e : v)
{
ofs << "姓名:" << e.name << " " << "答對:" << e.right << " " << "答錯:" << e.wrong << "得分:" << " "
<< e.score << " " << endl;
}
}
else
{
cout << "對不起,沒有這個排名本" << endl;
}
}
static bool myCompare(const GamePlayer& player1, const GamePlayer& player2)
{
return player1.score > player2.score;
}
void Sort(vector<GamePlayer>& v)
{
sort(v.begin(), v.end(), myCompare);
InFile(v);
}
void PlayGame(char File[200][100], vector<GamePlayer>& v)
{
int flag = 0;
OpenFile(File);
string name;
InputName(name);
int GWN = 0;
GuessWordNum(GWN);
int right = 0;
int wrong = 0;
while (GWN)
{
int Rand = 0;//設(shè)置隨機數(shù),放入到FiIe數(shù)組中
srand(time(NULL));//設(shè)置一個隨機種子
Rand = rand() % 199;//隨機取出單詞
cout << "————————您一共有10次猜的機會——————" << endl;
cout << "————下面是所猜單詞的長度->用#來代替——————" << endl;
int length = strlen(File[Rand]);
for (int i = 0; i < length; i++)
{
cout << "#";
}
cout << endl;
int chance = 10;
while (chance)
{
string guessword;
cin >> guessword;
if (guessword == File[Rand])
{
cout << "恭喜你,猜對了" << endl;
right++;
flag = 1;
break;
}
else
{
chance--;
if (chance >= 1)
{
cout << "對不起,您猜錯了" << endl;
cout << "您還有" << chance << "次機會,請好好把握" << endl;
}
else
{
cout << "對不起,本輪您已經(jīng)沒有機會了" << endl;
cout << "很遺憾,沒猜出..." << endl;
cout << "正確單詞為" << File[Rand] << endl;
break;
}
}
}
GWN--;
if (flag == -1)
{
wrong++;
}
if (GWN == 0)
{
cout << "您是否要進行下一輪游戲" << endl;
cout << "如果確定請輸入Y,如果退出請按任意鍵" << endl;
char s;
cin >> s;
if (s == 'y' || s == 'Y')
{
cout << "請輸入您要猜單詞的個數(shù)" << endl;
int i = 0;
cin >> i;
GWN = i;
}
else
{
int score = 20 * right - 10 * wrong;
cout << "本輪游戲您一共猜對了" << right << "個單詞" << "猜錯了" << wrong << "個單詞" << endl;
cout << "本輪游戲您一共得分為" << score << endl;
GamePlayer GP;
GP.name = name;
GP.right = right;
GP.wrong = wrong;
GP.score = score;
v.push_back(GP);
cout << endl;
cout << endl;
cout << endl;
cout << endl;
}
}
}
}
void Check()
{
ifstream ifs("rand.txt");
vector<string> show;
string line;
while (getline(ifs, line))
{
show.push_back(line);
}
int count = show.size();
if (show.size() >= 1)
{
int i = 0;
for (; i < count; i++)
{
cout << show[i] << endl;
}
cout << endl;
cout << endl;
cout << endl;
cout << endl;
cout << endl;
return;
}
else
{
cout << "對不起,暫時沒有排名" << endl;
cout << endl;
cout << endl;
cout << endl;
cout << endl;
cout << endl;
}
}
void Clear()
{
cout << "您確定要刪除所有玩家的記錄嗎?" << endl;
cout << "如果確定請輸入Y,如果退出請按任意鍵" << endl;
char s;
cin >> s;
if (s == 'y' || s == 'Y')
{
ofstream file("rand.txt", ios::trunc);
if (!file)
{
cout << "清空文本失敗" << endl;
exit(0);
}
file.close();
return;
}
else
{
return;
}
}
int main()
{
int choice=0;
char File[200][100];
vector<GamePlayer> v;
while (true)
{
Show_Menu();
cout << "請輸入您的選擇: " << endl;
cout << "請不要輸入除數(shù)字以外的字母或符號: " << endl;
cin >> choice;
switch (choice)
{
case EXIT://退出系統(tǒng)
exitsystem();
break;
case START://開始游戲
{
PlayGame(File, v);
Sort(v);
break;
}
case CHECK://查看玩家排名
Check();
break;
case CLEAR://查看玩家排名
Clear();
break;
default:
system("cls");//清屏操作
break;
}
}
return 0;
}
到此這篇關(guān)于C++ 實戰(zhàn)開發(fā)一個猜單詞的小游戲的文章就介紹到這了,更多相關(guān)C++ 猜單詞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
OpenCV鼠標(biāo)繪制矩形和截取矩形區(qū)域圖像
這篇文章主要為大家詳細介紹了OpenCV鼠標(biāo)繪制矩形和截取矩形區(qū)域圖像,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01

