CS51 - Spring 2010 - Lecture 18
quiz: problem 14.9.3
lost watch
Quick review of scope
- What is the scope of a variable?
- the section of code that variable can be referred to by that name
- What scoping options do we have?
- public member variable
- protected member variable
- private member variable
- local variable (and varying nestings, for example within for and while loops)
- When designing a program, how do you decide what scope is appropriate for a variable?
- you should pick the smallest scope possible that accomplishes your task
Show
TicTacToe demo
- We need to keep track of the state of the board
- How can we do this?
- 9 entries, could have 9 variables
- could have a 9 entry array
- What is the natural way to talk about entries?
- rows and columns
Multidimensional arrays
- declaration
- int[][] a2dIntArray;
- String[][] a2dStringArray;
- FramedRect[][] a2dRectArray;
- initialization
- a2dIntArray = new int[10][100]; // a 10 by 100 array
- draw picture
- notice that it's really an array of arrays
- accessing elements (remember, arrays start at 0)
- a2dIntArray[0][0] // the first element in the first row
- a2dIntArray[1][5] // the sixth element in the second row
- how would we find the sum of all the elements in an integer array, given numRows and numCols?
public int sum(int[][] a2dIntArray, int numRows, int numColumns){
int sum = 0;
for( int row = 0; row < numRows; row++ ){
for( int col = 0; col < numColumns; col++ ){
sum += a2dIntArray[row][col];
}
}
return sum;
}
- what if we wanted to traverse by columns and then rows?
- how would we find the sum of all the elements in an integer array, with just the array specified?
public int sum(int[][] a2dIntArray){
int sum = 0;
for( int i = 0; i < a2dIntArray.length; i++ ){
for( int j = 0; j < a2dIntArray[i].length; i++ ){
sum += a2dIntArray[i][j];
}
}
return sum;
}
Back to TicTacToe...
- Using a multidimensional array, how can we keep track of the board?
- private int NUM_ROWS = 3;
- private int NUM_COLS = 3;
- 3 by 3 array of integers: int[][] marks = new int[NUM_ROWS][NUM_COLS];
- private int EMPTY_MARK = 0;
- private int X_MARK = 1;
- private int O_MARK = 2;
- how does the game play progress?
- user clicks: onMouseClick
- check if we've clicked within the board
- figure out which square the user clicked
- figure out if it's a valid square to add the symbol to
- place the symbol (if appropriate)
- check for a win
- How do we check for a win? (group work?)
- need to check four cases:
- rows all the same
- columns all the same
- top-left to bottom-right diagonal all the same
- top-right to bottom-left diagonal all the same
- Note: when we're checking for a win, we're checking if a particular player has won for the last move
- we know the mark the player made (i.e. X or O)
- we know the row and col position where the mark was made
- figuring out which square the user clicked
- given...
LEFT // x value of the left of the board
TOP // y value of the top of the board
CELL_SIZE // the size of the an individual cell in the board
- draw a picture of the window with the nested board
- if we know that the user clicked at x, y, which we know is in the board, how do we calculate the row/col indices
x = x - LEFT;
y = y - TOP;
int col = (int)(x/CELL_SIZE);
int row = (int)(y/CELL_SIZE);
- look at
TicTacToe code
- in addition to checking for a win, the win methods also draw the winning line
- what would be another representation for the baord?
- option 1: two boolean 2d arrays, one if there is a mark or not and one whether it was an X or an O
private boolean[][] isMarked;
private boolean[][] isX;
- option 2: create another class that represents an entry, say TicTacToeEntry
private TicTacToeEntry[][] board;
magic square
- a magic square is an n by n matrix
- containing the numbers 1 through n^2
- such that all the rows, columns and diagonals sum to the same number
take a few minutes and try to do a 3 by 3 magic square
show
MagicSquares demo
- How can we represent a magic square?
- an n by n integer array
- int[][] magicArray = new magicArray[n][n];
- if n is odd, you can build a magic square with the following rules
- put a 1 in the center of the bottom row
- place the next number (i.e. 2 follows 1, etc) in
- the cell one slot below and one slot to the right
- if you fall off the bottom or right, wrap around
- if that cell already has a number, put it in the slot above the original position (again, with wraparound)