Part 4: Game Controller
Putting it all togetherβ
The Resources folder structure should look something like this:
resources
βββ images
β βββ .gitkeep
βββ scripts
β βββ rock_paper_scissors.js
++β βββ index.js
βββ styles
βββ styles.css
The marked file is the file you'll be using in the part of the assignment.
In this final piece of the assignment, we will need to:
- get a handle of all elements of interest.
- then We will add event listeners to the buttons
- We will call on our RockPaperScissors class methods as needed.
- create constants
constof element handlers to the following elements
- welcomeScreen for
#welcome-screen - gameScreen for
#game-screen - startGameButton for
#start-game-button - userName for
#username - userSelection for
#user-selection - goButton for
#go-button - scoreParagraph for
#score - gameHistoryParagraph for
#game-history
Example
const welcomeScreen = document.getElementById(`welcome-screen`);
OR, using the querySelector
const gameScreen = document.querySelector(`#game-screen`);
- programmatically, hide the
gameScreenusing Bootstrap's classd-none
gameScreen.classList.add("d-none")
-
add an Event Listener to the
start-game-buttonon the click event. The event handler should:- get username from the text input to be used in the next step.
- instantiate the game object from the
RockPaperScissorsclass.game = new RockPaperScissors(username);- Note: The top of the file already has a declared(but not initialized) variable
game. I'm assigning the value of the new class object to this variable, instead of declaring it in the eventHandler. Remember variables are scoped in JS, if the variable is declared inside the event handler scope, it will only be accessible from there.
- Note: The top of the file already has a declared(but not initialized) variable
- hide the welcomeScreen and display the gameScreen Instead.
- π¦tip: you'll be adding and removing the
d-noneclass. - π¦tip: You may need to do
e.preventDefault()to prevent the form from submitting, and the page from reloading.
- π¦tip: you'll be adding and removing the
-
Create a function named
function updateScoreTallyUI(){...}- Modify the
#scoreparagraph. It should look something like this<USERNAME>: <USER_SCORE> v CPU: <CPU_SCORE>- i.e. if
usernameis Yahya and theuserScoreis 3 and thecpuScoreis 5, it would change the scoreParagraph toYahya: 3 v CPU: 5you can get theusername, andscoreobject from the game object.game.username,game.score
- i.e. if
- In the
start-game-buttonevent listener, invoke this function to update the#scoreparagraph so it displays the user's name instead of the GenericUser
- Modify the
-
Create a function named
function updateGameHistoryUI(){...}- it makes use of the class property
gameHistoryLog. - it clears the current game history paragraph
- and replaces it with the content of the array.
- it makes use of the class property
-
add an Event Listener to the
go-buttonon the click event.- get the userSelection from the select
- call the
play(userSelection)of thegameobject. - update the text of
scoreParagraphusing theupdateScoreTallyUI()function - update the
gameHistoryParagraphusing theupdateGameHistoryUI()function
Testingβ
- to test that you satisfied the controller requirements, run the tests with
npm run test:controller. This will run the E2E tests for the controller component only of this assignment. - You can also run the entire suite of E2E tests using
npm run test:e2e. At this point all tests should pass