- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作剪刀石头布游戏。包含3个类如下:
人类类:-用户分别输入他想玩的游戏数量和选择
计算机类:- 玩与人类相同数量的游戏,但总是玩“ROCK”。
RandomComputer 类:- 计算机类的派生类,但播放随机移动或选择。
当我将任何 2 个对象(人和计算机)传递给 Refree 类时,它会通过比较两个玩家的每个 Action 来做出决定。Refree Decision 方法在 (Human, Computer) 通过时非常有效,但在通过 (Human,RandomComputer) 时出现意外的奇怪输出。示例:- 用户输入:3 R P S
Refree(Human A, Computer B) 时的输出:Tie Win Lose
Refree(Human A, RandomComputer C) 时的输出:输 ' ' 赢
#ifndef _HUMAN_H
#define _HUMAN_H
#include <string>
#include <iostream>
using namespace std;
class Human{
public:
Human();
Human(int number, string game);
public:
int h_number;
string h_game;
};
#endif //_HUM
//=========HUMAN.CPP=====
#include "human.h"
Human::Human(int number, string game){
h_number = number;
h_game = game;
}
//========COMPUTER.h=====
#ifndef _COMPUTER_H
#define _COMPUTER_H
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Computer{
public:
Computer();
Computer(int number);
int get_c_number();
public:
string c_game;
int c_number;
};
#endif //_COMPUTER_H
//========COMPUTER.CPP=====
#include "computer.h"
Computer::Computer(){
}
Computer::Computer(int number){
c_number = number;
for(int i=0; i<c_number; i++)
{
c_game.push_back('R');
}
}
int Computer::get_c_number()
{
return c_number;
}
//=============RANDOMCOMPUTER.H========
#ifndef _RANDOMCOMPUTER_H
#define _RANDOMCOMPUTER_H
#include "computer.h"
#include <string>
#include <iostream>
#include <time.h>
#include <ctime>
#include <stdlib.h>
using namespace std;
class RandomComputer:public Computer{
public:
RandomComputer();
RandomComputer(int number);
private:
static const char r_games[3];
};
#endif //_RANDOMCOMPUTER_H
//===============RANDOMCOMPUTER.CPP=========
#include "randomcomputer.h"
const char RandomComputer::r_games[3]= {'R','P','S'};
RandomComputer::RandomComputer(){}
RandomComputer::RandomComputer(int number){
c_number = number;
srand ( time(NULL) );
for(int i=0; i<c_number; i++)
{
int RandIndex = rand() % 3;
c_game.push_back(r_games[RandIndex]);
}
}
//==============REFREE.H======
#ifndef _REFREE_H
#define _REFREE_H
#include "computer.h"
#include <iostream>
#include <string>
#include "human.h"
#include "randomcomputer.h"
using namespace std;
class Refree{
public:
Refree();
Refree (Human h_temp, Computer c_temp);
void decision();
Human *x;
Computer *y;
private:
int r_number;
string output;
};
#endif //_REFREE_H
//============REFREE.CPP========
#include "refree.h"
#include <iostream>
#include <string>
Refree::Refree(){}
Refree::Refree (Human h_temp, Computer c_temp){
x = &h_temp;
y = &c_temp;
r_number = x->h_number;
cout<<"HUMAN CHOICES: "<<x->h_game<<" COMPUTER CHOICES: "<<y->c_game<<endl;
}
void Refree::decision(){
for(int i =0; i<r_number; i++){
cout<<x->h_game[i]<<"-----------------------"<<y->c_game[i]<<endl;
}
for(int j =0; j<r_number; j++)
{
cout<<x->h_game[j]<<"---COMPARING WITH---"<<y->c_game[j]<<endl;
if(x->h_game[j] == 'R')
{
if(y->c_game[j] == 'P')
{
output.push_back('L');
output.push_back(' ');
}
else if(y->c_game[j]=='S')
{
output.push_back('W');
output.push_back(' ');
}
else if(y->c_game[j]=='R')
{
output.push_back('T');
output.push_back(' ');
}
}
else if(x->h_game[j] == 'P')
{
if(y->c_game[j] == 'P')
{
output.push_back('T');
output.push_back(' ');
}
else if(y->c_game[j]=='S')
{
output.push_back('L');
output.push_back(' ');
}
else if(y->c_game[j]=='R')
{
output.push_back('W');
output.push_back(' ');
}
}
else if(x->h_game[j] == 'S')
{
if(y->c_game[j] == 'P')
{
output.push_back('W');
output.push_back(' ');
}
else if(y->c_game[j]=='S')
{
output.push_back('T');
output.push_back(' ');
}
else if(y->c_game[j]=='R')
{
output.push_back('L');
output.push_back(' ');
}
}
}//forrr looop
size_t endpos = output.find_last_not_of(" \t");
if( string::npos != endpos )
{
output = output.substr( 0, endpos+1 );
}
cout<<output<<endl;
output.clear();
}
//============================MAIN.CPP====================
#include <iostream>
#include <sstream>
#include <stdlib.h>
#include <string>
#include <algorithm>
#include "human.h"
#include "computer.h"
#include "refree.h"
#include "randomcomputer.h"
using namespace std;
int main()
{
string user_input;
getline(cin, user_input);
//converting the numbers in the string to int.
int number_of_games = atoi(user_input.c_str());
//remove the digits and the spaces
user_input.erase(remove_if(user_input.begin(), user_input.end(), ::isdigit), user_input.end());
user_input.erase(remove_if(user_input.begin(), user_input.end(), ::isspace), user_input.end());
Human player_1(number_of_games, user_input); //HUMAN PLAYER OBJECT
Computer computer_1(number_of_games); // COMPUTER PLAYER TAKES ONLY innt number because it will always play ROCK in this class
Refree refree_1(player_1, computer_1);
refree_1.decision();
RandomComputer random_computer(number_of_games);
cout<<"HERE IS THE RANDOM CHOICES FROM COMPUTER AI: "<<random_computer.c_game<<endl; // make random choices instead of only ROCKS.
Refree refree_2(player_1, random_computer);
refree_2.decision();
return 0;
}
最佳答案
将人和计算机对象传递给裁判时,您正在复制它们:
Refree::Refree (Human h_temp, Computer c_temp){
您应该在此处使用 const 引用或指针。
关于c++ - 为什么 push_back 在 upcasted 对象的字符串成员中吐出一个 char?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32093111/
我有这个例子: class One { public void testOne(){System.out.println("One!!!");} public void testTwo
我可以看到“upcast”一词与OOP有关,但我通过搜索互联网找不到确切的定义。 谁能解释这个术语是什么意思以及这种技术在什么情况下有用? 最佳答案 根据您发布的标签的描述: Upcasting pe
我定义了一个带有抽象约束的抽象类: abstract class Asset where P : Parm { } abstract class Parm { } class StockParm :
假设B是D的基类(可能是虚的,可能是多重继承,不一定是直接基类)。 设 obj 是 D 类型的对象(不是 D 的子类——恰好是 D ). 让 D * d = std::addressof(obj);
假设我有一个可以保存基类方法地址的指针类型。我可以将子类方法的地址分配给它并期望它正常工作吗?在我的例子中,我将它与基类指针一起使用,对象的动态类型是派生类。 struct B { typed
抽象类的目的不是让开发人员创建基类的对象然后向上转换它,AFAIK。 现在,即使不需要向上转换,我仍然使用它,它是否在某些方面被证明是“不利”? 更多说明: 来自 C++ 中的思考: Often in
为什么只有在 Main.main() 中取消注释第三条语句时才会出现 ClassCastException ?没有异常(exception),但第一条和第二条语句执行得很好? public class
只是玩类型转换。假设,我们有 2 个类 public class Base { public int a; } public class Inh : Base { public int
我有以下java代码: class A { int someMethod () { return 1; } int someMethod (A a) { return 2; } int some
两个类: public class ClassA implements ClassC { private static final long serialVersionUID = 111111
在 Java 中, "Up-casting is casting to a supertype, while downcasting is casting to a subtype. Supercas
我有 2 个类 Test(Base) 和 Program(child)。现在我在沮丧的时候遇到了一些问题。 Test t = new Program();// upcasting-wo
如果我有一个带有签名(String, Bool) 的元组,我不能将它转换为(String, Any)。编译器说: error: cannot express tuple conversion '(St
C# 工厂模式是否需要向上转型? 我希望类库 G 中的上帝在类库 A 中创建一个亚当,而不是让 G 依赖于 A。上帝产生亚当供类库 E 中的夏娃消费,夏娃知道并依赖亚当是可以的。(编辑 - 这个示例越
class A { } class B extends A { } class Main { public static void main(String[] args) {
假设我有一个现有的聚合 CustomAggregate 和一个由该聚合处理的事件 CustomEvent。 一段时间后,当事件存储已包含此聚合的一些事件时,我需要将聚合和事件重命名为 NewCusto
我正在使用 FunKTiale 库执行模式匹配。然后,当我按如下方式初始化变量时: private lateinit var socket = Option.None 下面的转换是不可能的: sock
我有两个 View ,A 和 B,都继承自 C。 在 Storyboard 中,我将 UIViewController 定义为 C 类型。 另一个 View ,比方说 D,有到 C 的两个 segue
我有一个二维 numpy 数组,我想将特定的 dtype 应用于每一列。 a = np.arange(25).reshape((5,5)) In [40]: a Out[40]: array([[ 0
我一直在阅读该站点上的其他一些主题,他们提到了 dynamic_cast 和 static_cast 是如何安全地进行向上转换的。 为什么向上转换甚至需要这些? 例如,如果类 B 派生自 A,则 A
我是一名优秀的程序员,十分优秀!