为什么打印此字符值会产生一个数字?

时间:2012-04-07 20:26:19

标签: c++ loops random

#include <ctime>
#include <cstdlib>
#include <iostream>
using namespace std;


int main()
{
  // initialize the computer's random number generator
  srand(time(0)); rand();

  // declare variables
  char c1;
  char c2;
  char c3;

  c1 = 'R';
  c2 = 'P';
  c3 = 'S';

  // start loop
  while (true)
  {

    // determine computer's choice
    int result = rand() % 3; // 0 or 1 or 2

    if (result == 0) 
      result = c1;

    if (result == 1) 
      result = c2;

    if (result == 2) 
      result = c3;

    // prompt for, and read, the human's choice

    char humanChoice;
    cout << "Rock, Paper, or Scissors? [R/P/S or Q] ";
    cin >> humanChoice;
    cin.ignore(1000, 10);

    // if human wants to quit, break out of loop
    if (humanChoice == 'Q') break;


    // print results
    cout << result << endl;
    cout << humanChoice << endl;

  // end loop
  }

  // end program 



  return 0;
}

什么人?我正在进行我的中期项目的第一步,即创建一个摇滚剪刀游戏。这只是一个开始,我还远未完成,但我已经遇到了错误。当我编译并运行它时,我得到的是计算选择了数字83,当它必须是r p或s时。有没有人看到我在哪里出错?

5 个答案:

答案 0 :(得分:2)

结果的类型为 int (因此它被cout解释为十进制数),您的意思是它的类型为 char (因此它被解释为文本字符)。

此外,您已“超载”结果,首先保留rand() % 3的值,然后再加上字符值。通常,为了便于阅读,最好将变量分开 - 优化器可以计算出为它们重用相同的存储空间来节省堆栈空间。

试试这个:

char result;

switch (rand() % 3)
{
case 0: result = c1; break;
case 1: result = c2; break;
case 2: result = c3; break;
}

答案 1 :(得分:0)

resultint,它将存储(并打印)您指定给它的角色的数字表示。

有多种方法可以解决此问题,一种方法是将result更改为char。您仍然可以在其中存储数字(限制为0-255)并且输出正确。

更好的方式,imho,将是一个轻微的重构,首先获得人类输入,然后根据计算机选择(最好使用switch)。

答案 2 :(得分:0)

83指的是's'的unicode值。由于result是一个int,当你将char''分配给result时,它会被转换为int。因此,它输出83。

尝试使用不同的变量进行输出。例如:

char response;
if(result==0)
    response = c1;
...
cout << response << end1

答案 3 :(得分:0)

您正在使用的输入是char类型。将其转换为整数将为您提供相关char的ASCII值。 P的ascii值为80,R为82,S为83。

最好使用带有switch-case语句的枚举:

enum Choices { ROCK, PAPER, SCISSORS };

答案 4 :(得分:0)

cout&lt;&lt;事情超载了。 int和char的行为不同。如果它是一个int,无论变量的类型是什么,那么输出将是一个数字,如果它是一个char(字符)(我们不关心大小,但我们关心类型)那么输出将是一个人物。因此,为了解决这个问题,结果变量类型必须是前面提到的char。