Self-Taught Developer Journal, Day 33: TOP Project, Rock Paper Scissors cont.
Tags: webdev, beginners, codenewbie, devjournal
Published: 2022-01-07 04:31:10

Today....

## Plan cont.
For the game, Rock Paper Scissors, the rules are:

* Rock beats Scissors
* Scissors beats Paper
* Paper beats Rock

If the user and computer pick the same option then it would result in a tie.

If the user and computer get a tie for each of the 5 rounds then no one wins and they can play again.

## Pseudocode 
When the user inputs rock, paper, or scissors 
Call the computerPlay function to get the computer's selection
Compare the user's selection and computer selection 
If the user wins then add number to player wins
If the computer wins then add number to computer wins
Continue playing for five rounds
After five rounds, compare the player wins to the computer wins to determine winner or loser

## Divide and Conquer (Implement)
Starting with **computerPlay()**, the function will randomly return Rock, Paper, or Scissors. To do this, I Googled to see if there was a random function in JavaScript to use. I found **Math.random()** which will return at number between 0 (inclusive) to 1 (exclusive). **Math.floor()** and arithmetic can be used to change the numbers returned. 
    
    // return number between 0 - 2 inclusive
    Math.floor(Math.random() * 3);

I could have Rock, Paper, and Scissors represent a certain number so I can use the **Math.random()** function, but have **computerPlay()** return Rock, Paper, or Scissors. I will try this implementation for now and test it.

![computerPlay()](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yghg7igsgnrefoegisbs.png)

I decided to try using the ternary operator since the conditional statements were simple. I went with generating a random number between 0 - 2 inclusive with 0 = Rock, 1 = Paper, 2 (or else) = Scissors. I also decided to use the variable declaration **let** instead of **const** since the values would be changing. I logged the results in the console to check and it worked as expected. 

![Test results](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b1765zar6v8u84aqpmr0.png)

Next, I started to write a function that will play a single round of Rock Paper Scissors taking two parameters, **playerSelection** and **computerSelection**, and return a winner or loser.

![gameRound() function example](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bzz3gh2hxu1m61hvyy2d.png)

Lastly, I will write the function **game()**. The function will loop and play five rounds of Rock, Paper, and Scissors. At the end of the five rounds, the function will return the winner or loser.

As I was implementing game, I realized my **gameRound()** function wouldn't work and changed it to return who won for the game instead of a statement to log.

![gameRound() edited](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fblxlh2fp9rnh40723n7.png)
 
For the **game()** function, I added the variables, playerWins and computerWins, to track the result of **gameRound()** for every iteration of the loop. If the result was a tie then the score or wins are not updated. I also included an array of the correct game inputs and a while loop to re-prompt the user if their input isn't valid. At the end of the five rounds, the player and computer wins are compared to return a winner or loser.

![game() example](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yysles6las9qx1ftu03d.png)

![Game result example](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dypy9sxkprdudsrddulh.png) 

## Resources
[The Odin Project](https://www.theodinproject.com/paths/foundations/courses/foundations)
https://www.w3schools.com/js/js_random.asp
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator