石头剪刀布

#pragma once
#pragma once
#include <string>
using namespace std;

class gamers
{
public:
    gamers();
    gamers(char c);
    ~gamers();
    bool operator == (const gamers& g)
    {
        return type == g.type;
    }
    string name;
    int type;//出拳类型
};

gamers::gamers()
{

}

gamers::gamers(char c)
{
    name = c;
    type = -1;
}
gamers::~gamers()
{
}

.h

// game3.cpp : 定义控制台应用程序的入口点。
//

#include <iostream>
#include <vector>
#include<string>
#include<time.h>
#include"gamers.h"
using namespace std;

string decode(int type)
{/*
 分别用0,1,2来代表石头、剪刀、布。
 该函数用来输出时候解码
 */
    switch (type)
    {
    case 0:
        return "石头";
        break;
    case 1:
        return "剪刀";
        break;
    case 2:
        return "布";
        break;
    default:
        cout << "输入有误" << endl;
        break;
    }

}
int whichIsZero(int a, int b, int c)
{/*每一轮结束之后,统计出拳的种类过程中缺少的那一种
 */
    if (a == 0)
        return 0;
    else if (b == 0)
        return 1;
    else if (c == 0)
        return 2;
    else
        cout << "统计有误" << endl;
}

void game(vector<gamers>& LeftPeople, int NumOfPerson)
{
    srand((int)time(NULL));
    for (int i = 0; i != NumOfPerson; i++)
    {//得到上一轮获胜者出拳类型
        int temp = rand() % 3;
        LeftPeople[i].type = temp;
        cout << "选手" << LeftPeople[i].name << "出:" << decode(temp) << endl;
    }
    int arr[3] = { 0,0,0 };
    for (int i = 0; i < (int)LeftPeople.size(); i++)
    {
        arr[LeftPeople[i].type]++;
    }
    int NumOfRock = arr[0];
    int NumOfScissors = arr[1];
    int NumOfPaper = arr[2];

    int NumOfType = 0;
    if (NumOfRock != 0)NumOfType++;
    if (NumOfScissors != 0)NumOfType++;
    if (NumOfPaper != 0)NumOfType++;

    vector<gamers> next_round_people;
    if (NumOfType == 2)
    {
        int zero = whichIsZero(NumOfRock, NumOfScissors, NumOfPaper);
        switch (zero)
        {
        case 0:
            next_round_people.clear();
            for (int i = 0; i < NumOfPerson; i++)
            {
                if (LeftPeople[i].type == 1)
                    next_round_people.push_back(LeftPeople[i]);
            }
            NumOfPerson -= NumOfPaper;
            if (NumOfPerson == 1)
            {//此处处理特殊情况:“剪刀,布,布”时,NumOfPerson变为1,输赢可定,不用调用game(1);下同
                cout << "最后获胜者" << LeftPeople[0].name << "出:剪刀" << endl;
                return;
            }
            else
            {
                cout << "这一轮没有石头,剪刀的获胜,由" << NumOfPerson << "个胜利者接着进行游戏......" << endl;
                game(next_round_people, NumOfPerson);
            }
            break;
        case 1:
            next_round_people.clear();
            for (int i = 0; i < NumOfPerson; i++)
            {
                if (LeftPeople[i].type == 2)
                    next_round_people.push_back(LeftPeople[i]);
            }
            NumOfPerson -= NumOfRock;
            if (NumOfPerson == 1)
            {
                cout << "最后获胜者" << next_round_people[0].name << "出:布" << endl;
                return;
            }
            else
            {
                cout << "这一轮没有剪刀,布的获胜,由" << NumOfPerson << "个胜利者接着进行游戏......" << endl;
                game(next_round_people, NumOfPerson);
            }
            break;
        case 2:
            next_round_people.clear();
            for (int i = 0; i < NumOfPerson; i++)
            {
                if (LeftPeople[i].type == 0)
                    next_round_people.push_back(LeftPeople[i]);
            }

            NumOfPerson -= NumOfScissors;
            if (NumOfPerson == 1)
            {
                cout << "最后获胜者" << next_round_people[0].name << "出:石头" << endl;
                return;
            }
            else
            {
                cout << "这一轮没有布,石头的获胜,由" << NumOfPerson << "个胜利者接着进行游戏......" << endl;
                game(next_round_people, NumOfPerson);
            }
            break;
        default:
            break;
        }
    }
    else
    {
        cout << "这一轮没有获胜方,继续下一轮......" << endl;
        game(LeftPeople, NumOfPerson);
    }
}

int main()
{
    /*
    0 石头
    1 剪刀
    2 布

    思路:
    递归实现,每次出拳种类为2的时候判定输赢,由赢的人参加下一轮比赛,
    直到确定最后一人的输赢。出拳种类为3或者为1的时候继续下一轮比赛;

    每次根据上一轮获胜人数产生0到2的随机数(分别代表石头,剪刀,布),
    保存到vector中,利用大小为3的数组arr来统计每轮出拳情况。
    */

    int NumOfPerson = 5;
    if (NumOfPerson == 1)
    {
        cout << "游戏需要1个以上的参与者!" << endl;
        return 0;
    }
    vector<gamers> LeftPeople;
    for (int i = 0; i < NumOfPerson; i++)
    {
        LeftPeople.push_back(gamers(‘A‘ + i));
    }
    game(LeftPeople, NumOfPerson);
    system("pause");
    return 0;
}

