Program for a game similar to rock-paper-scissors

  • Thread starter Thread starter sandy.bridge
  • Start date Start date
  • Tags Tags
    Game Program
AI Thread Summary
The discussion revolves around programming a game called proton-neutron-electron (P, N, E), similar to rock-paper-scissors, where player 2 wins in the event of a tie. The initial code presented had syntax errors, particularly using the assignment operator '=' instead of the equality operator '==' in conditional statements, leading to incorrect game outcomes. After corrections, a simplified version of the code successfully determined the winner based on player inputs. Participants noted inconsistencies in the game's rules, particularly regarding ties and the relationships between the moves, prompting suggestions for clearer logic. Ultimately, the focus remained on ensuring the code accurately reflected the game's rules as provided in the assignment.
sandy.bridge
Messages
797
Reaction score
1

Homework Statement


I'm writing a program for a game similar to rock-paper-scissors. It is called proton-neutron-electron (P, N, E). There are two players. In the event of a tie, player 2 wins
P1 denotes player 1, P2 denotes player 2, P = proton, N = neutron, E = electron. P1P means player 1 picks proton.
There are 9 possibilities. Here they are:
P1P + P2P = P2 wins
P1P + P2N = P1 wins
P1P + P2E = P1 wins
P1N + P2P = P2 wins
P1N + P2N = P2 wins
P1N + P2E = P2 wins
P1E + P2P = P1 wins
P1E + P2N = P2 wins
P1E + P2E = P2 wins

The Attempt at a Solution


Here is what I have written in the compiler; it does not work. I am not looking for another solution, I would just like to know where I went wrong in my syntax.
PHP:
	char user1, user2;
	bool A, B, C, D, E, F;
	cout << "Player 1, please enter your move: ";
		cin >> user1;
		cout << "Player 2, please enter your move: ";
		cin >> user2;

	if (user2 = 'P')
	{
		A = true;
	}
	else
	{
		A = false;
	}

	if (user2 = 'N')
	{
		B = true;
	}
	else
	{
		B = false;
	}
	if (user2 = 'E')
	{
		C = true;
	}
	else
	{
		C = false;
	}

	if (user1 = 'P')
	{
		D = true;
		}
	else
	{
		D = false;
	}

	if (user1 = 'N')
	{
		E = true;
	}
	else
	{
		E = false;
	}
	if (user1 = 'E')
	{
		F = true;
	}
	else
	{
		F = false;
	}	if ((B&&D)||(C&&D)||(A&&E)||(B&&F))
		{
			cout << "The winner is player 1!";
		}
	else
		{
			cout << "The winner is player 2!";
		}

	return 0;
The way that it is set up now always results in P1 winning and I can't see why. Thanks in advance!
 
Last edited:
Physics news on Phys.org


You could start by replacing all = with == and see what happens?
 


That didn't work.
 


I managed to just do as such:
PHP:
#include <iostream>
using namespace std;

int main() {
	char user1, user2;
			cout << "What move P1? ";
			cin >> user1;
			cout << "What move P2? ";
			cin >> user2;

			if (((user1 == 'P')&&(user2 == 'N'))||((user1 == 'P')&&(user2 == 'E'))||((user1 == 'N')&&(user2 == 'P'))||((user1 == 'E')&&(user2 == 'N')))
				{
					cout << "Player 1 is the winner!";
				}
			else
				{
					cout << "Player 2 is the winner!";
				}


			return 0;
}

I'd still like to know what I was doing wrong for the first part.
 


Can you post the changed code that you tried but didn't work?
 


PHP:
    char user1, user2;
    bool A, B, C, D, E, F;
    cout << "Player 1, please enter your move: ";
        cin >> user1;
        cout << "Player 2, please enter your move: ";
        cin >> user2;

    if (user2 == 'P')
    {
        A == true;
    }
    else
    {
        A == false;
    }

    if (user2 == 'N')
    {
        B == true;
    }
    else
    {
        B == false;
    }
    if (user2 == 'E')
    {
        C == true;
    }
    else
    {
        C == false;
    }

    if (user1 == 'P')
    {
        D == true;
        }
    else
    {
        D == false;
    }

    if (user1 == 'N')
    {
        E == true;
    }
    else
    {
        E == false;
    }
    if (user1 == 'E')
    {
        F == true;
    }
    else
    {
        F == false;
    }    if ((B&&D)||(C&&D)||(A&&E)||(B&&F))
        {
            cout << "The winner is player 1!";
        }
    else
        {
            cout << "The winner is player 2!";
        }

    return 0;
