File: Board.h

package info (click to toggle)
gomoku.app 1.2.9-4
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 308 kB
  • sloc: objc: 1,184; makefile: 16
file content (208 lines) | stat: -rw-r--r-- 6,577 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
/*
 *  Board.h: Interface and declarations for the Board Class 
 *  of the GNUstep Gomoku game
 *
 *  Copyright (c) 2000 Nicola Pero <n.pero@mi.flashnet.it>
 *  
 *  Author: Nicola Pero
 *  Date: May 2000
 *
 *  Author: David Relson 
 *  Date: September 2000, modified for boards of arbitrary size
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#ifndef INCLUDE_BOARD_H
#define INCLUDE_BOARD_H

#include <Foundation/Foundation.h>
#include <AppKit/AppKit.h>

#ifndef GNUSTEP
# include "GNUstep.h"
#endif

/* 
 * BOARD 
 * The board has size rows and size columns.  
 */

/* 
 * These values describe the content of a board square.  A real board
 * square in the map may only contain 1 or 2 or 4.  In the strategy
 * engine we can | these values together to describe more vaguely a
 * board square (what I would call a 'generalized' board square).  Eg,
 * 6 means 'human OR computer', while 3 means 'void OR human'.  */
enum {
  nothing  = 1,
  human    = 2,
  computer = 4
};
typedef int tile;

/*
 * Compare two tiles (works with generalized tiles)
 */
#define COMPARE_TILE &

/*
 * We use 'patterns' to implement computer strategy.  A pattern is a
 * sequence of n 'generalized' tiles.  `n` is called the length of the
 * pattern.  */

/*
 * The central part of the engine looks in the board for a certain
 * pattern and returns a struct of the following type, describing
 * where the pattern was found.  */
typedef struct 
{
  /* Where the first point of the pattern is */
  int startRow;
  int startColumn;
  /* Direction: To move to next tile of the pattern, you add
   * directionRow to row and directionColumn to column.  So, (1, 0)
   * means from N to S, (0, 1) means from W to E, (1, 1) means from NW
   * to SE, (1, -1) means from NE to SW.  Other values are never
   * used. */
  int directionRow; 
  int directionColumn;
} patternPosition;
/* 
 * If no matches were found, startRow == -1 is returned 
 */
#define PATTERN_FOUND(X) (X.startRow != -1)

/*
 * Object representing a board (useful for computations and strategy
 * matters to create boards different from the real one) */
@interface Board : NSObject
{
  /* Difficulty level, between 0 and 5 */
  int difficultyLevel;

  /* The board */
  int   size;
  tile  *board;

  /* The board constants: if all else fails, higher levels prefer
     positions in the board with higher boardConstants.  boardConstants 
     are constant for a given size. */
  int *boardConstants;
  
  /* Last performed move, or -1 if none */
  int last_move_col;
  int last_move_row;
}
// Initialize, reset, set level
+ newWithRows:  (int)cnt;
- initWithRows: (int)cnt;
- (void) initBoardConstants;
- (void) reset;
- (void) setDifficultyLevel: (int)i;
- (int) difficultyLevel;
// Return YES if the board tile in (row i, column j) is free (that is,
// the user can move there); NO otherwise.
- (tile) tileInRow: (int)i  column: (int)j;
- (void) setTile: (tile)t inRow: (int)i column: (int)j;
// Return YES if the pattern t if in position pos of the board.
- (BOOL) isPattern: (const tile *)t
	    length: (int)e
	inPosition: (patternPosition)pos;
// The central part of the engine - see above for comments
// t *must* be of type const tile[], of length e
- (patternPosition) scanBoardForPattern: (const tile *)t
				 length: (int)e;
// Strategy
- (float) powerOfSquareInRow: (int)row column: (int)column;
// Perform a computer move
- (void) performComputerMove;
// This is the main Strategy Engine
- (BOOL) computerMoveInCrowdedPlace;
- (BOOL) computerOrHumanWinNext;
/* Last row and column computer moved to */
- (int) lastRow;
- (int) lastColumn;
@end

@interface MainBoard : NSObject
{
  /* YES if game is active, NO if not */
  BOOL isGameActive;

  /* Difficulty level, between 0 and 5 */
  int difficultyLevel;  

  /* The number of turns played.  When it exceeds (size * size) / 2, 
     the game ends [Quits] */
  int turnsPlayed;

  /* The main (real) board */
  int    size;
  Board *board;

  /* Our screen representation */
  NSMatrix *matrix;
}
// Initialization depends on the GUI used
- (id) initWithMatrix: (NSMatrix *)matrix;
/*
 * * The main event routine should report user input 
 * with the following methods.  
 *
 */
// Reset the game board and starts a new game.  Usually invoked when
// the user presses 'NewGame' or similar.  
- (void) newGame;
// Return YES if the board tile in (row i, column j) is free (that is,
// the user can move there); NO otherwise.
- (BOOL) isFreeRow: (int) i  column: (int) j;
// Enter a user move in (row i, column j).  If the tile is not free,
// do nothing.  Otherwise, place a user tile in that position, check
// if user has won, otherwise do a computer move, and check if
// computer has won.
- (void) userMoveInRow: (int) i  column: (int) j;
// Change difficulty level.  
// Valid levels are between 0 and 5.
// It can be safely changed while the game is running; 
// an higher difficulty level will use a better algorithm to 
// compute computer moves.
- (void) setDifficultyLevel: (int) i;
// Return current difficultyLevel
- (int) difficultyLevel;
/* 
 * Methods used to display the board. 
 * Override/rewrite the following methods (and the initWithMatrix: 
 * method) to port the game to another GUI framework.  
 */
// Change contents of (row i, column j) to display tile t (which can
// be nothing, computer or human, see enum above)
- (void) setTile: (tile) t
	   inRow: (int) i  
	  column: (int) j;
// Change contents of (row i, column j) to display a winning tile of
// type t (which can be nothing, computer or human, see enum above).
// This is invoked when one the two players win, to highlight the
// winning combination.
- (void) setWinningTile: (tile) t
		  inRow: (int) i
		 column: (int) j;
// Display an alert to the user through a pop up panel; typically
// invoked as: [self panel: @"Game Over" info: @"Human won"];
- (void) panel: (NSString *)s
	  info: (NSString *)t;
@end

#endif