C++里面程序设计实践里面石头剪刀布版的王者农药实例:
算法分析:
我们需要构造一个英雄类,里面包含英雄的名字,使用次数以及血量(由于第一次使用,所以暂时没有血量)`
class Hero {
private:
string name;
int times;
int blood;
public:
Hero();
Hero(string n, int t, int b) {
name = n; times = t; blood = b;
}
void CreateHero();
void PlayGames();
bool isWin(int a, int b);
bool isEnd(int a);
int Score(int a,int b,int c);
void Game();
void Start();
void Rules();
};
调用构造函数:
Hero::Hero() {}
Hero hero[N] = { Hero("赵云",10,120),Hero("宫本武藏",10,120),Hero("凯",10,120),Hero("白起",10,120),Hero("韩信",10,120),
Hero("诸葛亮",10,120),Hero("刘邦",10,120),Hero("妲己",10,120),Hero("安琪拉",10,120),Hero("貂蝉",10,120),
Hero("露娜",10,120),Hero("不知火舞",10,120),Hero("蔡文姬",10,120),Hero("鲁班七号",10,120),Hero("后羿",10,105),
Hero("扁鹊",10,115),Hero("马可波罗",10,150),Hero("李白",10,150),Hero("关羽",10,160),Hero("曹操",10,100)};
void Hero::CreateHero() {
cout << "序号" << " " << "名字" << " " << "次数" << " " << "血量" << endl;
for (int i = 0; i < N; i++) {
if (hero[i].times == 0) hero[i].times += 10;
cout <<" "<< i+1 << ":"<<hero[i].name << "," << hero[i].times << "," <<hero[i].blood << endl;
}
关键部分需要
以上是进行初始化以及英雄的创建
现在开始玩游戏以及正片。
首先定义招法:石头剪刀布,参照所学知识以及翻阅相应资料得:
const int N = 20;//这里由于有20个英雄所以就这么定义无法修改。以免混淆
enum Choice{Rocks,Scissors,Papers};
enum Result{You,Me,Tie};
游戏主算法:
void Hero::PlayGames() {
Hero *h;
h = hero;
//int x, y, z;
Choice machine, index;
Result winner = You;
int count1 = 0, count2 = 0,count3 = 0;
int count = 0;
int b[5];
int x = 0;
int c;
cout << "Please input the number of players to start 3 or 5" << endl;
cin >> c;
cout << "please make your choice except for machine that has chosen form hero" << endl;
for (int j = 0; j < c; j++)
cin >> b[j];
for (int j = 0; j < c; j++)
cout << h[b[j]-1].name << ","<<h[b[j]-1].times << ","<<h[b[j]-1].blood << endl;
int i;//上述部分是建立游戏的开始
switch (c) {
case 3:
cout << "Please input n for the first player." << endl;
cin >> i;
system("cls");
switch (i) {
case 1:
cout << h[b[0] - 1].name << "," << h[b[0] - 1].times << "," << h[b[0] - 1].blood << endl;
break;
case 2:
cout << h[b[1] - 1].name << "," << h[b[1] - 1].times << "," << h[b[1] - 1].blood << endl;
break;
case 3:
cout << h[b[2] - 1].name << "," << h[b[2] - 1].times << "," << h[b[2] - 1].blood << endl;
break;
}
break;
case 5:
cout << "Please input n for the first player." << endl;
cin >> i;
system("cls");
switch (i) {
case 1:
cout << h[b[0] - 1].name << "," << h[b[0] - 1].times << "," << h[b[0] - 1].blood << endl;
break;
case 2:
cout << h[b[1] - 1].name << "," << h[b[1] - 1].times << "," << h[b[1] - 1].blood << endl;
break;
case 3:
cout << h[b[2] - 1].name << "," << h[b[2] - 1].times << "," << h[b[2] - 1].blood << endl;
break;
case 4:
cout << h[b[3] - 1].name << "," << h[b[3] - 1].times << "," << h[b[3] - 1].blood << endl;
break;
case 5:
cout << h[b[4] - 1].name << "," << h[b[4] - 1].times << "," << h[b[4] - 1].blood << endl;
break;
}
break;
}//选择三人模式还是五人模式
system("pause");
cout << "Start now" << endl;//以下是正片
while (true) {
string str;
char ch;
char winner='M';
cout << h[b[i - 1]-1].name << "," << h[b[i - 1]-1].times << "," << h[b[i - 1]-1].blood << endl;
cout << "Press R/P/S to VS.(R for Rocks,P for Paper and S for Scissors)" << endl;
cin >> ch;//人工操作
switch (ch) {
case 'R':
case 'r':
index = Rocks;
break;
case 'P':
case 'p':
index = Papers;
break;
case 'S':
case 's':
index = Scissors;
break;
default:
continue;
}
int n = rand() % 3;
switch (n)//机器输入
{
case 0:machine = Scissors; str = "Scissors";
break;
case 1:machine = Papers; str = "Papers";
break;
case 2:
machine = Rocks; str = "Rocks";
break;
}
cout << str << endl;
if (index == Scissors && machine == Rocks || index == Rocks && machine == Papers || index == Papers && machine == Scissors)//判断胜负的算法
winner = You;
else if (index == Scissors && machine == Papers || index == Papers && machine == Rocks || index == Rocks && machine == Scissors)
winner = Me;
else if (index == machine)
winner = Tie;
switch (winner) {
case Me:cout << "You Win!" << endl << endl; count1++; break;
case You:cout << "You Lose!" << endl << endl; count2++; break;
case Tie:cout << "It is a tie!" << endl << endl; count3++; break;
}
h[b[i-1]-1].times--;
if (h[b[i-1]-1].times == 0 ) {
for (int j = 0; j < c; j++) {
if (h[b[j]-1].times == 0)
cout << (j + 1) << "," << h[b[j]-1].name << "OUT!" << endl;
}
cout << "You have just used all your chances for your current hero! make your choice.\a" << endl;
cin >> i;
count++;
if (i != 1 && i != 2 && i != 3 && h[b[i-1]-1].times==0) continue;//以防重复选取
}
if (count==c) break;
x++;
if( x % 7 == 0 )//由于会有太多,所以清个屏
system("cls");
}
int total = Score(count1, count2, count3);
cout << "You have just won " << total << " points" << endl;//判断得分
if (isWin(count1, count2))//判断胜负
cout << "You Win!" << endl;
else
cout << "You Lose!" << endl;
}
其他函数辅助
1.开始函数(进行开始界面)
void Hero::Start() {
cout << "Press numbers to choose menu." << endl;
cout << "1.Start game" << endl;
cout << "2.Record" << endl;
cout << "3.Rules" << endl;
Hero hero;
int a;
cin >> a;
switch (a) {
case 1:
system("cls");
hero.Game();
break;
case 2:
break;
case 3:
system("cls");
hero.Rules();
break;
}
}
就是怎么来让已经使用的英雄招法次数恢复默认有点问题,我只能使用加回去方法,恳请诸位大佬进行指点江山。
2.进行相应函数创建
void Hero::Rules() {
cout << "It is like RPS games." << endl;
cout << "R is for Rocks." << endl;
cout << "P is for Paper." << endl;
cout << "S is for Scissors" << endl;
cout << "According to the rules for RPS to judge win or lose to calculate marks." << endl;
}
bool Hero::isWin(int a, int b) {//判断你输了还是你赢了
return a > b;
}
bool Hero::isEnd(int a) {//当最后一名玩家招法用完时候游戏结束,即次数够了就结束了
return a == 0;
}
void Hero::Game() {//游戏创建
this->CreateHero();
this->PlayGames();
}
int Hero::Score(int a, int b,int c) {//分数计算方法
int sum=0;
sum = a * 5 - b * 3 + c * 2;
return sum;
}
主函数
主函数由于不要太长就这样了
int main()
{
char ch='x';
char b;
while (true) {
cout << "\t\t\t\tRPS for 王者农药 1.0.9 version" << endl;
cout << "\t\t\t\t-------Author YYH" << endl;
cout << "\t\t\t\tPress random button for start" << endl;
_getch();//按任意键进行开始
while (ch == 'x') {
Hero hero;//建立一个hero对象
system("cls");
hero.Start();//游戏进行
cout << "Continue?(Y for yes N for no)" << endl;//游戏结束
cin >> b;
if (b == 'n' || b == 'N')
break;
}
cout << "Press E for exit game." << endl;
char a;
cin >> a;
if (a == 'E' || a == 'e')
exit(0);//程序退出
else continue;
}
return 0;
}
这是我第一次上传博客,基于程序设计实践进行的操作,是我学习C++一个月以来进行的,里面仍有不完善的地方,恳请诸位大佬指点江山,非常感谢各位大佬进行指点,如果有意见,恳请留言或发送邮箱至2455219437@qq.com