30
1 Finding Winners Using Arrays Session 8.2

Session 8.2 Finding Winners Using Arrays - Home :: …greenley/cs2/Slides8.2Finding... · 2011-02-07 · box has the number 3 Chapter 8.2: Finding Winners Using Arrays 8. Arrays and

Embed Size (px)

Citation preview

1

Finding Winners Using Arrays

Session 8.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 2

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 3

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 4

Finding the Winning Score

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 5

if ( ascore1 > 0 ) {

if ( ascore1 < bscore1 && ascore1 < xscore1 && ascore1 < yscore1 )

{// if we get here button A of Gamepad 1 has won

}}

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 6

Creating a “One Dimensional” Array

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 7

int[] scores = new int[4];

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 8

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 9

Using a Subscript to Access an Element

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 10

scores[1] = 99;

Falling Off the End of the Array

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 11

scores[4] = 99;

Storing Reactions Scores in an Array

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 12

if (oldpad1.Buttons.A == ButtonState.Released &&pad1.Buttons.A == ButtonState.Pressed && scores[0] == 0)

{scores[0] = timer;

}

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 13

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 14

Using a For Loop to Find the winner

This loop will find the winning score value

It will work for any sized array

Chapter 8.2: Finding Winners Using Arrays 15

int winningValue = 120;for (int i = 0; i < 4; i++){

if (scores[i] > 0){

if (scores[i] < winningValue){

winningValue = scores[i];}

}}

Creating Our “Highest So Far” Winning Value

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 16

int winningValue = 120;for (int i = 0; i < 4; i++){

if (scores[i] > 0){

if (scores[i] < winningValue){

winningValue = scores[i];}

}}

Declaring and Setting Up Our Loop Counter

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 17

int winningValue = 120;for (int i = 0; i < 4; i++){

if (scores[i] > 0){

if (scores[i] < winningValue){

winningValue = scores[i];}

}}

Checking the End Condition of the Loop

If we try to use the subscript 4 the program will throw an exception, so the loop must stop when ireaches 4

Chapter 8.2: Finding Winners Using Arrays 18

int winningValue = 120;for (int i = 0; i < 4; i++){

if (scores[i] > 0){

if (scores[i] < winningValue){

winningValue = scores[i];}

}}

Moving on to the Next Element

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 19

int winningValue = 120;for (int i = 0; i < 4; i++){

if (scores[i] > 0){

if (scores[i] < winningValue){

winningValue = scores[i];}

}}

Test for a Valid Score

Only score values greater than 0 are valid

Less than 0 means the button was pressed early

Chapter 8.2: Finding Winners Using Arrays 20

int winningValue = 120;for (int i = 0; i < 4; i++){

if (scores[i] > 0){

if (scores[i] < winningValue){

winningValue = scores[i];}

}}

Test for a Winning Score

If this score value is less than the present winner then we have a new winning value

Chapter 8.2: Finding Winners Using Arrays 21

int winningValue = 120;for (int i = 0; i < 4; i++){

if (scores[i] > 0){

if (scores[i] < winningValue){

winningValue = scores[i];}

}}

Updating the Winning Score

If we have a new winner, store it in the winningValue variable

Chapter 8.2: Finding Winners Using Arrays 22

int winningValue = 120;for (int i = 0; i < 4; i++){

if (scores[i] > 0){

if (scores[i] < winningValue){

winningValue = scores[i];}

}}

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 23

Storing the Winner Subscript

The value of i for a high score is stored in winnerSubscript

Chapter 8.2: Finding Winners Using Arrays 24

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;

}}

}

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 25

Declaring a Look-Up Table

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 26

string[] names = new string[] {"Gamepad 1 A","Gamepad 1 B","Gamepad 1 X","Gamepad 1 Y"

};

Displaying the 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 27

if (winningValue != 120){

winnerName = names[winnerSubscript];}else{

winnerName = "**NO WINNER**";}

Timing the Game play

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 28

if (timer == 120){

// find the winning score

// set the variable winnerName to the winner}

1. Reaction Timer with Winner

Chapter 8.2: Finding Winners Using Arrays 29

This version of the reaction timer game uses the algorithm described above

The name of the winner is displayed

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

Chapter 8.2: Finding Winners Using Arrays 30