This didn't work ^^^^
PHP:
#include <iostream>
using namespace std;

int main() {
	char user1, user2;
			cout << "What move P1? ";
			cin >> user1;
			cout << "What move P2? ";
			cin >> user2;

			if (((user1 == 'P')&&(user2 == 'N'))||((user1 == 'P')&&(user2 == 'E'))||((user1 == 'N')&&(user2 == 'P'))||((user1 == 'E')&&(user2 == 'N')))
				{
					cout << "Player 1 is the winner!";
				}
			else
				{
					cout << "Player 2 is the winner!";
				}			return 0;
}
This did work ^^^
 


Note: '==' is a logical operator which you use, for example, in an 'if' statement to test if a certain condition is true:

if (user1 == 'P') {'some calculations'}

If you wish to assign a certain value to a variable, then the following statement is used:

{
user1 = 'P';

}
 
Ah yes, that was where my issue was. Works now! Thanks! I will obviously just use the other one though because it is much shorter.
 
sandy.bridge said:

Homework Statement


I'm writing a program for a game similar to rock-paper-scissors. It is called proton-neutron-electron (P, N, E). There are two players. In the event of a tie, player 2 wins
P1 denotes player 1, P2 denotes player 2, P = proton, N = neutron, E = electron. P1P means player 1 picks proton.
There are 9 possibilities. Here they are:
1. P1P + P2P = P2 wins
2. P1P + P2N = P1 wins
3. P1P + P2E = P1 wins
4. P1N + P2P = P2 wins
5. P1N + P2N = P1 wins << P2 should be the winner here[/color]
6. P1N + P2E = P2 wins
7. P1E + P2P = P1 wins
8. P1E + P2N = P2 wins
9. P1E + P2E = P2 wins
I added numbers to the rules for easier identification.

Your rule 5 violates what you said earlier about ties going to player 2.
Can you summarize the rules any better than in the table?

It looks like proton beats neutron (rules 2, 4) and electron beats neutron (rule 6) sometimes, but neutron beats electron sometimes (rule 8). Is that also a mistake?

In rock paper scissors, there is a simple set of rules: rock covers (beats) paper, scissors cut (beat) paper, and paper covers (beats) rock. Is there a similar, simple rule here that you didn't mention? If so, it would make your logic much simpler.
 
  • #10
Yeah, I noticed that as well. There doesn't seem to be any logicality with it, but that is how the table was given in the assignment. At that point I just made sure the algorithm obeyed the table.

PHP:
	         P1 plays P  	P1 plays N	         P1 plays E
P2 plays P	     P2	             P1	              P2
P2 plays N	     P1	             P2	              P1
P2 plays E	     P1	             P2	              P2
 
  • #11


I redid the indentation in your code so that the lines didn't scroll so far to the right.
sandy.bridge said:
Code:
#include <iostream>
using namespace std;

int main() 
{
  char user1, user2;
  cout << "What move P1? ";
  cin >> user1;
  cout << "What move P2? ";
  cin >> user2;

  if (((user1 == 'P')&&(user2 == 'N')) || 
      ((user1 == 'P')&&(user2 == 'E')) || 
      ((user1 == 'N')&&(user2 == 'P')) || 
      ((user1 == 'E')&&(user2 == 'N')) )
  {
    cout << "Player 1 is the winner!";
  }
  else
  {
    cout << "Player 2 is the winner!";
  }

  return 0;
}
This did work ^^^
 
  • #12
sandy.bridge said:
Yeah, I noticed that as well.
Then you have an error in post 1. According to the table below, if both players play a neutron, P2 wins.

sandy.bridge said:
There doesn't seem to be any logicality with it, but that is how the table was given in the assignment. At that point I just made sure the algorithm obeyed the table.

PHP:
	         P1 plays P  	P1 plays N	         P1 plays E
P2 plays P	     P2	             P1	              P2
P2 plays N	     P1	             P2	              P1
P2 plays E	     P1	             P2	              P2
 
  • #13
Oops! I just edited that thanks.
 
  • #14
Instead of one if block with a large condition, I would write three if blocks in which I check what player 1 has. I have implemented the first of these if blocks, and have added comments to suggest what the logic is.

Code:
if (user1 == 'P')
{
  if (user2 == 'P')
  {
    cout << "Player 2 is the winner!";
  }
  else
  {
    cout << "Player 1 is the winner!";
  }
}
else if (user1 == 'N')
{
  // Player 2 wins only if player 1 has 'P'
}
else // user1 == 'E'
{
  // Player 1 wins only if player 2 has 'N'
}
 
Back
Top