.cpp

时间: 2024-12-28 21:22:10

石头剪刀布的相关文章

NOIP 2014 D1T1 -生活大爆炸版石头剪刀布

生活大爆炸版石头剪刀布 (rps.cpp/c/pas) [问题描述] 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8集中出现了一种石头剪刀布的升级版游戏.升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势: 斯波克:<星际迷航>主角之一. 蜥蜴人:<星际迷航>中的反面角色. 这五种手势的胜负关系如表一所示,表中列出的是甲对乙的游戏结果. 表一  石头剪刀布升级版胜负关系 乙 甲对乙的 甲  

团队-游戏石头剪刀布-需求分析

1    引言 1.1   编写目的 童年时期没有网络游戏,没有游戏机,只有一些随时随地都能玩的一些小游戏,例如<石头,剪刀,布>,制作这款游戏只为了怀念逝去的童年 1.2   背景 小的时候没有什么高大上的电子游戏,平时只会和小伙伴一起玩一些类似石头剪刀布的小游戏,为了向我们已逝去的童年致敬,我们做了这款游戏 本项目的名称:小游戏<石头,剪刀,布> 本项目的提出者:王聪,李宇鸿 本项目的开发者:王聪,李宇鸿,余兴财,王佳傲,魏来,李佳旭 1.3   参考资料 <第一行代码A

生活大爆炸版石头剪刀布

题目描述 Description 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8集中出现了一种石头剪刀布的升级版游戏.升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势: 斯波克:<星际迷航>主角之一. 蜥蜴人:<星际迷航>中的反面角色. 这五种手势的胜负关系如表一所示,表中列出的是甲对乙的游戏结果. 现在,小A和小B尝试玩这种升级版的猜拳游戏.已知他们的出拳都是有周期性规律的,但周期长度不

Noip 2014 senior 复赛 生活大爆炸版石头剪刀布(rps)

[问题描述] 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一 样,则不分胜负.在<生活大爆炸>第二季第 8 集中出现了一种石头剪刀布的升级版游戏. 升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势: 斯波克:<星际迷航>主角之一. 蜥蜴人:<星际迷航>中的反面角色. 这五种手势的胜负关系如表一所示, 表中列出的是甲对乙的游戏结果. 表一 石头剪刀布升级版胜负关系 剪刀 石头 布 蜥蜴人 斯波克 剪刀 平 输 赢 赢 输 石头  

NOI 08 石头剪刀布

石头剪刀布(NOI 08) 总时间限制: 1000ms 内存限制: 65536kB 描述 石头剪刀布是常见的猜拳游戏.石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负. 一天,小A和小B正好在玩石头剪刀布.已知他们的出拳都是有周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期不断循环的.请问,小A和小B比了N轮之后,谁赢的轮数多? 输入 输入包含三行. 第一行包含三个整数:N,NA,NB,分别表示比了N轮,小A出拳的周期长度

洛谷1328 生活大爆炸版石头剪刀布

题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的升级版游戏.升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势: 斯波克:<星际迷航>主角之一. 蜥蜴人:<星际迷航>中的反面角色. 这五种手势的胜负关系如表一所示,表中列出的是甲对乙的游戏结果. 现在,小A 和小B 尝试玩这种升级版的猜拳游戏.已知他们的出拳都是有周期性规律的,但周期长度不一定相等.例如:如

随机数之石头剪刀布游戏

此问题源于Ptyhon核心编程上的一道题: Random Numbers. Design a "rock, paper, scissors" game,sometimes called "Rochambeau," a game you may have played as a kid. Here are the rules. At the same time, using specified hand motions, both you and your oppon

NOIp 2014 #1 生活大爆炸版石头剪刀布 Label:模拟

题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的升级版游戏. 升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势: 斯波克:<星际迷航>主角之一. 蜥蜴人:<星际迷航>中的反面角色. 这五种手势的胜负关系如表一所示,表中列出的是甲对乙的游戏结果. 现在,小A 和小B 尝试玩这种升级版的猜拳游戏.已知他们的出拳都是有周期性规律的,但周期长度不一定相等.例如:

洛谷P1328 生活大爆炸版石头剪刀布——S.B.S.

题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的升级版游戏. 升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势: 斯波克:<星际迷航>主角之一. 蜥蜴人:<星际迷航>中的反面角色. 这五种手势的胜负关系如表一所示,表中列出的是甲对乙的游戏结果. 现在,小A 和小B 尝试玩这种升级版的猜拳游戏.已知他们的出拳都是有周期性规律的,但周期长度不一定相等.例如:

C# Winform学习--- 实现石头剪刀布的游戏

本文使用winform实现简单的石头剪刀布的游戏,主要实现,电脑随机出拳,玩家手动点击出拳:实现简易背景图片3秒切换:简易统计信息. 1.效果图 2.实现代码 新建一个windows窗体程序,用数字1代表石头,用数字2代表剪刀,用数字3代表布,结果取玩家和电脑出拳之差,有三种结果 玩家赢: -1,2 平手: 0 玩家输: 其它值 新建3个类: 1)Computer.cs 电脑随机出拳 using System; using System.Collections.Generic; using Sy