1 Session 8.2 Finding Winners Using Arrays
Chapter 8.2: Finding Winners Using Arrays 2 Session Overview Find out how the C# language makes it easy to create an array that contains multiple values of a particular type Learn how to work with individual values stored as part of an array Use arrays to make a program that automatically displays the winning score from the Reaction Timer game Use an array as a look-up table to identify the winning players of the Reaction Timer game
Chapter 8.2: Finding Winners Using Arrays 3 Reaction Timer Winner Display At the moment the players have to decide who won a Reaction Timer game They have to find the lowest button time and then work out which player had that time It would be nice if the game program could do this
Chapter 8.2: Finding Winners Using Arrays 4 Finding the Winning Score A winning score is one which is greater than 0, and less than any other score This means that the player pressed their button before anyone else We can create a condition that will test if a particular score is the winning one The program just has to compare the value with all the ones that it needs to beat
Chapter 8.2: Finding Winners Using Arrays 5 Finding the Winning Score if ( ascore1 > 0 ) if ( ascore1 < bscore1 && ascore1 < xscore1 && ascore1 < yscore1 ) // if we get here button A of Gamepad 1 has won This code tests to see if button A has beaten all the other buttons on gamepad 1 To make the test for all the gamepads would require another 12 tests
Chapter 8.2: Finding Winners Using Arrays 6 The C# Array To solve this problem we need another way of accessing data We need a way that a program can work through a list of score values and find the smallest one that is the winner In computer language terms we need to use an array We know that computers can work with very large amounts of data, now we are going to find out how
Chapter 8.2: Finding Winners Using Arrays 7 Creating a One Dimensional Array int[] scores = new int[4]; An array is declared like any other variable The [] characters (square brackets) are very important The above array is called scores and it has been created with a capacity of 4 values The array is of type int, i.e. it can hold 4 integers We can create arrays of any type we like
Chapter 8.2: Finding Winners Using Arrays 8 Visualizing the Array You can visualize an array as a row of numbered boxes In the case of the scores array there are four such boxes, each of which can hold a single integer The first box in the row has the number 0, the last box has the number 3
Chapter 8.2: Finding Winners Using Arrays 9 Arrays and Elements Each box in the array is called an element When an integer array is created all the elements are initialized to the value 0 A C# program can read and write the values in the elements in an array
Chapter 8.2: Finding Winners Using Arrays 10 Using a Subscript to Access an Element scores[1] = 99; A program can access a particular element by using a subscript value The subscript is given in square brackets, as shown above
Chapter 8.2: Finding Winners Using Arrays 11 Falling Off the End of the Array scores[4] = 99; An attempt to access an array element that does not exist will cause the program to fail with an exception
Chapter 8.2: Finding Winners Using Arrays 12 Storing Reactions Scores in an Array if (oldpad1.buttons.a == ButtonState.Released && pad1.buttons.a == ButtonState.Pressed && scores[0] == 0) scores[0] = timer; This code replaces the variable ascore1 with the element at the start of the scores array We can do this for all the other score values in the game, so that the time values are all held in the scores array
Chapter 8.2: Finding Winners Using Arrays 13 Storing the Scores in an Array After a game has been played we might have a set of results as shown above We now need to create some C# code that will find the winning score We need to find the smallest score value which is greater than zero
Chapter 8.2: Finding Winners Using Arrays 14 An Algorithm to Find the Winning Score Look at each element in the array in turn. If the element contains a better value than the one you presently have, that is now the new best value This is what you actually did when you worked out the answer If you had to do this for 10,000 score values you would write down the best value you had seen so far, so that you didn t forget it and have to start again
Chapter 8.2: Finding Winners Using Arrays 15 Using a For Loop to Find the winner int winningvalue = 120; for (int i = 0; i < 4; i++) if (scores[i] > 0) if (scores[i] < winningvalue) winningvalue = scores[i]; This loop will find the winning score value It will work for any sized array
Chapter 8.2: Finding Winners Using Arrays 16 Creating Our Highest So Far Winning Value int winningvalue = 120; for (int i = 0; i < 4; i++) if (scores[i] > 0) if (scores[i] < winningvalue) winningvalue = scores[i]; Create a variable to hold the winning score Set it to a very large value which is not a winner
Chapter 8.2: Finding Winners Using Arrays 17 Declaring and Setting Up Our Loop Counter int winningvalue = 120; for (int i = 0; i < 4; i++) if (scores[i] > 0) if (scores[i] < winningvalue) winningvalue = scores[i]; C# lets you declare and initialize a variable to be used as a loop counter in a single statement
Chapter 8.2: Finding Winners Using Arrays 18 Checking the End Condition of the Loop int winningvalue = 120; for (int i = 0; i < 4; i++) if (scores[i] > 0) if (scores[i] < winningvalue) winningvalue = scores[i]; If we try to use the subscript 4 the program will throw an exception, so the loop must stop when i reaches 4
Chapter 8.2: Finding Winners Using Arrays 19 Moving on to the Next Element int winningvalue = 120; for (int i = 0; i < 4; i++) if (scores[i] > 0) if (scores[i] < winningvalue) winningvalue = scores[i]; Once we have tested one element we need to move on to the next one in the array
Chapter 8.2: Finding Winners Using Arrays 20 Test for a Valid Score int winningvalue = 120; for (int i = 0; i < 4; i++) if (scores[i] > 0) if (scores[i] < winningvalue) winningvalue = scores[i]; Only score values greater than 0 are valid Less than 0 means the button was pressed early
Chapter 8.2: Finding Winners Using Arrays 21 Test for a Winning Score int winningvalue = 120; for (int i = 0; i < 4; i++) if (scores[i] > 0) if (scores[i] < winningvalue) winningvalue = scores[i]; If this score value is less than the present winner then we have a new winning value
Chapter 8.2: Finding Winners Using Arrays 22 Updating the Winning Score int winningvalue = 120; for (int i = 0; i < 4; i++) if (scores[i] > 0) if (scores[i] < winningvalue) winningvalue = scores[i]; If we have a new winner, store it in the winningvalue variable
Chapter 8.2: Finding Winners Using Arrays 23 Identifying the Winning Player At the moment the program just works out the winning score It does not say which button achieved that score The program must display the winner as well This means that it must remember the position in the array of the winning score value We can then use this position to identify the winning player
Chapter 8.2: Finding Winners Using Arrays 24 Storing the Winner Subscript int winningvalue = 120; int winnersubscript = 0; for (int i = 0; i < 16; i++) if (scores[i] > 0) if (scores[i] < winningvalue) winningvalue = scores[i]; winnersubscript = i; The value of i for a high score is stored in winnersubscript
Chapter 8.2: Finding Winners Using Arrays 25 Identifying the Winner Using a Look-Up Table We now have code that will find out the position in the scores array of the winning score We can create a second array which lets the program look up the name of button that generated this score The names array is an array of strings Each element holds the name of a button
Chapter 8.2: Finding Winners Using Arrays 26 Declaring a Look-Up Table string[] names = new string[] "Gamepad 1 A", "Gamepad 1 B", "Gamepad 1 X", "Gamepad 1 Y" ; The names array is an array of strings which are pre-set with the button names The C# compiler can work out how many elements are being created, so there is no need to set the size of the names array The text lines up with the elements in scores
Chapter 8.2: Finding Winners Using Arrays 27 Displaying the Winner if (winningvalue!= 120) winnername = names[winnersubscript]; else winnername = "**NO WINNER**"; This code sets a string variable in the game world called winnername to the name of the winner If there are no winners (nobody pressed their button) the string is set to No Winner The string is displayed by the Draw method
Chapter 8.2: Finding Winners Using Arrays 28 Timing the Game play if (timer == 120) // find the winning score // set the variable winnername to the winner The game will display the winner two seconds after the sound effect was played Code in the Update method can test for the timer value reaching 120 and trigger the code that finds the winning score and sets it for display
Chapter 8.2: Finding Winners Using Arrays 29 1. Reaction Timer with Winner This version of the reaction timer game uses the algorithm described above The name of the winner is displayed
Chapter 8.2: Finding Winners Using Arrays 30 Summary A C# array allows a programmer to create a single variable that holds a large number of items of a particular type Each item in an array is called an element, and particular elements are identified by means of a subscript value In an array of size n, the subscript values range from 0 to n-1 Attempts to use an invalid subscript value will cause a program to throw an exception