cse1301 computer programming: lecture 27 game programming: bingo
Post on 21-Dec-2015
227 views
TRANSCRIPT
Topics
• Problem Specification
• Top-down Design
• Structure Chart
• Random number generation
Reading: D&D: 5.9
Bingo: The Board • Cards have random numbers assigned to cells in the ranges
shown (each number can appear at most once only.)
• The central card is marked initially.
1-15 16-30 31-45 46-60 61-75
6
15
5
13
9
18
23
17
29
27
31
40
42
34
58
47
51
59
57
70
71
66
62
67
The Game of Bingo
• The game master calls out numbers 1-75 randomly.
• The player places a marker on top of a number that is called if it is on the card.
• The winner is the first player whose card has a straight line (row, column or main diagonal) filled with markers.
Winning Positions
6
15
5
13
9
18
23
17
29
27
31
40
42
34
58
47
51
59
57
70
71
66
62
67
6
15
5
13
9
18
23
17
29
27
31
40
42
34
58
47
51
59
57
70
71
66
62
67
6
15
5
13
9
18
23
17
29
27
31
40
42
34
58
47
51
59
57
70
71
66
62
67
Example Game
• Use 5x5 grid in your lecture notes
• "Randomly" fill in your card, with numbers from the correct ranges.
• Swap cards with your neighbour.
Bingo Program Requirements
• To play Bingo with ?? – N players and a game master (the program).
• Each player has ?? – a bingo card whose entries have been chosen
randomly.
• The game master (program) - does what???– calls out a number in the range 1-75 at random
Bingo Program Requirements • Each player - does what?
– covers a cells with a marker if it contains the number called by the game master;
– done by the program.
• The game ends when ??
– one player has markers covering all cells in a row, column, or main diagonal;
– checked by the program.
• At the end of the game ??
– The winner is announced.
– The prize is awarded
Main Task - Algorithm
fill N game boards randomly print out N game boards while no player has won yet { call out a random number update game boards for all players printout N game boards } announce winner
Data Structures - the Board
• How do we organise the board? – Hint: how will we access the board?
• Organise the board around columns and rows.
int board [5][5];
/*if cell value is 0, then it is marked*/
Printing a Board (algorithm)
FUNCTION print Board (board)
{
print header for each row
{
for each column { printcell for that row and column }
}
}
Printing a cell (code)
const int MARKED=0;
printcell(int cellValue)
{ if (cellValue == MARKED) { printf (" **") } else { printf ("%4d", cellValue); }
}
Creating the Board FUNCTION Create Board
{ for each column { generate 5 random numbers in range place them in that column } mark the cell at row 3 in column 3
}
Q. Anyone see a problem with this algorithm?
A. Random numbers must be unique.
FUNCTION Create Board
{ for each column
{ for each row from 1 to 5
{
generate a random number in range for that column while random number is a duplicate
{ generate another number } } place random number in the row }
mark the cell at row 3 in column 3
}
Checking for duplicates
• Use an integer array which server as flags:int numberFlags[75];
• All elements are initialised to 0.
• If a number i is chosen, flag the number as “used” by setting value of numberFlags[i-1] to 1.
Checking for duplicates
IsDuplicate (number, flags array)
{ if (content of flags array at position (number -1)
is equal to 1) { return true /* duplicate found */ } return false
}
Generating a random number
• Use C function rand (). • rand() generates an integer between 0
and RAND_MAX.
Generating a random number
int randomNumberInRange (int min, int max)
{ return (rand () % (max - min + 1) + min);
}
Example
column range 16-30 (min 16, max 30)
Suppose rand() returns 403
max - min + 1 = 15
403 % 15 = 13
13 + 16 = 29
int randomNumberInRange (int min, int max)
{ return (rand () % (max - min + 1) + min);
}
Data structure for players
• N players: an array with N elements. • What is each element to be?
struct playerRec { char name[NAMELENGTH]; int board[5][5]; };
typedef struct playerRec Player; Player players[N];
Unique Called Numbers
• How to ensure that the number has been called out at most once?
• A boolean array is a good solution.
int calledNumbers [75]; int i;
/* initialise all to false */ for (i=0; i<75; i++) { calledNumbers[i] = 0; }
Playing one round (algorithm)
playOneRound
{ generate a random number between 1 and MaxBingoInt
while the random number has already been called { generate a random number } mark the number as called
}
Updating board (algorithm) updateBoard (board, number)
{ for each row and column
{ if cell at row, column is equal to number
{ set cell to MARKED }
}
}