Gomoku-1.2.9/0000755000076500007650000000000011142567031012272 5ustar nicolanicolaGomoku-1.2.9/Board.h0000644000076500007650000001466111142555200013475 0ustar nicolanicola/* * Board.h: Interface and declarations for the Board Class * of the GNUstep Gomoku game * * Copyright (c) 2000 Nicola Pero * * 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 #include #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 Gomoku-1.2.9/Board.m0000644000076500007650000004665710571057037013526 0ustar nicolanicola/* -*-objc-*- * Board.m: Implementation of the Board Class of the GNUstep * Gomoku game * * Copyright (c) 2000 Nicola Pero * * Author: Nicola Pero * Date: April 2000 * * Author: David Relson * Date: September 2000, support 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. */ #include "Board.h" static const tile humanWonPattern[5] = { human, human, human, human, human }; static const tile computerWonPattern[5] = { computer, computer, computer, computer, computer }; /* * I swear I have beaten (at least once) this engine at all levels. * So, don't be afraid of trying yet another time - it *is* possible * to win, no matter how high the level is. :-) */ static const tile humanWonNextPattern[5][5] = { {nothing, human, human, human, human}, {human, nothing, human, human, human}, {human, human, nothing, human, human}, {human, human, human, nothing, human}, {human, human, human, human, nothing} }; static const tile computerWonNextPattern[5][5] = { {nothing, computer, computer, computer, computer}, {computer, nothing, computer, computer, computer}, {computer, computer, nothing, computer, computer}, {computer, computer, computer, nothing, computer}, {computer, computer, computer, computer, nothing} }; static const tile humanWonFarPattern[4][6] = { {nothing, nothing, human, human, human, nothing}, {nothing, human, nothing, human, human, nothing}, {nothing, human, human, nothing, human, nothing}, {nothing, human, human, human, nothing, nothing} }; static const tile computerWonFarPattern[4][6] = { {nothing, nothing, computer, computer, computer, nothing}, {nothing, computer, nothing, computer, computer, nothing}, {nothing, computer, computer, nothing, computer, nothing}, {nothing, computer, computer, computer, nothing, nothing} }; #define BOARD(i, j) board[((i) * size + (j))] #define INDEX(i, j) ((i) * size + (j)) @implementation Board + (id) newWithRows: (int)cnt { return [[self alloc] initWithRows: cnt]; } - (id) initWithRows: (int)cnt { size = cnt; board = malloc (sizeof(tile *) * size * size); [self initBoardConstants]; return self; } - (void) initBoardConstants { int startRow, startColumn, position; boardConstants = calloc (size * size, sizeof (int)); /* The board constant of position (i, j) is the number of winning patterns which pass through (i, j) */ /* We compute it in the most stupid way, by enumerating all winning combinations and for each winning combination adding one to each board cell belonging to the combination. This is stupid and long, but the code is easy to understand and maintain; nowadays computers are fast enough. */ /* Scan horizontal combinations */ for (startRow = 0; startRow < size; startRow++) { for (startColumn = 0; startColumn < (size + 1 - 5); startColumn++) { for (position = 0; position < 5; position++) { boardConstants[INDEX (startRow, startColumn + position)]++; } } } /* Scan vertical combinations */ for (startColumn = 0; startColumn < size; startColumn++) { for (startRow = 0; startRow < (size + 1 - 5); startRow++) { for (position = 0; position < 5; position++) { boardConstants[INDEX (startRow + position, startColumn)]++; } } } /* Scan NW-SE diagonals. */ for (startColumn = 0; startColumn < (size + 1 - 5); startColumn++) { for (startRow = 0; startRow < (size + 1 - 5); startRow++) { for (position = 0; position < 5; position++) { boardConstants[INDEX (startRow + position, startColumn + position)]++; } } } /* Scan NE-SW diagonals. */ for (startColumn = (5 - 1); startColumn < size; startColumn++) { for (startRow = 0; startRow < (size + 1 - 5); startRow++) { for (position = 0; position < 5; position++) { boardConstants[INDEX (startRow + position, startColumn - position)]++; } } } } - (void) dealloc { free (board); free (boardConstants); [super dealloc]; } // Initialize, reset, set level - (void) reset { int i, j; for (i = 0; i < size; i++) for (j = 0; j < size; j++) { BOARD (i, j) = nothing; } last_move_row = -1; last_move_col = -1; } - (id) copyWithZone: (NSZone*)zone { int i, j; Board *c = [isa allocWithZone: zone]; c->difficultyLevel = difficultyLevel; c->board = malloc (sizeof(tile *) * size * size); c->boardConstants = malloc (sizeof(int) * size * size); for (i = 0; i < size; i++) for (j = 0; j< size; j++) { c->BOARD (i, j) = BOARD (i, j); c->boardConstants[INDEX (i, j)] = boardConstants[INDEX (i, j)]; } c->last_move_row = last_move_row; c->last_move_col = last_move_col; return c; } - (void) setDifficultyLevel: (int) i { difficultyLevel = i; } - (int) difficultyLevel { return difficultyLevel; } - (tile) tileInRow: (int) i column: (int) j { return BOARD (i, j); } - (void) setTile: (tile) t inRow: (int) i column: (int) j { BOARD (i, j) = t; } - (BOOL) isFreeRow: (int) i column: (int) j { if (BOARD (i, j) == nothing) { return YES; } else { return NO; } } - (BOOL) isPattern: (const tile *)t length: (int)e inPosition: (patternPosition)pos { int a; int i, j; i = pos.startRow; j = pos.startColumn; for (a = 0; a < e; a++) { if (t[a] COMPARE_TILE BOARD (i, j)) { i += pos.directionRow; j += pos.directionColumn; } else { return NO; } } return YES; } - (patternPosition) scanBoardForPattern: (const tile *)t length: (int)e { // Extremely simple and lossy algorithm and implementation: we // consider all possible pattern positions on the board (easy to // enumerate), and for each position we compare the pattern to what // it is on the board (easy to do). patternPosition pos; // Scan rows. pos.directionRow = 0; pos.directionColumn = 1; for (pos.startRow = 0; pos.startRow < size; pos.startRow++) { for (pos.startColumn = 0; pos.startColumn < (size + 1 - e); pos.startColumn++) { if ([self isPattern: t length: e inPosition: pos] == YES) return pos; } } // Scan columns. pos.directionRow = 1; pos.directionColumn = 0; for (pos.startColumn = 0; pos.startColumn < size; pos.startColumn++) { for (pos.startRow = 0; pos.startRow < (size + 1 - e); pos.startRow++) { if ([self isPattern: t length: e inPosition: pos] == YES) return pos; } } // Scan NW-SE diagonals. pos.directionRow = 1; pos.directionColumn = 1; for (pos.startColumn = 0; pos.startColumn < (size + 1 - e); pos.startColumn++) { for (pos.startRow = 0; pos.startRow < (size + 1 - e); pos.startRow++) { if ([self isPattern: t length: e inPosition: pos] == YES) return pos; } } // Scan NE-SW diagonals. pos.directionRow = 1; pos.directionColumn = -1; for (pos.startColumn = (e - 1); pos.startColumn < size; pos.startColumn++) { for (pos.startRow = 0; pos.startRow < (size + 1 - e); pos.startRow++) { if ([self isPattern: t length: e inPosition: pos] == YES) return pos; } } // Not Found pos.startRow = -1; return pos; } /* * Computes a number representing the strategical importance of the * square in row, column. This is all pretty unprecise and simple, * but that's nice - it looks more human. :-) */ - (float) powerOfSquareInRow: (int)row column: (int)column { /* Temporary board to make computations */ Board *tmp_board; patternPosition pos; int index; float squarePower = 0; if (difficultyLevel >= 4) { tmp_board = [self copy]; /* Put a computer tile in (row, column) */ tmp_board->BOARD (row, column) = computer; /* Check how many next computer wins we would have with that move */ for (index = 0; index < 5; index++) { pos = [tmp_board scanBoardForPattern: computerWonNextPattern[index] length: 5]; if (PATTERN_FOUND (pos)) { squarePower += 10; } } /* Put a human tile in (row, column) */ tmp_board->BOARD (row, column) = human; /* Check how many next human wins we would have with that move */ for (index = 0; index < 5; index++) { pos = [tmp_board scanBoardForPattern: humanWonNextPattern[index] length: 5]; if (PATTERN_FOUND (pos)) { squarePower += 10; } } /* If difficultyLevel => 5, do the same with FarPatterns. */ if (difficultyLevel >= 5) { /* Put a computer tile in (row, column) */ tmp_board->BOARD (row, column) = computer; /* Check how many far computer wins we would have with that move */ for (index = 0; index < 4; index++) { pos = [tmp_board scanBoardForPattern: computerWonFarPattern[index] length: 6]; if (PATTERN_FOUND (pos)) { squarePower += 5; } } /* Put a human tile in (row, column) */ tmp_board->BOARD (row, column) = human; /* Check how many far human wins we would have with that move */ for (index = 0; index < 4; index++) { pos = [tmp_board scanBoardForPattern: humanWonFarPattern[index] length: 6]; if (PATTERN_FOUND (pos)) { squarePower += 5; } } } RELEASE (tmp_board); } squarePower += boardConstants[INDEX (row, column)]; return squarePower; } /* * All the following return YES upon succesfully finding a nice move * to do; NO otherwise. */ /* This is always succesful. Play in a square with lots of tiles around (at level 0 - much more refined at higher levels) */ - (BOOL) computerMoveInCrowdedPlace { /* Temporary board to make computations */ int *tmp_calculate = malloc (sizeof(int) * size * size ); int max = 0; float importance_of_max = 0; int i_max = 0; int j_max = 0; int i,j; float tmp_importance; /* reset tmp_calculate */ for (i = 0; i < size; i++) { for(j = 0; j < size; j++) { tmp_calculate[INDEX(i, j)] = 0; } } /* Look for crowded places */ for (i = 1; i < size - 1; i++) { for (j = 1; j < size - 1; j++) { if (BOARD(i, j) COMPARE_TILE (human | computer)) { tmp_calculate[INDEX (i+1, j-1)]++; tmp_calculate[INDEX (i+1, j )]++; tmp_calculate[INDEX (i+1, j+1)]++; tmp_calculate[INDEX (i, j-1)]++; tmp_calculate[INDEX (i, j+1)]++; tmp_calculate[INDEX (i-1, j-1)]++; tmp_calculate[INDEX (i-1, j )]++; tmp_calculate[INDEX (i-1, j+1)]++; } } } /* avoid squares already occupied */ for (i = 0; i < size; i++) { for(j = 0; j < size; j++) { if (BOARD(i, j) COMPARE_TILE (human | computer)) { tmp_calculate[INDEX (i, j)]=0; } else { /* we store here a non-busy cell in case we don't find anything better */ i_max=i; j_max=j; } } } /* now we extract the solution */ for (i = 0; i < size; i++) { for(j = 0; j < size; j++) { if (difficultyLevel >= 3) { if (tmp_calculate[INDEX (i, j)] >= max) { tmp_importance = [self powerOfSquareInRow: i column: j]; if ((tmp_calculate[INDEX (i, j)] > max) || (tmp_importance > importance_of_max)) { importance_of_max = tmp_importance; max = tmp_calculate[INDEX (i, j)]; i_max=i; j_max=j; } } } else { /* same without being too smart - just look for the most crowded board square */ if (tmp_calculate[INDEX (i, j)] > max) { max = tmp_calculate[INDEX (i, j)]; i_max = i; j_max = j; } } } } BOARD(i_max, j_max) = computer; last_move_row = i_max; last_move_col = j_max; free (tmp_calculate); return YES; } - (BOOL) computerOrHumanWinNext { patternPosition pos; int index; for (index = 0; index < 5; index++) { pos = [self scanBoardForPattern: computerWonNextPattern[index] length: 5]; if (PATTERN_FOUND (pos)) { int a, i, j; i = pos.startRow; j = pos.startColumn; for (a = 0; a < index; a++) { i += pos.directionRow; j += pos.directionColumn; } BOARD(i, j) = computer; last_move_row = i; last_move_col = j; return YES; } } for (index = 0; index < 5; index++) { pos = [self scanBoardForPattern: humanWonNextPattern[index] length: 5]; if (PATTERN_FOUND (pos)) { int a, i, j; i = pos.startRow; j = pos.startColumn; for (a = 0; a < index; a++) { i += pos.directionRow; j += pos.directionColumn; } BOARD(i, j) = computer; last_move_row = i; last_move_col = j; return YES; } } return NO; } - (BOOL) computerOrHumanWinFar { patternPosition pos; int index; for (index = 0; index < 4; index++) { pos = [self scanBoardForPattern: computerWonFarPattern[index] length: 6]; if (PATTERN_FOUND (pos)) { int a, i, j; i = pos.startRow; j = pos.startColumn; for (a = 0; a < (index + 1); a++) { i += pos.directionRow; j += pos.directionColumn; } BOARD(i, j) = computer; last_move_row = i; last_move_col = j; return YES; } } for (index = 0; index < 4; index++) { pos = [self scanBoardForPattern: humanWonFarPattern[index] length: 6]; if (PATTERN_FOUND (pos)) { int a, i, j; i = pos.startRow; j = pos.startColumn; for (a = 0; a < (index + 1); a++) { i += pos.directionRow; j += pos.directionColumn; } BOARD(i, j) = computer; last_move_row = i; last_move_col = j; return YES; } } return NO; } - (void) performComputerMove { switch (difficultyLevel) { case 5: case 4: case 3: if ([self computerOrHumanWinNext] == YES) { break; } if ([self computerOrHumanWinFar] == YES) { break; } /* All the refinement for higher levels goes here */ [self computerMoveInCrowdedPlace]; break; case 2: if ([self computerOrHumanWinNext] == YES) { break; } if ([self computerOrHumanWinFar] == YES) { break; } [self computerMoveInCrowdedPlace]; break; case 1: if ([self computerOrHumanWinNext] == YES) { break; } /* else fall back on level 0 strategy */ case 0: default: [self computerMoveInCrowdedPlace]; break; } return; } /* Last row and column computer moved to */ - (int) lastRow { return last_move_row; } - (int) lastColumn { return last_move_col; } @end @implementation MainBoard - (id) initWithMatrix: (NSMatrix *)m { self = [super init]; ASSIGN (matrix, m); size = [m numberOfRows]; board = [Board newWithRows: size ]; [self newGame]; return self; } - (void) dealloc { RELEASE (matrix); RELEASE (board); [super dealloc]; } - (void) newGame { int i, j; /* Reset board */ [board reset]; for (i = 0; i < size; i++) { for (j = 0; j < size; j++) { [self setTile: nothing inRow: i column: j]; } } turnsPlayed = 0; /* Answer to user input */ isGameActive = YES; } - (BOOL) isFreeRow: (int) i column: (int) j { if ([board tileInRow: i column: j] == nothing) return YES; else return NO; } - (void) userMoveInRow: (int) i column: (int) j { patternPosition pos; if (isGameActive == NO) return; if ([board tileInRow: i column: j] != nothing) return; [board setTile: human inRow: i column: j]; [self setTile: human inRow: i column: j]; pos = [board scanBoardForPattern: humanWonPattern length: 5]; if (PATTERN_FOUND (pos)) { // Human won int a, i, j; isGameActive = NO; i = pos.startRow; j = pos.startColumn; for (a = 0; a < 5; a++) { [self setWinningTile: human inRow: i column: j]; i += pos.directionRow; j += pos.directionColumn; } [self panel: _(@"Game Over") info: _(@"Great! You win!")]; return; } // NB: Human plays first, and the number of available squares is // even, so that if we are here, there still is a void square. [board performComputerMove]; [self setTile: computer inRow: [board lastRow] column: [board lastColumn]]; pos = [board scanBoardForPattern: computerWonPattern length: 5]; if (PATTERN_FOUND (pos)) { // Computer won int a, i, j; isGameActive = NO; i = pos.startRow; j = pos.startColumn; for (a = 0; a < 5; a++) { [self setWinningTile: computer inRow: i column: j]; i += pos.directionRow; j += pos.directionColumn; } [self panel: _(@"Game Over") info: _(@"Sorry, you loose.")]; } turnsPlayed++; if (turnsPlayed >= ((size * size) / 2)) { isGameActive = NO; [self panel: _(@"Game Over") info: _(@"Quits")]; } } - (void) setDifficultyLevel: (int) i { if ((i >=0) && (i <= 5)) { difficultyLevel = i; [board setDifficultyLevel: i]; } else { NSLog (_(@"Internal Error: unknown difficultyLevel")); } } - (int) difficultyLevel { return difficultyLevel; } /* * Methods used to display the board. * Override/rewrite the following methods 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 { NSImageCell *cell; NSRect rect; NSString *position; NSString *imageName; /* Determine the position of the cell */ position = @""; if (i == 0) { position = @"Top"; } else if (i == size - 1) { position = @"Bottom"; } if (j == 0) { position = [NSString stringWithFormat: @"%@Left", position]; } else if (j == size - 1) { position = [NSString stringWithFormat: @"%@Right", position]; } switch (t) { case human: imageName = [NSString stringWithFormat: @"Human%@", position]; break; case computer: imageName = [NSString stringWithFormat: @"Computer%@", position]; break; case nothing: default: imageName = [NSString stringWithFormat: @"Empty%@", position]; break; } cell = [matrix cellAtRow: i column: j]; [cell setImage: [NSImage imageNamed: imageName]]; rect = [matrix cellFrameAtRow: i column: j]; [matrix setNeedsDisplayInRect: rect]; } // 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 { // TODO } // 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 { NSRunAlertPanel (s, t, _(@"OK"), NULL, NULL); } @end Gomoku-1.2.9/Computer.png0000644000076500007650000000570507547634403014621 0ustar nicolanicolaPNG  IHDR((/:gAMA a |IDATxmVIdqV{O32iX\L J0- >XGÀ!_|`Aa REI$E8HVUoˌ\2P(īz//HͿc,gf"J)*sgΩ*sDD{1y{ao~lvU@UUuEZ̪gffD63*""1Fb"0pJID`2u]l6u]g x(")%fja{MUE xC:PM)ױ0Yrś׮ci7y3K.=qpz s鮪MRsǘ51o*$2#SMWJޫ˿޼G 00{( #?Kzm:i&ԙU>16f%0? bޝPYY:4<)o]λ3@.r( UeYYKmv]˴饯~/̉1MtL(gLbA{I&Cb{$zXw|6[佫[g(BAzkl{w٨[wլR4T/ ߽AF2)Gڛ(+],u,|2_ cw/fy橍1bcE^PU+t} quO9{*4 KȎByF+9KFy"ϲȴ`Te;7>ݡ=Y*&%h8"&&<ݕ>~c_{wg= %R|f1&jZG޻,!ٲom.s}Ƈ0iڍy6wSk.Ok)n޵?{ޟ|ԇ"R(M fESGʢFkkycikW}p=??󏯟|̓"$BQsܹruGYkx܌ 8 "!X&6꼰elWO-mT4^wU;Z "}aIuKD$ȈhȉhnOsd攒*Pex4., +嚳TxLj&?>9|,=!"sscmֳۦbDTeUUYq>o|plVc|ts^]wAG`H{B TUg/1A{!"CZ냥tݛ7\[*]aOnMV~-"wm+D%]30<-"Ҷ3z0ƘRo-e9>|fOvGٵ{]  _D0("41 96Fn۾b]u]˜yUP~!_ ?ށ^3ZN'FOz "⤱ab}ݔ@VweҚ++O[.t{{[Rc*"=@@T@$de)qTPI,)tieOB__|l㋪w^X|v*IЀ ">N2C2蜒a " hk{} (EUEres'⑮ffi ͥo߱vv+QE@U0_r,<7Q_@x}ܮX{!,$/AUU"^UH3' 1 B0d XIg7o^w4. a yZlXG dXI'\nŘBX;*^;E`(9E.@W~2>8h߈X0 OT~t.1XU;!2$p<{z/^Xz嫵"G0 -Yɍm+?Fuht`@|4i6ը`P6♗-e_>+| ꜲhS73V>Oֻ6)fAQ! :] #5*=218;sF@Om~jeѕgJhcT]z"Pg)L5 ~sPsӉ4)̚TжIȝ_^x_G t1."ڢڮ ޡqIpڥ2f+;;|^ukwIDnAP. NA+[K鉓|n#! zӁ.\"2F%@~LLAqi7e8.>=pI=؎G VﯕaLV.pF֌ .^5lRW| }XjrO^Vd݆Թ;96t|m^E]ĕlyU63GZKRʍdRbXgSMΈMSaةWs^rEģC\+uz4}ObyIENDB`Gomoku-1.2.9/ComputerBottom.png0000644000076500007650000000567307547634403016012 0ustar nicolanicolaPNG  IHDR((/:gAMA a rIDATxmVI\q3ݩG)D$" l",e N6Ǚ-Q; IJ-2-R$Y$7{w:bEh8_|_ӫ1zf&8z2GTI7{7'~˦l}QTUU\D̬{fffKd1  """c$& "3D &I]u]f3\uYò"RbqPUd`O97j դr Sl+׺yg4&s渳s'N?,aΓ8SU5IJ`SS"F^D>xQ|ꀺJ!zכ߿zysuEar=w=M'ͤ>:j6ƹo@ ޿ܚE#Ó:?}k7xofeZ]E,12kmۮ:c>G4N}ߊr$8 jk2,ǢGuǷO޻65yV*ġzˬ!y:>={ݏ.\^Z͚,NSm@`~݋ a$bK~|į9Ɋby"5Zg<˲ ʪ*or巷ͳOm1+|ZA[o|ҾkoTNXGv3]awY2s_yUG}*=\.bT 7m-9@k~1Y6]['os4aT(Y23c1P:e!̖eh/>va{s7>IoYјZv.p5~zTKq;4>*Eitm4m0+D,>ZWE6Z[KK7vC{ѿ^l!*u_=OO5}Z fpl`9Od 5wTm/cszim '߼ۮJ쎩mcgM__͔3X"" FFDCNDs{$3TQDD,ǣqeYׯ\OԜR%0qۿ B"a9<= cl۶5M6Mc$,ʲ,^dc%{[:Cmv>Hc rZ,P7oݺyR ANp|{jk[! D(B ƘhN1Ɣzk -O~7{M8ήޥYNŃH?inq: yeͤ'&+ DP0 [y^W*`칗1Z왭;GPTx}t֙C"p<,efMIuIb65poyr:B7Yǵr FQkS 9sohW12[= 5 "NZ]Fksta|T/L]Il #ps.?s;Yϰ CƠgάp`/M}C|.ڇM xԋ {˗F/?YmM/7>yrAvHuIhn]Tb+:!J  ֢v#Fh3gW_9SwHC}#bSr.?>;zʷRr |4 `>4WYʐ9왥?{a镯ދx}$8@d '7>g\>gǣN#HF1Ͼݒ\㰼!bl/+>u3jL1nkq޵I4 1LJdQؙٖ3=xj;ϭ>V(<`,VDz:cLa*DY}wÚNv_f֤"'MEZŋz=*MxqevM#HĀs.1; _Uw[|︝Mr4ޞZx87b'ȏ0%,,.aTv*5N须sOIvԥU sOe:t)0fTDe޸vr>NgjMQ\eP{"6\:]Ęզ:mpu3,]f6,g˛Zƶ=2=UZ”Rn< K=δlڐvFl"^{+:{=LO3䊈[C\+uz4}f:^IENDB`Gomoku-1.2.9/ComputerBottomLeft.png0000644000076500007650000000565207547634403016622 0ustar nicolanicolaPNG  IHDR((/:gAMA a aIDATxmVK\qye9bIH$ X6 d^ @`oS>N,Z$0Hb9dY)ԓr8=3=}_TUWl(բQ}q:_}1zf&8z2GTI7O'cgSwC."ZfVU=33%٘EG1SJ"鴮뺮9e:㬷fCDI)1uVUd`O[A5jθ]6銓f^y.37M9^tڵk[ W0i$%_0w)X)#g/@"mu@lI} v^N뵛\w<C_5u+@Q٧.^~kfZ͜\5cc\`Vw _O>_ EQ̣Ӊipx_~|87 2-Ǯ?mPUeԶmuMJ^,}ߊr$O~( jk2,'uށݿߟ}c:gkeUU(Co>xYc {C>.uRͷ>6rewe=k:M @'L-u>6_ymoIfEkűCye!UQUUkB91v`roG1c(-0 8V4?UU`M׷]I__y u’8l| sΒQlȳ,n;2m}3UgS{ŨnbZr䇏"blRϳC'^}dèP) egc ֡u2B-\^}*'o|Ӗo޺ۻ1q7&80a]k줖ś,[>)Eitm4m0kD,>ZWE6[++4q}}|Z_߽s;6VEcw&ogff-b@9XsDB*dM])l0ya{خ]:Ux & ?n}ޮZNmcgůߩ'l3% HDѐž)%U,h\fYw{֜3R%0iB" xz"08ضm=om.HDeYVUeY' cOoիw iO_X%"1F8>}/Dd3[k}NCQܺ}x++,vGi6ӵqT˼] Q jDIBDO1 /Vp1[K mYf}[B]C@.mp/7 TDC_ =Dm45Қ0N$OcWVZXɩ J= E u۶}u]2@^U1T~qgd'w4;@Ɠ{e#B˝N(8iy)c}7##Uo_&ښuαo}z#8D@"HHq111kC܊OݷDd8[ ;$h@p'!:dv~HdE=鞶j~\ҵQYŊ*29ㅓ l3HߴwX;}l9 `TPAAAUUey&C듰oAۍ=΋ejaBI`נx`ke*d: wr\C(ڡ(-LT/]f{6D{;iS{; LY V,-R]ηrp>\Z|a*Ex%}j|i,򢆯U0 /c8*…;ёw?8Iɭ3D`txW=D5%aE#'IXJd[YkٱC ! |~7v66EM4.iaQ\ l]4, F0'/W߸:ł:kwym/o̯^&ptabU/L]Il #ps=K̰ CƠӧ.op`үl}C|!M xԋ {kO^| :eo^^m>{jխQvrHfuIha]V(:!J PYʐ9xnoދx}$8@d '7h\?ѽ3si<4lQ(n /q"QX]T\5WEsQ5wޙlvmR"͂BA4SuFjTzebp v÷3\JE[EW^@0 +BfQwM@1W0,DgGqM'BxpR;Q5)mE;p5{YJFc?^b\68DEY]C&1+e֦wN&r ʀw9`pJo6/=ﮤV,Cc]Dee% J4nu;e៸T|v{zZ7u~UeCxέ~T콓x;4`0p.֚(LܸxI3Ogdq.0+w _O>Y EQnϣӱip||07 2-Ǯ?iPUeԶmuMJ^o3/<=Y),I,(|Q@2)d(YlOD? ytY1ʪPZ}.:އ|]6z[ҥS4T/ ߾ AF2)M7(V7+],u,|2_񶱫w};9s1bcEo_VU+t} qu;?a%qdG!<#_{%+($1^KD:۶MSM,˪, |:W_{2X 0a{! PU6D$GG 9`fkI([n:Rbwf|0]뇵̋ܵFti ƘË""m+>kS%,Gh$PmE\Zx~*Ex%G}j|a,KyW2`Dc-pxt#(f9:}w/FRrLF!X8$̺c$1 [^zz8ԷqՃ?=rhs![mNyFՆR)⢍ oڰHhYW12[= 5 c]XPg.sō $ΠN1,YC]>:>q@ [O~mb4`4ly .XLI0U-bU%8h߈X0g W6OV_tCƐ,݇,@8g>'__yk"G0 -Yɍ/mk=BǸS|4jT`0 ;[?xӭȻ|V 8=B,W_EeܧnnT)4Ɲ;ͮMJYPT1fN"HJ϶L ΝНqg{ihƂa%@L1I=3B{rt" [6I^K /K4a4.eCD[U5;4 iAR,|wm>`NiDnAP. AG._܊eH#?t`*6ˠK@=11iƥp~?W=rzZ7uAUeC|JgWɧ0;@t7]ldAl2IVdݖԹE \oήwinjzU6sZKRʍdRbXgΈMS9`Mtٮ9+x}a}kX{NCfB F| `K:IG!]Stݲ  <̃d,") 3\3]̈qJ!PȪzx_Eoca=3QJIUHDs=wNU#*$ދɛؔ/2k-3l|"BDã  )%atZu]2uq[3!y:TRUd`O[A5jθ]6f^q.37M9^xի;έ`8;PU5IJ`SS"F^D>xQ|ꀺZɓQ׫7޾w<C_5u+@Q'/\ rcן4EQ*K̲Zj۶뺦XfOsOig`oE9 e 'LJ5Jnÿ_ߺ>5yV*ġzˬ!y:`ƛY]5yJۀ{W H&ŖI/:xɊbu"5Zg<˲ ʪ*?9}m1+ZA[ů/vX:aIQ6W>w9gɨs6}QYv>lpz}z3ŨnbZr#blRϳN_yxèP) egc ֡u2B-\^y*ǩo|Ӗoܼۻ1q7&8.p5~v\Kq,[>.Eitm4m0kD,>ZWE6[++2~=;޴߹gwl!* ދOff-b@9XsDB*dM])l0ya{خ]]qja&>D0(ei(b &@mܶ}žﻮ뺖9򪊡͵Ì;<=!;'hzh55|+^_pEADIc$N)zڴ5֬sK'Ɓe%= BUD$ UF$DŮOD}4ĬQ^Hr+?f%"cLO!$A*;ɰ6CG,"Y1/=kĻյt@TEV :@,|Ha=ກmf零^Y}k'-^**((*,[y2 => XYffo& $|RBJ p;?{! Rz /δLe p'8Sj6aB\H@ĄdXnŗ2pU-X(+!?S @D `ʋRY&"kqTvƣCAQ5{za4[g2/g0kJ¬}$&aa+kQ\o]]W/=]#9B&nmTm(5Z!.h\d@âe_ l]4, F0'.U_;:ł:kwym/m̯\7'pta)bT/L]Il #ps>q{!FaAAϖ'O /%_z?h'67S/3x>5zjg,m@yi[W&A e%E8 $wYYVuTBxX+/~-A;s;S,`pXm-K30B8WⅯ4>47" 9%B|+՛*7pBcC zH 3O[gW^zg L@c Dpr e[31=9U>hBF5οnEðbjo.)>usjL1q=ڤDEht-2Ԩl@o=ݧן֋(<`,VDz:cLa*DYOgQM'BxpR;Q5))mE;=%{YJFc?^b\8DEY]C&1+eצw[|礝Mr,ޞp9×b'ȏ0%,,.aTv;) #w0Mivԥ{?4^پQ*]_y*0fTDe޸vr>jMQ\UP{'Yu[RfrfO.bLz76VX5.mXV]mc=7{`z)x@&UP!{X;ikl֐vFl"Nćή>6+"l; s kiV _lYfIENDB`Gomoku-1.2.9/ComputerRight.png0000644000076500007650000000567507547634403015625 0ustar nicolanicolaPNG  IHDR((/:gAMA a tIDATxuVI\u>MU=S"%%dEzaEbY@`l3x ")@,۲,"Iġ]]UoEIEW;}ca=3QJIUHDs=wNU#*$ދɛ?_~Oؔ/2l/"ZfVU=33%ِEf"""c$& "3N)㺮뺞N댳ޚ"HJgh೅7U٢/c'6tP cajYv7n\{M8o{>ڹNq}A'wo#k緖Vf}*4 KȎByF+9KFy"ϲubՑi#vo>٥/,p֒G߻ɲI=OwwoᴇAd=R@ʜό1$@@C{e>2[\![qrޞZ 5Yog ]'؟]OBaB}a)P&AGFBȢueQd5{7>xO~} r9@9գ?dgA(km"6á9|4^}<9AH5b>;zO- 8ضm=mm.HDeYVUeY ;dC%{o;:Cmv>Hb rZ,Pnݾimtn?M83^LܵFtaA1 Gp<cL@ڲL?XΓyxޥiF~hSƟm8f ˚I{e5HUUy~~~+[-ԇ%gk{4 b6\1r]ﺮZȫ*w!^ >څ^3ZN'F9;=rqlb}݄@Vsm߅GƁe%= BUD$ UF$DŮOD}3iYV+O^6 JM{<9=? `Mc ퟿7鿱O "XQTFEY6\f^RӸ ,ą +@LHe?Tft1p>\ZFNɨ .O}W=W=9B:m{mTm(5Z!8Y-*Fa뢱ga`4a>{z  5yn=6pv4)k|QXgR'HdkSCwٓ_z!2?U]>3=F@^KI0 &5^U ϜzspKP!x,$ ~rǷ/lý@2ɨKBssy6}(XG dXI'.SPbLV!moG/l[Y~"xZ9E.@ꕗ>y>i|hoD,rJSKç}+կWnY,XY;!2$p\>'__z+"G0 -Y mk?AhXpf@s]>fM5*0ԭp楯vK// ?;,M1Ƹw޵I4 1LJdQٖة35 |w[}n;mQ]yX06F5'uX_T^#AM'BxpR;R5)1mE;9x!{=^JC?\b\48DEY]C&1KeNWwnq{㾉܂2]9ۓ×/[K驓|n#! z%3~XVY]¨)H3,FY3kwo?qvХG?4.8V2Z]aX3(w2o\x9NjMQ\eP{GYuRftrWNa1&lp?7յuv ͮKSZƶ=6=UZ”Rn< K=ʴN6iH;#6EL Y]x6O8 s kiV?Ly %~IENDB`Gomoku-1.2.9/ComputerTop.png0000644000076500007650000000565607547634403015311 0ustar nicolanicolaPNG  IHDR((/:gAMA a eIDATxmVY\q23w_]RH$"bI@F6E Q; IJ-2#RII{ywf9]Uy8dD0ԙ9믾j?Rgf"9*s.xT9H&xV:S;GPUUs2z--F̧,"DԿhLs&]g֨j[xW33}5(,8]'xC;Au2t8fWoݼqޔeɜvvv^Y疰qT ɚ(2)~d2$&+5͖̎u' 0,Пf6 PUD~ W}g.n:iƳӉ3bjSj J`.gCU[Ӥ|lx\܄wov#ޟr#OT%Ea-mu]3+X&/kygF4I}0U(bAOyfMRDx{oo7Oٚ`P)Co>xWXc {C9v2>ti{ihӜ;ۀ D&?~̯5)jy}@kűCeYu!ԃj0~CG[.^I7JNJG?Vb iuO7~=}Ah̉`˂;,uΖ(#N|Aw8qܙj8nRZrO"blrɾ}7=FVJ#cL:wECu]*O\\qa[vs{m8"&g; \wϤ$fv\),Jdd`VY4w1YWWU1\[KK2qCx^l!*M=L˻g -b@:XqDB*dM]-l0FedWv.m h+gvj"qãqg{l % ֈHDQܞ9gU(FpTEkwŵai))2$rdyrÐ fe͵N)m;6ͬm.DDu](¨O7?}H)OnΖyH_ %")%8:J1 rZ,PUn߾uR*a'prg7g2J׶BQ҅A1=""m+?SJ9Gk Ow ,7Iq}@.Oc@8(sTDC#=6Dm3&8Қ0 ,oq5|=R_D?\Lڔmcץ~Vv]˜yU0Â;<=!C2}Q Z΍'_Fe#\ҋ'r^q9R1v2ǭ b޺sA0hIU$ Q YXE3IAY$0K9tѴroWg׆FA@% PAIOS2W;? D$"b_{wW߼g_8bEQxIxzYD$6mK{kbL-FT|Ź*,d{L}1 ԥ][]9BQXJcUUE=_){U!%CąaW%"c/{!J т{{ZzN"sy pl՚۾aJ\@dXnEu\Sc\[x~}P%h7VR(bn3|a,򼆯T@s/c8s[w4va8[g Iė=D5gaygIYXJpڕ9{e<=rhs!ϭv&Նr3S!9soiW)1[шI#NZ]YFۋk쭃pta|T/Lb.d@8ϞNb4V`4l}5.XIEȱ ϜX90\2|H!x,, ~rsۗ7@2)BssI[9͒zhZ+-WZAkK;y)x_,޶%30B=7x _;sO4 >4 lӾ{(7]LCs"dP Ι-ՋK~c潈 L@# Dpv  O1nv2}p|м/3ǚM5)0џtovKrO G,ZM1]O-wzf%"(*D U+aF%3Sgt{?N^ڪ<`X  lJkr$uX?0 z-6G3n:ƃsZ6KYUKk˗.KampG+]Jm8Y 8Rw+{g;{=~pҎce@] %3W,ōT,;CGp*(@=1iFp~?S=rx65vፏS7/aLgWcp  .^{5t<l3AWbq`)=Ń* .aj?;Zg,=6,˛nmljcTUk sΥLB,+GX9[hkgŤ!؜0'҃HO]~ftm%W%EDD4H@Df9ľ7zkT5/=;HΙ!xS҈}K=ؠz52+ݽq7nv}?/篽y4 u’9lYU{%ٲUUE^wd0Gӛw?ߧ9WGm:KКqD̖M<;>ݷy'JzT8_c6Z֑(|!KE{۫ܜߺ}ww7~fMpAa}o중=󷛣Y(LsR),Jfd`ֈY41YWWU1[++4y{O߻vl!*-_?Hf!-:sJ3v81'2`UȚһZ`nFeb._d 3[ԟR`SoM_-7X#" FFDÚ0Hf9E1LƓ(PnwcpVF")N#Oogg8A,0DdapJf޶M׶}JFEQI9^bVS>sԬAO`H#!~f3`񗈤8(Dd3[k}OCUݾsp+,Gy6Gӵyȼ*] Q jEIBD_1 ^:ey0s@L?SB]@.c@8(%*/"ut ELN$g~y;M;ԇ%X$ẨM.}few9WU _8*dzSwc%s}Zjn=2*)^_pEBDYSaSJ1ܘv&ښuα|vcq`YaD@"HL$4hLS̚z@RZѿiaY"2BDA@% PAG5I:(ɂ0Ȋ~{?kMIH $Pd+˨fㅓ j3Hl t{e{W=Ƙ:Q**((*,Kya2 =¾@xs n?qYаJcUUECBJKp{!J= ђ{ gZ.^`/&1f8Sk`J\@dX~2p3xJ_oԓPgBa,E_ˀA /c8 ;w|i<;g W=D5ga:%Β- .Z/sFxv:B(_čK-VQS!E4aвRb.k# 5 +o\DtbEƻ,vW6.ۇ;ZAÒ5>BŨ^3c FK?}[,"CƠg./lp`֯L}C|IڇM xEz㗟L7?}vQqrHfYhaC̬e)&!J hGL&5/~E㰺1bj(>sjL)i{wY )BZbQl@ݝ?{rϭ?w9W]UW}}X0I6%޵9:cʌ~8jn{փsC[.KYUK׊٫͸6a<>eCD[գowhA,nNyG՝}wMce@} %sW/wW7T,;cǺt*(@= 1i'vpq?y=J{fڴ͏׶maJW-0W;@t7[lt4Yf$ *P[zEU[Ҕ=}”6?ڷ7+j]۰Znf2K$驪KT@X V v6{Ŭ%؜0'ӽ#H_}jt]W%.o*뙙rΪJD"✋,9UeN {/fsu圓v^UUΒqp6^ɭwhfZ]??;ibDu Lsk "ug5)jP4M ]au6xbK{7~ի{kE;kT/ ߻A&29uԏbj>Ӷ0q"ck5ʲ:Bi}pĜC)vX{T 5} >{{g^;nBkdN([_zd9[ʢ{6n~ 4чSA#ܦEl#ޡ}+o" *%R|a1&jZG޻!Pغ.G[ia;ݹZv>pݷ~z:}7Pi(I'o BDdd]]U`kw~Gcז r'oA۟~x0u֠FTt[̭*s U!kJjay^V6(Camkn2ÿ۴ԟQ`M7ߜJFFD=-ii̜sVE*b8uQ~+?ykEXk:")'g B&#.SJ]gm;ڶO)Q]MEx /2P 0|vx=!@E]΀_"R!lR> Uu;׷jWYt<}x.t]'D%]Y"Ec̢""]'?-rHW׃~7{hnI{V˳-&j#?EE4)COD_N}I&Qbi,Oq5lb/A,6%i1+c΁bh~~䌴 fCZzn=2*)^_"e@DYS$9b(_=ذ7xw8Ƒq`YaD@"HL$И5I''?Eޭk[0 dѼͲ˗ /Ȋd@8O~b4V`4B}ԥ-.XI4U-J xEzӃ7CA}l0+Oܽ3:.Nɴ> -aQ]e֪<!J;i~r/|4}hɲQ ʐ9ŵ?ڋ_{/}E+qN#t{ OOCTQ@s^Z&oQX߀V\7gWEKQ5ҔVuo.+AQ! Z:H 5*m9#{G3ͪꪯ/! 0ɦ޻6G"PgL8R=sۋ܍`fM*2]J'W]Wڄ7V mU7]8Y 8Z O|6qʀJ08 緇/>Z寜+;YГwO,Yò- 3&%@~HLAamw:\Wx>kllaN6מ.0 T;@t7[/`q3f$ :bc-=QQK3:?/`0elq[_' v ͡3֋sNvi>3hz9x@&UP!#l\(bڒFlN~#֟,]xU v9 os-kT5D /uaNqtRIENDB`Gomoku-1.2.9/Controller.h0000644000076500007650000000236707547634403014612 0ustar nicolanicola/* * Controller.h: Controller Object of Gomoku.app * * Copyright (c) 2000 Nicola Pero * * Author: Nicola Pero * Date: April 2000 * * 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_CONTROLLER_H #define INCLUDE_CONTROLLER_H #include "Board.h" @class DifficultyPanel; @interface Controller : NSWindow { MainBoard *board; DifficultyPanel *diffPanel; } + new: (int) cnt; - init: (int) cnt; - (void) applicationDidFinishLaunching: (NSNotification *)aNotification; - (void) runDifficultyLevelPanel: (id)sender; - (void) newGame: (id)sender; @end #endif Gomoku-1.2.9/Controller.m0000644000076500007650000001344010571057061014577 0ustar nicolanicola/* * Controller.m: Controller Object of Gomoku.app * * Copyright (c) 2000 Nicola Pero * * Author: Nicola Pero * Date: April, September 2000 * * 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. */ #include "Controller.h" #include "Board.h" @interface DifficultyPanel : NSPanel { MainBoard *board; } - (id) initWithBoard: (MainBoard *)b; - (void) changeLevel: (id)sender; @end @implementation DifficultyPanel - (id) initWithBoard: (MainBoard *)b { NSBox *box; NSBox *box_b; NSMatrix *matrix; NSButtonCell *cell; NSRect winFrame; board = b; cell = [[NSButtonCell alloc] init]; [cell setButtonType: NSRadioButton]; [cell setBordered: NO]; [cell setImagePosition: NSImageLeft]; matrix = [[NSMatrix alloc] initWithFrame: NSZeroRect mode: NSRadioModeMatrix prototype: cell numberOfRows: 6 numberOfColumns: 1]; [matrix setIntercellSpacing: NSMakeSize (0, 4) ]; [matrix setTarget: self]; [matrix setAutosizesCells: NO]; [matrix setTarget: self]; [matrix setAction: @selector(changeLevel:)]; cell = [matrix cellAtRow: 0 column: 0]; [cell setTitle: _(@"Level 0 (Trivial)")]; [cell setTag: 0]; cell = [matrix cellAtRow: 1 column: 0]; [cell setTitle: _(@"Level 1 (Beginner)")]; [cell setTag: 1]; cell = [matrix cellAtRow: 2 column: 0]; [cell setTitle: _(@"Level 2 (Easy)")]; [cell setTag: 2]; cell = [matrix cellAtRow: 3 column: 0]; [cell setTitle: _(@"Level 3 (Medium)")]; [cell setTag: 3]; cell = [matrix cellAtRow: 4 column: 0]; [cell setTitle: _(@"Level 4 (Advanced)")]; [cell setTag: 4]; cell = [matrix cellAtRow: 5 column: 0]; [cell setTitle: _(@"Level 5 (Difficult)")]; [cell setTag: 5]; [matrix selectCellWithTag: [board difficultyLevel]]; [matrix sizeToFit]; box = [NSBox new]; [box setTitle: _(@"Choose Difficulty Level:")]; [box setTitlePosition: NSAtTop]; [box setBorderType: NSGrooveBorder]; [box addSubview: matrix]; RELEASE (matrix); [box sizeToFit]; [box setAutoresizingMask: (NSViewWidthSizable | NSViewHeightSizable)]; box_b = [NSBox new]; [box_b setTitlePosition: NSNoTitle]; [box_b setBorderType: NSNoBorder]; [box_b addSubview: box]; RELEASE (box); [box_b sizeToFit]; [box_b setAutoresizingMask: (NSViewWidthSizable | NSViewHeightSizable)]; winFrame.size = [box_b frame].size; winFrame.origin = NSMakePoint (100, 100); // Now we can make the window of the exact size self = [[isa alloc] initWithContentRect: winFrame styleMask: (NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask) backing: NSBackingStoreBuffered defer: YES]; [self setTitle: _(@"Difficulty level Panel")]; [self setReleasedWhenClosed: NO]; [self setContentView: box_b]; RELEASE (box_b); [self changeLevel: matrix]; return self; } - (void) changeLevel: (id)sender { int level = [[sender selectedCell] tag]; [board setDifficultyLevel: level]; [[NSUserDefaults standardUserDefaults] setInteger: level forKey: @"DifficultyLevel"]; [[NSUserDefaults standardUserDefaults] synchronize]; } @end @implementation Controller + new: (int) cnt { return [[self alloc] init: cnt]; } - init: (int) cnt { NSMatrix *matrix; NSRect winFrame; NSImageCell *cell; int level; cell = [[NSCell alloc] init]; AUTORELEASE (cell); [cell setBordered: NO]; [cell setBezeled: NO]; [cell setEditable: NO]; [cell setSelectable: NO]; [cell setImage: [NSImage imageNamed: @"Empty"]]; matrix = [[NSMatrix alloc] initWithFrame: NSZeroRect mode: NSTrackModeMatrix prototype: cell numberOfRows: cnt numberOfColumns: cnt]; AUTORELEASE (matrix); [matrix setIntercellSpacing: NSMakeSize (0, 0)]; [matrix setAutoresizingMask: NSViewNotSizable]; [matrix sizeToFit]; winFrame.size = [matrix frame].size; winFrame.origin = NSMakePoint (100, 100); self = [super initWithContentRect: winFrame styleMask: (NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask) backing: NSBackingStoreBuffered defer: YES]; [self setTitle: _(@"Gomoku Game")]; [self setReleasedWhenClosed: NO]; [self setContentView: matrix]; board = [[MainBoard alloc] initWithMatrix: matrix]; [matrix setTarget: self]; [matrix setAction: @selector (userMove:)]; level = [[NSUserDefaults standardUserDefaults] integerForKey: @"DifficultyLevel"]; if (level >= 0 && level <= 5) { [board setDifficultyLevel: level]; } return self; } -(void) dealloc { TEST_RELEASE (diffPanel); RELEASE (board); [super dealloc]; } - (void) applicationDidFinishLaunching: (NSNotification *)aNotification; { [self center]; [self orderFront: self]; } - (void) runDifficultyLevelPanel: (id) sender { if (diffPanel == nil) { diffPanel = [[DifficultyPanel alloc] initWithBoard: board]; } [diffPanel orderFront: self]; } - (void) newGame: (id) sender { [self orderFront: self]; [board newGame]; } - (void) userMove: (id) sender { if ([sender isKindOfClass: [NSMatrix class]]) { [board userMoveInRow: [(NSMatrix *)sender selectedRow] column: [(NSMatrix *)sender selectedColumn]]; } } @end Gomoku-1.2.9/Empty.png0000644000076500007650000000346507547634403014122 0ustar nicolanicolaPNG  IHDR((/:gAMA aIDATxuWK$IGdVV hZ@Rk^eX f8@\Ċ`Gh5Uf"_EO_~EUND3kw]kMUD|ۿ_h4w[=djPۢosgwG"8DF%DؚsqjN1Ri {XMa7XϲVDDf>`f "?Dt[M ㈻#9R.@f.> w<[f{oyH`Df:'".{VUt;BAI_lC|cKQSGp =o0"^.KYEĎ Kو +tR&7o f6{ygV>r;ޞ "E AXb i2sh℈T ɉ@9T)flv3]m pWB#щ2ר5LFEkӼ[]X熬Hg2啣z2!Ơ] U[%\U{=´\}9?nNm-c~C~<'WPdM쥐*Pٌ3'Y1-zӱdF0@}_h{or9:4]+#q9n;W)/eݺ{z|"V+O[;/7d_Rլb ^Z֠w'"i_a5v޻ZH]?UQVN3e<"J3yHD9y0憈tc,DMRlH-,M<U:5KTR{;FLz7NNeRUf]1uqDȕ\Pd3f@pC>CD؇#·O XUJ)XmGKC^CD Ift!{hg<?v;02" s)e6Z;Ô,Kze  2unJ2 Dնܕ'>ia}I3. %>L040i:[љw!Ϩ6ӰX#-бȌGΟR za³ ,Gw_h\֊|bf$*vCGr$v۠IJ;rv=+3ʴ֯Ji:ygv:/DNU]*n7I{#";z;NwMr$lz{=;z \47{ <˄4ک Uf}̭5Pd,ժ^̢s&w=^q=jTi2޻#pz?ҴggIENDB`Gomoku-1.2.9/EmptyBottom.png0000644000076500007650000000336607547634403015307 0ustar nicolanicolaPNG  IHDR((/:gAMA aIDATxuW,I ggι箴jI$h3$2͐y^@D<&EotU&L> F=ٍWDafwo[kfDdz?~o~ҷCyJD"tX 6kXTEJӉ"""t=sD9YKU}DDNd1AAQJs ԰݇ݝZ9u:F<l{VUOʲ$䗘ze齏 gIYһ*á{?\.ڮ,v3騗;s~*"ӂNYqDleGg?L/̡UgH}f&T1zv1α}aGݚ|4ƒQGmRb p@`v}d0axv>:vцNfF.p8@q:GD%'TZ#yWR|PZu"_'C~Y,:"xq5  %8;FdAU;ýJ}m~ c 53gFq "jbM03Qk]w67[uYL!Zw H9ZٕÚEDXs0 Y z?Baڇ>__~?%h>gw qQ5I̬VeY"|.w_իD/?QWFV1o./"(qqT{.R"p/Lm{s\DFߊVza8?=Pwm>zR,J)e/_G@FfcZË/N3}P,ˢf{PxA?]j\j֪. )K݉F NK\IENDB`Gomoku-1.2.9/EmptyBottomLeft.png0000644000076500007650000000333707547634403016120 0ustar nicolanicolaPNG  IHDR((/:gAMA aIDATxW;$IY5սk61Oc)VŌ#u83 ! LOUgD;BdyGWʆķ|UPLDzfVJqft:̌]U?~_ҷ}JD"tX 6kXTEJӉ"""t=sDD fe(܀gv{ {オ+AA:ω'mz֪EY]|Ǽ׳,K=AJGIYһ*ܹ>zv74esTViqX0reIqqV`F}c؀ ajVKr }i١?5F/:cn_>p^xǵS+]6<;6!eJ-]xt꺮Qɉ3r^ŕTEzYz2Q`3n"BHXQRY8ȃGf#ᤶҥ?v9H0S.Gep~dT"^!!jDZxFܝoMem3 k1r8GWkBa-"D$d"bf*3/fN~ڧ~߮_*|os}JP~u{s(8"T `@8T9yc7h_^9Z9r0񗿽7z:CrE$VD~8?z?-'߸k;N5)<ķZk}Y3뽯JDfmp轫ju=qUַŲG eQ!9":r;ێRƃ#f}/9"P̬a V?{f6yD3gʼ}!t3U o˙B*kCyxx2Ϩ̺g)ΟR"oY7qT*gxqf̟7&~fN.VU"3tG$=kghG .Gk3uN6D.Sl쑮yA3acax{䕥 Eغl~gHZzwh9S4 eCf ],rEIe\W5amAPP{}IB/*)EZ+KH{wx#E7IENDB`Gomoku-1.2.9/EmptyBottomRight.png0000644000076500007650000000325407547634403016301 0ustar nicolanicolaPNG  IHDR((/:gAMA acIDATxW,I ggιgWڋ!DxDDL"^ -xB% W9Ue=55sKEٍWDafwo[kfDdz~՟gj$EDީDV"gZ?Ukt"]%fNRUw035 ՃS:kBDžHw'I0"zWI#n N"rqDi v@i,"&0<ȃYw3lu]Wgv∨ԙJYck9JJNk}Yze}j?əScagDD."I$RϮք,"ZD(HD̢Uf^8̬Q7z /j9 ͬVeY"|.O?۷_ ?C+qqG.'hHYۿY$7翬 \櫻q>xO{˯ A1"fffDTN3pP,ˢf{XЗxSͭwʨ1L)sGKWL¸e;1tD8#ӦUJ)̜SkB4+Ӿ1#+R͌@1r1Z;טvBRwYEJ);ډ[ζmje]洞 nݍUt)ĀLL94~{\ͼ ]_ӀY1aLuw@V M?|(6lD>_P4l `ǓOEf09:}Ԍ9hD0@# )J6SWʂ{vŸs8MC8WD"xn6z5g.9L}]3t0gkbU%1Cw8N~@|˂"bf̜^Jv:ZkDObۃmƖ]JD"tX 6ov,"ŪaZIDD.k~L3-}F|3 ZL)Y#8ΚơC 3W[#VP5J)Ev3[c'"n ~@Ʈ22h޷d& Hfe,\9Vjėλ0Z6S)zxxxض̼UogeYte_ֲ,f6@wIYb@p9wlzvE+ u:23^*Vi[й2IrqV#Zُn&`fY/C7;4'cb=1Dgl_?lZ/_بW?C޷\5u.p@߂^g\>u\UM\_y c:ou]`̬dL,q@^i]4bk3IH :aYDIe dHj @Kr8-IUKI}v>H22P?2HY{ QjfZÇb9ݽۚh fI1#hބ<3[f*HEݳUf^8Fv?o׏Kǜ4><֠@S;l]$ښov8̬yj'?oyH\p,fZJyic3ێRC4G?CK>(K3FfZv{2?ZYדGww39μ޽vy뙪n<̼{yi3;EUUΌ7=|vSuڧ;UsY`S ?iY=N֎FF`f]e\Vkf"*SGfS"bgG_eOw";p.qӁ<{ݦܪK)(E/y/%K=fE:2z<WS۾t @ qg,RՈmۆʺ10nᬢK!m̔LDIx6|}>]O9ù/i:YW0Ҏ.Sn#Fuq~cG~۾ ICq?egǹ4Mp><;KdrgGg4"^]Sw+8/g3u/3(ÓM?qz.2gǥoF zʲ+,g/1~~/kxc1[3U(2Hp$〼e-FYQEћHڇG.e9Q li" Ҟ{sDFfg$2@G]$n%~M_x+3堩7Ǜ0d3Fِ,9 );T}kaamCPjT[#3JBRtry3K̂"V7IENDB`Gomoku-1.2.9/EmptyRight.png0000644000076500007650000000333107547634403015110 0ustar nicolanicolaPNG  IHDR((/:gAMA aIDATxXlI g鞞aa-""C! $ m[<1)!H A@pu{5sTmwMnEq볫?ޙ9"̬ph39o/Kߎ"[DLD$"h9m^;DDD89.UuY 3 Z)Q=85tDDYM~NUSot+nN"r D v@Ť>D fe(܀9V5pp]{ﭵh] &r=+x<<l{VU'eYte 5eYzy֚5 2:zY;-xyvS73騗9kC>}VA &pDl%#s&`f?DȰ74K~W!:cGÚ|QG|ȇ|YJN -CLpY]jI7I͌\&uVuuf'JNL%?F **.Dgdz g0)gn"B@,(^A#BHp YwxPmwP[ԟj;AH$2P8Uā5"<FDuY[rxz5QA (u8á]9 YDP8E̼pY^{a{|SEp[6Q3ss" w qQ5yF;f6ZUDe<_|Sősᤔʿ~}ןL?+nzAWw|y>2w_f3(bffFDeλo?IFpPX SޙY}WvD{ߎ~E䌢'aWEk,;?"̚ҩ:6޻ZYC4`ᗚ:(^4LU~7wfVUu0ΐTUU1yrcƠ tр \TA'G1h%"fM4r7ZB=Mu;1뽻P?z`v/͑GLy^8t#t ӧ*WIt!jaH3Lƨo\g d @+~iJ+$eq'@USyٶmx ;  ݺRݾ"'h\s\KvcT7s0뜅k=30lDE"fSLC/MEpg?p}.45tJ˙)0"χg_8zL2ǥo zcƳ,g9~y_sxs1{3*G#v⁵toGYDZg.rꝊwE X])6fovN.]p bu[/ltUl']NC+S4 eyL= !x GkƙҸKEwW1F [ < #82{ft*"mj~9x1%"V"ZEUI dUwwB rJ iDDDf&-nR$3Μ̷/A2eܘ8'@+sFD@9fW4D3^S;ܬ'KtKN/_𹼙?Q*orS>+:I;Φ mc|>Jr\E729PDtp P֖p4 8" SGPv9//B 3b&,1 8  BDjAD`J Y8聁9$$ .#'D0Q0;Q1"HDWiP: 0ft~q`6"B),F'̴_?ޮ˧~>9~̂U;Z˲DiW_NovڎcDNUMmǣXfԢV}̊ 1@5HW&~UzD$*hFל7w/^(g"RZD#"\y0;Z""hFP^똰3U䄢RujbD'=>U?9ZeV˒p1FRUMHW*epT(3cYw߳n*fPda68*0)4{ԩ\4Jk [;KLB*\ّi"2 )W (mqD&+Ӕm[im]c`#&@dR7u#aY"8FF$" {P޻I=n2His>T*UvE*F{ޥ8L?U߈X_ f8_z n6 g!7]JD N+Q q-j<DDDLJ_ðʔw5ָ̪:B$Ѓd7͸X(A JR`Ӂwψ3[khnB JVά:dm=ZV|bR,>@wiYꞙi&̰3X,)""8b9S`QRU[}t=fpiguF:#돒304kjJːSw׫У䝽5F? &?ȋ >_4ky=dp:.blW:H!b0m뺦H$B,11FfY9L),dҽ g*1wŠ ȒL j ̬q2g& D((Yv;ɓ*gt0˞~6Ny ^TSdt>f63V3;HRXED؉-2RVs R@4)"R U*" ">-s/ rxKӅһ+3GJA 3#ty{Yn~?mfۻ/45*nA_o蟗U޼o9(FnUgB}9GoRi$&5PJS 1SXFuY" Ŷm[V[nno߭?dOr=r eY,"R:vGLUK)!4D|ׂ1"bt1%&CD.q~?{DZE֋ˈARs[}vyfl̟1xo4(=yG0}XxuV>^օ٧$2dgOcgllz#ݻO33ܓMy7̳+y߿gG*fV-l6 4D2Gl iOyRmȽA!B ٨`Gou ]s^# /Qm+[!-K&1RLՉdm˺bO qbV S[ ͹M!"J@jٛӡ;n9#T_6S} mh]3iI~`Q3s]˼4mps1"OGdƅCh4-~s(]WP/vq~L <7۞̐(AsL >{xs1{3Ǩ(`O Xyb<vvxV*roYܩc4*8ID37"  NBfζ(X "qfYTn[`ooW93!,9Ӳ0(UOH[җZ`R̞#/b}ć )bKU 3hՖ`Ҳ{2}tIENDB`Gomoku-1.2.9/EmptyTopRight.png0000644000076500007650000000326107547634403015575 0ustar nicolanicolaPNG  IHDR((/:gAMA ahIDATxWM,I g;2!!qn!8,g4uʈ•Q3UV?._3;3GRܽY||l3Z+/}{yEQD$"9m^;DDDh?XDOUu+3 Z)Q=85vf*{pҶ'Ҫȩ7r;)y#qXͤ bȃ<ɣrsjptp(Vv{k-ZWɃfwzyyxضnZ\eѕIb˲H5)k@zwwWe t46XDiڡ,3^ƝX:!"^Ӄͷ1"FY 'PC" "2OF:;>ћ{8z;Q^* 1>284(@z`Y a\>q:e:GD%'T[#yW"ᗧ g0)n"B@,(^A#BHp QĝQmKrB"pW=3WFq "jrM03p^ûo&6B^w H9ZՕÚEDXs0 Yf(Ze}۞>V'i=aQb3ܽCEETܜ(88(dͬVeY"nK2 53R" ?__}b7SK)9 4"wG`|q|+PԿS4a,V3ˎ,>} u>LUlzzr"(C]D(?xӪh͖ +"XJ)Zk5mSiu̺ͬ>ܤ3йxKV\?Uu5hTUDF3$UUfxYI>f*A0| ykDR@*I7կϘcZȬY wo3 &}?Nffww7*nj23̮VWLy_5};N>\1-y?}ͬRJA)NIUl6}cTG6k_I`Ț5;yiJ+$eq'@US۶ u=DĄw*b@pnmcc t7=i.|;n9#8wܮOYA5Z(} Aqjyin#Lw 3.υ6li81 %rf(#{i$3۞3ϐhfXP9ƟPob<ϹU# ;I t^.jW .gkDrXKT-H*N1{+P(0"-<':"^?=Ʀ7>^Zvе4gtD¢!|Y's ȅM*fRy_Nkk Rg? { # # Author: Nicola Pero # Date: April 2000 # # 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. */ ifeq ($(GNUSTEP_MAKEFILES),) GNUSTEP_MAKEFILES := $(shell gnustep-config --variable=GNUSTEP_MAKEFILES 2>/dev/null) endif include $(GNUSTEP_MAKEFILES)/common.make PACKAGE_NAME = Gomoku PACKAGE_VERSION = 1.2.9 APP_NAME = Gomoku Gomoku_OBJC_FILES = \ Board.m \ Controller.m \ main.m Gomoku_HEADERS = \ Board.h \ Controller.h Gomoku_RESOURCE_FILES = \ Empty.png \ EmptyLeft.png \ EmptyRight.png \ EmptyTop.png \ EmptyBottom.png \ EmptyTopLeft.png \ EmptyTopRight.png \ EmptyBottomLeft.png \ EmptyBottomRight.png \ Computer.png \ ComputerLeft.png \ ComputerRight.png \ ComputerTop.png \ ComputerBottom.png \ ComputerTopLeft.png \ ComputerTopRight.png \ ComputerBottomLeft.png \ ComputerBottomRight.png \ Human.png \ HumanLeft.png \ HumanRight.png \ HumanTop.png \ HumanBottom.png \ HumanTopLeft.png \ HumanTopRight.png \ HumanBottomLeft.png \ HumanBottomRight.png \ Gomoku.png Gomoku_LANGUAGES = \ English \ Italian \ French \ Swedish \ Spanish \ German \ TraditionalChinese \ Hungarian \ Norwegian Gomoku_LOCALIZED_RESOURCE_FILES = Localizable.strings include $(GNUSTEP_MAKEFILES)/application.make Gomoku-1.2.9/GNUstep.h0000644000076500007650000000502311142555140013766 0ustar nicolanicola/* GNUstep.h - macros to make easier to port gnustep apps to macos-x Copyright (C) 2001 Free Software Foundation, Inc. Written by: Nicola Pero Date: March, October 2001 This file is part of GNUstep. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* This file is automatically included when you do a #include * "Renaissance/Renaissance.h" which is the recommended way to go. */ #ifndef __GNUSTEP_GNUSTEP_H_INCLUDED_ #define __GNUSTEP_GNUSTEP_H_INCLUDED_ #ifndef GNUSTEP #define AUTORELEASE(object) [object autorelease] #define TEST_AUTORELEASE(object) ({ if (object) [object autorelease]; }) #define RELEASE(object) [object release] #define TEST_RELEASE(object) ({ if (object) [object release]; }) #define RETAIN(object) [object retain] #define TEST_RETAIN(object) ({ if (object) [object retain]; }) #define ASSIGN(object,value) ({\ id __value = (id)(value); \ id __object = (id)(object); \ if (__value != __object) \ { \ if (__value != nil) \ { \ [__value retain]; \ } \ object = __value; \ if (__object != nil) \ { \ [__object release]; \ } \ } \ }) #define ASSIGNCOPY(object,value) ASSIGN(object, [[value copy] autorelease]); #define DESTROY(object) ({ \ if (object) \ { \ id __o = object; \ object = nil; \ [__o release]; \ } \ }) #define CREATE_AUTORELEASE_POOL(X) \ NSAutoreleasePool *(X) = [NSAutoreleasePool new] #define NSLocalizedString(key, comment) \ [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil] #define _(X) NSLocalizedString (X, nil) #define __(X) X #define NSLocalizedStaticString(X, Y) X #endif /* GNUSTEP */ #endif /* __GNUSTEP_GNUSTEP_H_INCLUDED_ */ Gomoku-1.2.9/Gomoku.png0000644000076500007650000000653707547634403014270 0ustar nicolanicolaPNG  IHDR00`ngAMA a IDATxۏdWuƿUOUW3d0e/B!Bx"P^byij%d,`  H@#0rǃ=s>}zݞQIUҷ}^ZV@ IIhpOS|p06󔡂[em0.G   gWCK* (9"/* %@ y FmIn.vlC-Q@c!( IK4QnHHQ 2 Vr~MIs$Y`P H-^k*Ж@phxm'h7p3+=@|垓_dd9Q3ExVέ <Iɗ5I X kˏ? gczb4zIV_~y2 ѽsz=^k6X[+4EamCMfsY߰qqq/ U@Ca,`@њ/3oq܏~gy&Y2&X;4ыt#'vШ VpP$$P@*kחHF{'LFY5b7<ù#Gn|)'/DdvfGV[+q tHM./_Ѧa$Y}9],1 XQ)k P4@yX`F%hͼ-CTgY5:T.EDx,ͥΔ=u1+&OV -oMnY%Ar2-ZKU }(@D2X<to6VB]GS&P΄2c9\XەYL*˼0֞zPoZR$ 'HAR)Ձ} 5rfьU3R9AP]G[.ir=-zBӭ-*`*R>*cj@pF9w(j3('^kL #5nuiUIYvcOP3R}F3֔`d"EcRqy;4[,XYL)t"#HViy4\8t١vv9몦:um;L+r+odW޺v3,#FX>Ӏ(iz v/l>}TMuOۏHe8C BolN0uE K.eOK"L tr7:ߜ{<Vۉ=bqr\Yًi r絽*ڵpn]r2UZ.OܓνKmkqPA}^|饋+F˓vmڦiזV.[=z  z}.ݱx-ͼ3|*'Fk/GJ.ڹ 0s3'yyxiC3)+c}/ AsGꍦמkGsʶr㍇[mjW7?vdfNt$Ծz==wak"bN?#7EjJ @PxOavʥ~rfXM>:y=w衹KW܉G>dMBk~ƋN~};<>rr̋ RX PѵrJk7/ŷ =w,߹_g*2b~mr2^[x|xP'>3ɵ3%$%" 5Y'<5 p-%T"MhאCwi:SV6bqd"sB0AqQ g ]g$`jQcr0lyNX9fHY;=.b"*z_!vfOwg(hCANI}`,Pw]egv9kV)gJ 9? ?IENDB`Gomoku-1.2.9/GomokuInfo.plist0000644000076500007650000000116411142566554015437 0ustar nicolanicola{ ApplicationName = "Gomoku.app"; ApplicationDescription = "GNUstep Gomoku Game"; ApplicationRelease = "Gomoku 1.2.9"; FullVersionID = "1.2.9 - 5 Feb 2009"; Authors = ("Nicola Pero "); Copyright = "Copyright (c) 2000-2009 Nicola Pero "; CopyrightDescription = "Released under the GNU General Public License 2.0"; /* For Apple Cocoa. */ CFBundleShortVersionString = "1.2.9 - 5 Feb 2009"; NSHumanReadableCopyright = "Copyright (c) 2000-2009 Nicola Pero \nReleased under the GNU General Public License 2.0"; } Gomoku-1.2.9/Human.png0000644000076500007650000000571607547634403014075 0ustar nicolanicolaPNG  IHDR((/:gAMA a IDATxW[\WV^kϭ]v$3;$B`' @!w-L d'vڗ9g^ԭN٧|D<&&bl,-XUU26n^{{l[o˃Vـ; ZIi^\TO6I (G{'de||a 8UM"h%6Dv-;!ɉ_ξo&ź'j &5Y`*ƃxZPB qHJ_?xPLF_a?1HMMyC{mgNWqvҦL0ZBĄؠE)7MJ#0!9G;7<ٺI@V=k5 M*@KEhEk-8]l7~'T(!ቯ  yRl+鞲i[Bhb @VDQc!PdՃ۩FwGutҦsmDbJRKͷKynxkYjpD|q;sZKJ lU_PҦ\<-l:x{(ސy-|.SЇprY&SMѣ;[Rb[m=,2w9[ S0|[QD$UFjG֪kg7N PU5CpP;ՙܿ;wVOnO9NCjKS"jh$i9`(dB3Z;w02쵿nw@7(!Ab{9 y!>Tx|=aN+@ R}@4&v#3(+/dw|=V|T;MSU&YBs{բ=<έ?zm?Vf,#&4Ml>6n ^Io鿿?:!jtXdl<IJ6 ͟ d@~'j>ܼv>ܞ>zx<{ARP鼺οO)~5|m'1i- G9J@5!4@D1{ho?Y߸}p=Ozg:`jIf_pwy+_Xwg׭MLV-ͳv. eIYw9cB:xMg>yI|&'dWyq/n^7f|N{8*ZM$DH!61"iiSD'&x4u>NxH9Nj!t!mG"#' ]x6H1*D4A070 ݚ6,C?p hǦui]v%. aª֦A(=ER>RIENDB`Gomoku-1.2.9/HumanBottom.png0000644000076500007650000000570307547634403015256 0ustar nicolanicolaPNG  IHDR((/:gAMA a zIDATxW[dGR<תqόNj^mxZ'Ģ]$]~oxG\ތ^Z!{cE3gR]sNfڽ=BGGudŗ_eᕿ-"RVUY+jI6fy[{6T ?}gici#΅ ل(I"k-#5mDDVUXbNLYfmRնLF:0smVnǓZ,l۩$AqjmŢ(ᄭAj#CD16SKu~w'OWdM5) /t>/CpqSOvԂ4jk0$ h,(8vjLn0 }vXY^2%yf Šqj aVV'S{~6D<&&۰bl,-XUU2n&,F B!wIi^cP&nqNV;a 8UM"h%6Dw.wBڗSvξ54Dd YBik%Xǃ"y3]b2ׄ\xFmh "Bl{op {kpĖjN۔F BU[4`RZ[(X1`u#LoۄQ1"jssM%Fi>[IDOX4 6-aC-;+{G`th SȢsDd'$P&|u\l_ش#!1ESd +GD(`1dX(2UTu#;ɏ:6"W%q)4K[7Wb""/v81!L"A\p,Ɛ%6jpHs JFɓh8pv9TPG>"a'Wc̆1F$E7l~ئ:zwf+!A26{(N``eMj0~ҭƯllv(hfib25  8;<@hRC)3Sny;Mb"bj*Wpb:/\/e}GI^Ѩ=Q%`ZL vb#363q\f^,>Hn5YܘWxq9_f\D" f5[!F2@#iݼ;J)e$fxn<'Ӡ t$] %xJ>זy &"|%"H<, "i^~~ip "n\k_"hմ\ =9P5'))x^yAvoFج'MCr_'Z{\e$RkIb/cį~uJ^*7k/zBP';1x*D\$Dfn\h nm_"߼ǧLV%bsTW<#`A@Um3_[|k}sWc2bs4>(֋c,q(sGf+‡0\`KA-⸤UuݧmOԄhz?LOqݹ`xW/t~OP_ck7{{vLS(=~rks766 E,=z,-UMS!ITO};o$@TcX^*SU:hw>׍4MUpZ/?_q#bWHz>cAD~!'D@/'գ+ͣsn-'j~-u?y⅋.2+1Dc2g~SL/FNkGOokqQvDs>VۜOZГ~Qrݗ#m5Y3~rwq9)I$rRڵn~q=o<`-;ٙ3NiE*ѳ}y11 !m۶>|X{{Fa18%FF+:f1sLJם|4 `H^ 1xfCD^A&$ i\>  ;ˑ[T~?[=>OYv&%)A^U,Ċŝjm:}ϯ\@֌edc؄m@֍ct1֍?w{GQQ_8+V{!YjL1F߽#ـlpЍgFÆ&7<:<{ERPTSkkz1OcR. G9J@cChQbc|:~;:+Oݲ3\떥T j6;߹{]߸ėݹukgz5fh󬓫BUQB+-f! -pMg>$LO:3/n] 6zB֋- ^vqH4I8ԉBl *D%bD1v^۶B3&u71ȇqzi_LZ9deG턴 4dNRv Ũ"0en܈ì,wk^\ p)L-_~Ȕ$WcLXڔ3Q3#ת?;d}IENDB`Gomoku-1.2.9/HumanBottomLeft.png0000644000076500007650000000566207547634403016075 0ustar nicolanicolaPNG  IHDR((/:gAMA a iIDATxW[dGR<תqόk/6`B'"@!!vxG ތ^Z!{:3Ǟk_vɓTg0iȁ5b& !vt;wˆr=,hE@Sk'cdOfqп_K\ yZEBX$.hD`R:W(81bu7]bQ"*3SI@CƾsƂKj@GEEg}FW'pqk~4RhEh $vNlb:>Wlsm#mLDh1 FDpl "$0LsU=fxb/UfxN:tE$TI| M2R=zo襼tH/r8f9 2e4!X1-WE_LKos0$MDG&FFOxjPrC~Q'C̆1F$E &4l~Ҧ:z7lA2[E:31ƥ)@x)FLQnw׶w:E43iZj09NN9 -Pf̔DBDNL+̆(]+I3E,O9#a8p6୵LCWY+WO>1Xܘ.Z*,9h 3CIcrg W\!F2n(w-3HGx3ث4@=hK Y[#-.w\݁z4DQItO|,3=[U"&IԚjp>,EHZcO&ƹդgtqgT}:"b Zxn ^z/rZV&UIx^]c"2;PPm|ShPޟc_unHa:=iC0=gGnq}5=C!"`mشcҜLZj`O~:c) pjm<]\hLE >,f!&SM7(ĕKXdoOg{c{6;㪢?}Z̑5C,$wyp޽7&ٻ[ghBlmuai4},nw0xiV#5j$\'Bcfk *D%c줽m3M&nb^Ia1i.inM(|hN;h$Ak[xkbTh aA;?rx~ 0 '6Ite/Z[Pѳ$ ǘXURWb@PSUJVnIENDB`Gomoku-1.2.9/HumanBottomRight.png0000644000076500007650000000566707547634403016265 0ustar nicolanicolaPNG  IHDR((/:gAMA a nIDATxW[\WV^kϭ]nw%ΐI^`xB $b?w @4B'$N|/]s>{x(SvQΩ}.EDctΩRlu*e3ȂnĶlΏr\.ToG?u٥YLZy1K$i,RDD KlPՉiP3 .)T&CM\Vu'IYeY. m4T}l\ġQآu D%jB6uD q>8dN}1h l A ib3͋4Mewo&P@a` )Y h)"U=N{rײ_bcuX*&xFPBamHN7st01`D(Zk-<#3t{p0~zg_x;q-NԒM,:B:%qA#J sE)7yzS% ,!23xiF;x[qRl' pơ` h fDYE \.vT(Z9"Z+@1دn^Nw˥manb @5 cc!qPdՃ6FutҦs."٠JS?]>O *Z.r jx H(M7[ކq-5HƱqHu;ƸL@ h5[Gب) ټ;9=6ebjocccdB&5VfZ&,եOL̆(]+٠'^}>::F,|3 qTz5X=PRPwV9_`ɹE@KLj;pYb$jI+aJrb?1}+!xmЂC/Ul|ˮ^r}aOb!h>Ჶ~F黬+uM|ŧV:!1ت1IҥDU@ G'oѠ^[O&ƹAONx*D>5@Mۿ|kOV$YPK5v|!"EUaiz~j;r.c8, c_4 JlMk@ Uͣ^ә/y 4ԱѾg]UKOe !L&Kkz@'1 nB}pԘ4Ԝ_qEX 8` &Xc'.B4N΢&aŻ_QZmK{XdOLg{Ơx:[f_"`œPlMTɹΫx'/\p\95:UWl 2XSVKd#D/'[}eTlI"?irfEwEpw%2"/[Vcij4GO-BkxVZ$mQq~~q3<9^iaDX>fȺ\4M4F'#?~xFhy3k|4`źp)Sޭ\ۿ~zyqbSWbITD# NyCՊIEG]"ts{B( 5?×9HQpnn~qwI{mv9xshL4;EY 줷 QN  +&YBs=xֽ_69VaEk54alCl(FAIB7o?OEuLXrbY_%sh ZNj<ܼv>ܝ?|h< )H]{d:އz'}k_,ALZ )b"Ww "s DY;F,zGwn ^siVKEh46o\ߺd/mخKLV-˳v>㲤?}Z̑CXǻ~z8 }>+&\'LuHSl ]s|M6{z6*ZM$DHl DDb4TX`Ik&hC42>,&^H"tV+X;Nv*Z l$+"CFXPFDD^zgg3wl  JLa| \\=`gk'H-H&y1pSJPb,]b\+eL3>>h0 ٕbfBoyYo^(4}m~m}b#jǟ/nC 01 B˪""cT5C 7$NzaYh6%EA f/j $2/Yi'Д 0WєHDdcDl"}Nr׳o^Ii:ICD4yu &X$6Z O"!gq^Wmv֥lbс"&)-Qb $)& NGX sXT'"FDཧ-^)_N !dk c9A Cc@%5#"t>h#+8]a?cPsDV; M'b6_~q+mι#mLDh1 FDpl "$0LsU=fxb/UfhN:tE$TI| M?)֞y`를tH/r8f9 fx׆ 5qV!mKlh᫶ I'ё*pt9T\(|k!f#Qj6n]Y ƭ") qtnYSanD@ւDngjt:E43iZj09NN8 -Pf̔;m&,5NL̆(]+ɤ^YbpFPDq\g#m63 qTf^.>Hnck(sdscr 'jq/3Xr."BfΖ1Bd@#iݼRܵ8H#J`i>OaҠ BhI.>6J0𘫵|&e[ZqL"|-"H\ }"y/?ټr@lЂqoz<+8Wl|ˮ]NZrƧڊOFf!`Ȯ=cKEwಞ4 QTR8}t'`*C$IZUM7/_>4K6XeqnuSzS>IGB6ۦ;;^RNķ*Ibաt}۫kCDfҶ|cc}fK1fUwS4~mOn FѶ^pYfe_ES>0} W[ DhijĪUu6q*5P[gw>wkST"ۦ M;&͉ˤl]gs?2SkL@Ybb2դ>9J\ٱtEf>tVy˓v$έVʁ0FRx|n}6i4paPo ~~w|#iEEB>1jfn#f۪0|dY6K-ӣ.VŪ7M$MSy_?'H*"!F^^*bEA_7i"iQֿ[\ɻ^> "1($=^b&qr"K9!Y<\k|DUCε~ޱv^n=|tyKY$rV]1<𓞊j\2$!zaL>v,bM0?%N3V{6K.|vG$lmm=FDeac !m\fwPn]D=9J/o\}ax7nΝNU0c@+m۶mkz4l6.jOCP W~q>?~vyqbSWaITF# NyC՚IE>Ny5 'H"ZCDAŽ&^us,јhw6R3|&GI=7D914`~'d %N/-׋օo~kOf 6h6m91I|3VQ=N!@?#sCkxЍ綆 Mn||wݛ`<")HWd:?+| |ag61)SDD(wXGIUܛo뷎oڿ[vݲjZfGwaëWMqszEtyg\U13^Yk9cFt:xOf!˃[G޽ 7z>ENgr~q3,n_ln6l ^mH4I,׉ Q,";im[! Dnhǣqjm7zzus(d[-2ZHuH٠I -W5H1*D4ύxzfb4?~e$){k{~eق% v=]@>Ī: j`,ZUrո$7)IENDB`Gomoku-1.2.9/HumanRight.png0000644000076500007650000000570207547634403015066 0ustar nicolanicolaPNG  IHDR((/:gAMA a yIDATxW]\GV{W۷o۾kǙ$$OA3H<"$ ?7~x "3F(ĉ?d'vy?<ԩkMu"Z:Ԫ֪UxT5SUآ H1T.fݜm,~\ߎO/}&K.c0%h GI}]'YhUjf\R5L:8֭FNǓ,˲\,>4Sm H&sIFa`&{21F 14>La ~>C&-‹?ϥ+>vcLzQN D 2XD]nq3pY d3K5:ӂ_m?z1p$c !kGK,DdQ -6~^l;˃VvN( &1ӼxEa$Q&~qOfu  l2/!Rp1''~=O3DP1L ;oEfb2\`EmhjbBxξ~3q-NԒM,:B:%qA#J sE 7yzS% ,!23xiFg^aRl% pơ` h fDYE \.vT(Z9"Z+@1/K֯m^NKM@4V"jDA !B4WCg-vR-&?M]DAħPG/yb텷_͋MdMp1K.uAñ6Sa6iCb iz^.I~6a{RyɮB>G.-9aWqrY::F,|3 qTz5P=PRPvV9_`ɹE@KLj;pYb$jI+aJrb?1}+!xtVz˓v$.V ʁ0FR5R{|~}6ieL+ͻ_7""!gתς1iiv?{%(YRKsO|VbYD.t\ H b.Y+Fr/~7rH`lZogwWc Iث8ef9!Y<)]}DU͏kmWn<~rasY$rV]1<#MEX5.^GOo{qQq&}xNO Fߕ`D?vllYWb!iѬ=p YiuH'Gi˯=NiSaUg "#Jr1s4M-ѧգn PU5G/!{(֍[ݽ;'z''9u%)D5M4g,:XZԋY??ߵ@7( Y?~#k  p|0>w zf g=Dc_U09?~(oNzYq*&ʉ?y)pP$K(qxnq^g<޹uWMf mgc 7Ml=?sc?w''aQm]N @,k\T9րlhSAMn;O$krL__o_xom˛ ?9Ik9h21Xuɡv<'Vvw?7z7H5A)6I!劷)FY{,\X懏 `bSD76+NOF3[Pѵ$ GXURb@Pph IENDB`Gomoku-1.2.9/HumanTop.png0000644000076500007650000000567507547634403014564 0ustar nicolanicolaPNG  IHDR((/:gAMA a tIDATxW[GV>ɬKwOOwf$$HwC؆L, ,bw~A#7xw ^![.!y%2Tߪ2OZώ :|u6^#"UM)YkUu.\A-)`k3Jw8LM>>`%͑ML }8Դ YU` ZN5`]9U fR~e$L *<7*2^h۱ġ9h8Ihر5HdHU)Ȧrf">T{Gzy=a޽@}Po g}Ֆm+ͫZ$!@F ԓ؝X+bMx`+҅ګsZ(D[c\q{@{B 茣8bl,-XUU92~L|{٥kWGRt( :kQk\(ݧ3V_t@D^D3bDD)%"Zy dz o]jpKA6bH e!h=KNò $&ЌGJ)B$ ?\|w5gmĎт":JbSF"`tk 9omSJ 0!{O;ZyO] + K.ZA `E` hk] h ]dmD|9x+xƳ6$cJE"" 8BuPN*-|\W~?gئ M@25 !Bc̵PCjF/Ͷ3W?iեKmBJ3hirw (U&XlB ԄsFm qîb,Ɛl+.fy1pɒI)"I b<3ȱ, =-G)%"dzfvn!A26{8Na`eMF0N&fXХ<0f&ej0"qwyJdrMg#5QS3=+}rot%4S zE>Ozj'GǜTkѩ5r-BLL4k:e1 L=C%.)EN.$ PdܐkLabˋD&zh$W2r{Cg] ,!Bg/y $ **@Y7zf`WKDSD۪&'1+u[1QD҉!J X_3+tg?+sr;tVD 5-2b5f@aw1^`o޸ֻS6K%%w|TkO ZUuG -S2֞LzJPwjR(D6 @ظ@sڍݭ3|C-H11ZPP(mLWV?z&>>9S_csb 4-KgIg1x2{'6x÷I@DbXn4:38v \k/|yo7F1Mu}n16Ah*tml۝%s ptsֺ+U0c@JQO8Wm۶mΟǏ'_OV.nѹ֗j^B\6d n=鵛;ϮV cfDԴɈqx`(iZǶjfx8:썿6_k#]] F'rLQ$0" 6xbzT՟zrrKC@BD4&5?Ab_`{;WX9W ?{5Ġ.w(^,ݵ y7 wc6mSG)B{/>|7~t` 8dO(hE6`h):ҹQCţGwOCli wxZ/S;+|}TY%יA "x آ({Ӄq5/Mwv{ww.Nqv4tG+NGj>94%5 UA4%k!#-ۼĆHӾֹZRl|`k@0M/J[C(+'juǹ$FZki94{?_zczJλԒM,:B:%qE#J ҹ"D7yrS% ,!23xFqOʗ*)vHsZwN8X0uI ڈj.Nm8X* V$PL+W7{o~mv)"#h"DԈA@ CAi' /]離;lUjաˌ."٠JSh,H[/ŦC&8֘}AgÙ?6Smam6{{6jCb i[b3[I~)f/S4yɮB>kOAEEq+KGX]o0%,qֵn086n4``wϛu3!"$r;-Nw;sCYD3&.ТI eLܖhYR?t^l<%QNzՑ%)`9Lu6b[!xk-a3G sԬ+E' u,u elnLntY-neKED(Z̐`Ҙr F {h$wRJt$X ?UTU DTm4I%'F pOn˜]::Wivlbvr՚3>KV|:R5,!FGv9[Z]6x,ii_|"3=[U"&IԚjpw,EHZc*glqgT} hm0s'_l)S}ϺVO,BLmXz?L:ۣu\_Z0D6mhm1iN\&-{>qEX 8` 6Ycͮg.B4N&΢&у7?/ĕKXdÏL ~yn7·ժW9fhUV܋ӯS&@6.aoo}vo7H3]קFmT]4ܶ,f~zrzp_3֪gM@Yx_?H*"!F^^*yZ3.q|(iƦEQX^qi`~Ww,>Ơx-3dxzChF6w&j~]r:k+{W\2'FgꊌᩇTU% f2ֿelO.sto޼wEFГ`D+1B۶hڌ5p %)I$ѓfWzk0얝l{{S:V%zz o183m۶?xPz3lc$JR`BMëݭKyo8K$ظU:c\& 4Κvϭl7"lTZt?9m"4qQ-5 ]'x'ȄMj(3̴.7M" Yc~XK;+ gQ5W4AO5d}9AuuƁsXl70o%har'FrCmKC#V[|9%""-afH0Mlk F {%w)%_* *"*@6ϸZ˧_7]:gڛWh˶ٵˁV{Z"ɓe@a4:xQۿ`޼qw]֕&J 's_~3+le$kI6G{V~8:)C)WLGB֞`ӶIsܼv`i%QIx ^]c'"2;PPgg6$ho G f˜eb7>KhVOn FѦsYfeX IZ̓/x 4ԉѾg]UKg2&qKkz􌭲7@1 nB}xxԘ4Ԝ[7ޜqEX 8` &Zcͮ.B4N&΢&j?/ĵږ̧ߛL{o,%oKUr "̬ѪT2?~_Mln8߯گ|y׍H3f&BK,jLn Je@`R/=zbk_~8Vfu@^x_=*$@T#//UQļ`Eq8e4UEcӢ(k7|?}@DcPHz^-3o 0ɧPlMT'ȹΪx;w._2'Fgꊍyh*ªql}=?lrߛϲs6ID'9sسYp}0n]FDcƖ}%BhFM{?l^V!D!zrv]ߺV;[NU0c@+M4McttǏOبl\d[/@U͏_MCP W{ww{g{g99u "jh$ O=Xt(qa⦬Z{<ߵ@7( Y?{#k  p|TVzrxNkc@ԞC`DcHUPv?z۳eo=79 0?WUM'{E{x;~}Fy4l8kibنQwoч??#j\Xr61+ 1:05Ԕ?zT޾qˏ>ޛ<~d< )H]/dV}_ | |ms=lbҚC.OsFbT ba5:MEhڻoo=ww~kgV{id1f՝+ʦdn<?|wus d[)Z|`:mNۑh$Ak[xkbTh aA9u7rhv$0 JBش}09&MmAEz!abUKmj`,JU ̸`=IENDB`Gomoku-1.2.9/Hungarian.lproj/0000755000076500007650000000000010041163714015330 5ustar nicolanicolaGomoku-1.2.9/Hungarian.lproj/Localizable.strings0000644000076500007650000000215110032277044021165 0ustar nicolanicola/* - * - * * Hungarian translation by Varga Pter * - * - */ /* main.m */ "Info" = "Inf"; "Info Panel..." = "Inf Ablak..."; "Set Difficulty Level..." = "Nehzsgi Szint..."; "Help..." = "Segtsg..."; "Game" = "Jtk"; "New Game" = "j Jtk"; "Miniaturize" = "Lekicsinyt"; "Close" = "Bezr"; "Windows" = "Ablakok"; "Arrange" = "Elrendez"; "Hide" = "Elrejt"; "Quit" = "Kilp"; /* Board.m */ "Quits" = "Kilp"; "Game Over" = "Game Over"; "Great! You win!" = "J volt! Nyertl!"; "Sorry, you loose." = "Bocs de ezt jl elvesztetted."; "Internal Error: unknown difficultyLevel" = "Internal Error: unknown difficultyLevel"; "OK" = "OK"; /* Controller.m */ "Level 0 (Trivial)" = "0-s szint (Hipsz-hopsz)"; "Level 1 (Beginner)" = "1-es szint (Kezd)"; "Level 2 (Easy)" = "2-es szint (Knny)"; "Level 3 (Medium)" = "3-as szint (Kzepes)"; "Level 4 (Advanced)" = "4-es szint (Halad)"; "Level 5 (Difficult)" = "5-s szint (Nehz)"; "Choose Difficulty Level:" = "Vlassz nehzsgi szintet:"; "Difficulty level Panel" = "Nehzsgi-szint Ablak"; "Gomoku Game"= "Gomoku Jtk"; Gomoku-1.2.9/INSTALL0000644000076500007650000000261410571062051013323 0ustar nicolanicolaThis file documents building (and optionally installing) Gomoku.app on GNUstep. REQUIREMENTS ============ First, make sure you have GNUstep installed. You need at least: gnustep-make gnustep-base gnustep-gui gnustep-back (there are different backends available, make sure you have one of them) installed on your system, with the corresponding development headers. COMPILING ========= Once you have these things, to compile simply type: make That should compile the program and put it into a directory called 'Gomoku.app'. The standard way of starting the program is then: openapp ./Gomoku.app INSTALLING ========== Type: make install to install the program. Once installed, you should be able to run it using openapp Gomoku.app TROUBLESHOOTING =============== If the program doesn't seem to compile, double-check your gnustep installation. If all seems OK, it may be that you have gnustep, but it's not setup properly. Please refer to the gnustep configuration documentation for help. If you don't want to bother, a quick way of fixing the problem should be to source the GNUstep configuration script. The script is called 'GNUstep.sh'. Find the script on your system (on GNU/Linux normally it's in /usr/GNUstep/System/Library/Makefiles/GNUstep.sh or in /usr/share/GNUstep/Makefiles/GNUstep.sh), then source it: . /usr/GNUstep/System/Makefiles/GNUstep.sh Then, try 'make' again. Gomoku-1.2.9/INSTALL.OSX0000644000076500007650000000300111142554725013773 0ustar nicolanicolaThis file explains how to compile Gomoku.app on Apple Mac OS X. REQUIREMENTS ============ You need gnustep-make to compile Gomoku.app. Please get a recent stable release of gnustep-make from http://www.gnustep.org. Download the gnustep-make source code. Start up a unix terminal window. Go in gnustep-make's directory. Type ./configure --prefix=/Users/xxx/GNUstep --with-config-file=/Users/xxx/GNUstep/GNUstep.conf --with-layout=gnustep (replace '/Users/xxx' with your own user directory, eg /Users/nicola is my case) this will install gnustep-make into /Users/xxx/GNUstep, which makes it really easy to remove it if you want to uninstall it later. Then, type make and then type make install gnustep-make will be installed into /Users/xxx/GNUstep. Whenever you want to remove your gnustep-make installation, just remove that directory. To set up your gnustep-make environment ready for compilation, you need to type . /Users/xxx/GNUstep/System/Makefiles/GNUstep.sh in your terminal window. Now you are ready to use gnustep-make in that terminal window to compile Gomoku.app. Please note that every time you open up a new terminal window, you need to type this command again. COMPILING ========= Once you have these things, to compile simply type: make That should compile the program and put it into a directory called 'Gomoku.app'. To start the application, double-click on the 'Gomoku.app' folder in your Finder. INSTALLING ========== To install, just copy your Gomoku.app folder wherever you like. Gomoku-1.2.9/Italian.lproj/0000755000076500007650000000000007547634403015014 5ustar nicolanicolaGomoku-1.2.9/Italian.lproj/Localizable.strings0000644000076500007650000000210707547634403020650 0ustar nicolanicola/* main.m */ "Info" = "Info"; "Info Panel..." = "Panello Informazioni..."; "Set Difficulty Level..." = "Scegli Livello di Difficolt..."; "Help..." = "Aiuto..."; "Game" = "Gioco"; "New Game" = "Nuova Partita"; "Miniaturize" = "Miniaturizza"; "Close" = "Chiudi"; "Windows" = "Finestre"; "Arrange" = "Redisponi"; "Hide" = "Nascondi"; "Quit" = "Esci"; /* Board.m */ "Quits" = "Patta"; "Game Over" = "Fine Partita"; "Great! You win!" = "Grande! Hai vinto!"; "Sorry, you loose." = "Mi spiace, hai perso."; "Internal Error: unknown difficultyLevel" = "Errore Interno: livello di difficolt sconosciuto"; "OK" = "OK"; /* Controller.m */ "Level 0 (Trivial)" = "Livello 0 (Banale)"; "Level 1 (Beginner)" = "Livello 1 (Principiante)"; "Level 2 (Easy)" = "Livello 2 (Facile)"; "Level 3 (Medium)" = "Livello 3 (Medio)"; "Level 4 (Advanced)" = "Livello 4 (Avanzato)"; "Level 5 (Difficult)" = "Livello 5 (Difficile)"; "Choose Difficulty Level:" = "Scegli il Livello di Difficolt"; "Difficulty level Panel" = "Pannello Livello di Difficolt"; "Gomoku Game"= "Gioco del Gomoku";Gomoku-1.2.9/main.m0000644000076500007650000001332711142566306013406 0ustar nicolanicola/* * main.m: main function of Gomoku.app * * Copyright (c) 2000 Nicola Pero * * Author: Nicola Pero * Date: April 2000 * * 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. */ #include "Controller.h" /* Hack needed to create the menu from code on Apple. */ #ifndef GNUSTEP @interface NSApplication (AppleMenu) - (void) setAppleMenu: (NSMenu *)menu; @end #endif int main (int argc, char **argv) { NSAutoreleasePool *pool; NSApplication *app; NSMenu *mainMenu; NSMenu *menu; NSMenuItem *menuItem; Controller *controller; int cnt; pool = [NSAutoreleasePool new]; app = [NSApplication sharedApplication]; [app setApplicationIconImage: [NSImage imageNamed: @"Gomoku"]]; // // Create the Menu // #ifdef GNUSTEP // Main Menu mainMenu = AUTORELEASE ([[NSMenu alloc] initWithTitle: @"Gomoku"]); // Info SubMenu menuItem = [mainMenu addItemWithTitle: _(@"Info") action: NULL keyEquivalent: @""]; menu = AUTORELEASE ([[NSMenu alloc] initWithTitle: _(@"Info")]); [mainMenu setSubmenu: menu forItem: menuItem]; [menu addItemWithTitle: _(@"Info Panel...") action: @selector (orderFrontStandardInfoPanel:) keyEquivalent: @""]; [menu addItemWithTitle: _(@"Set Difficulty Level...") action: @selector (runDifficultyLevelPanel:) keyEquivalent: @""]; [menu addItemWithTitle: _(@"Help...") action: @selector (orderFrontHelpPanel:) keyEquivalent: @"?"]; // Game Submenu menuItem = [mainMenu addItemWithTitle: _(@"Game") action: NULL keyEquivalent: @""]; menu = AUTORELEASE ([[NSMenu alloc] initWithTitle: _(@"Game")]); [mainMenu setSubmenu: menu forItem: menuItem]; [menu addItemWithTitle: _(@"New Game") action: @selector (newGame:) keyEquivalent: @"n"]; [menu addItemWithTitle: _(@"Miniaturize") action: @selector(performMiniaturize:) keyEquivalent: @"m"]; [menu addItemWithTitle: _(@"Close") action: @selector(performClose:) keyEquivalent: @"w"]; // Windows SubMenu menuItem = [mainMenu addItemWithTitle: _(@"Windows") action: NULL keyEquivalent:@""]; menu = AUTORELEASE ([[NSMenu alloc] initWithTitle: _(@"Windows")]); [mainMenu setSubmenu: menu forItem: menuItem]; [menu addItemWithTitle: _(@"Arrange") action: @selector(arrangeInFront:) keyEquivalent: @""]; [menu addItemWithTitle: _(@"Miniaturize") action: @selector(performMiniaturize:) keyEquivalent: @"m"]; [menu addItemWithTitle: _(@"Close") action: @selector(performClose:) keyEquivalent: @"w"]; // FIXME: Shouldn't we be setting this as the 'Windows' submenu ? // Hide MenuItem [mainMenu addItemWithTitle: _(@"Hide") action: @selector (hide:) keyEquivalent: @"h"]; // Quit MenuItem [mainMenu addItemWithTitle: _(@"Quit") action: @selector (terminate:) keyEquivalent: @"q"]; [app setMainMenu: mainMenu]; #else { // Main Menu mainMenu = AUTORELEASE ([[NSMenu alloc] initWithTitle: @"Gomoku"]); // Apple Menu menu = AUTORELEASE ([[NSMenu alloc] initWithTitle: _(@"Gomoku")]); [menu addItemWithTitle: _(@"About Gomoku...") action: @selector (orderFrontStandardAboutPanel:) keyEquivalent: @""]; [menu addItem: [NSMenuItem separatorItem]]; [menu addItemWithTitle: _(@"Preferences...") action: @selector (runDifficultyLevelPanel:) keyEquivalent: @""]; [menu addItem: [NSMenuItem separatorItem]]; // Hide MenuItem [menu addItemWithTitle: _(@"Hide") action: @selector (hide:) keyEquivalent: @"h"]; [menu addItem: [NSMenuItem separatorItem]]; // Quit MenuItem [menu addItemWithTitle: _(@"Quit") action: @selector (terminate:) keyEquivalent: @"q"]; [app setAppleMenu: menu]; menuItem = [mainMenu addItemWithTitle: _(@"Gomoku") action: NULL keyEquivalent: @""]; [mainMenu setSubmenu: menu forItem: menuItem]; // Game Submenu menu = AUTORELEASE ([[NSMenu alloc] initWithTitle: _(@"Game")]); [menu addItemWithTitle: _(@"New Game") action: @selector (newGame:) keyEquivalent: @"n"]; [menu addItemWithTitle: _(@"Close") action: @selector(performClose:) keyEquivalent: @"w"]; menuItem = [mainMenu addItemWithTitle: _(@"Game") action: NULL keyEquivalent: @""]; [mainMenu setSubmenu: menu forItem: menuItem]; // Windows SubMenu menu = AUTORELEASE ([[NSMenu alloc] initWithTitle: _(@"Windows")]); [menu addItemWithTitle: _(@"Miniaturize") action: @selector(performMiniaturize:) keyEquivalent: @"m"]; [menu addItemWithTitle: _(@"Arrange") action: @selector(arrangeInFront:) keyEquivalent: @""]; [menu addItemWithTitle: _(@"Close") action: @selector(performClose:) keyEquivalent: @"w"]; [app setWindowsMenu: menu]; menuItem = [mainMenu addItemWithTitle: _(@"Windows") action: NULL keyEquivalent:@""]; [mainMenu setSubmenu: menu forItem: menuItem]; [app setMainMenu: mainMenu]; } #endif if (argc <= 1 || (cnt = atoi(argv[1])) < 8) { cnt = 8; } controller = [Controller new: cnt]; [app setDelegate: controller]; [app run]; RELEASE (controller); RELEASE (pool); return 0; } Gomoku-1.2.9/Norwegian.lproj/0000755000076500007650000000000010041163765015353 5ustar nicolanicolaGomoku-1.2.9/Norwegian.lproj/Localizable.strings0000644000076500007650000000200610041163735021202 0ustar nicolanicola/* main.m */ "Info" = "Informasjon"; "Info Panel..." = "Informasjonspanel..."; "Set Difficulty Level..." = "Sett vansklighetsgrad..."; "Help..." = "Hjelp..."; "Game" = "Spill"; "New Game" = "Nytt spill"; "Miniaturize" = "Minimer"; "Close" = "Lukk"; "Windows" = "Vinduer"; "Arrange" = "Arrangere"; "Hide" = "Skjul"; "Quit" = "Lukk"; /* Board.m */ "Quits" = "Lukker"; "Game Over" = "Spillet er slutt"; "Great! You win!" = "Kjempebra! Du vant!"; "Sorry, you looseVansklighetsgradpanel."; "Internal Error: unknown difficultyLevel" = "Internal Error: unknown difficultyLevel"; "OK" = "OK"; /* Controller.m */ "Level 0 (Trivial)" = "Level 0 (Trivial)"; "Level 1 (Beginner)" = "Level 1 (Beginner)"; "Level 2 (Easy)" = "Level 2 (Easy)"; "Level 3 (Medium)" = "Level 3 (Medium)"; "Level 4 (Advanced)" = "Level 4 (Advanced)"; "Level 5 (Difficult)" = "Level 5 (Difficult)"; "Choose Difficulty Level:" = "Velg vansklighetsgrad:"; "Difficulty level Panel" = "Vansklighetsgradpanel"; "Gomoku Game"= "Gomoku Game"; Gomoku-1.2.9/README0000644000076500007650000000506110571071232013152 0ustar nicolanicolaWelcome to Gomoku.app ! WHAT IS IT ========== Gomoku.app is an extended TicTacToe game for GNUstep. You win the game if you are able to put 5 of your pieces in a row, column or diagonal. You lose if the computer does it before you. Most of the development effort was concentrated on the artificial intelligence engine used by the computer while playing. Unlike most other engines, this engine is not designed to play very well, but rather to give you fun when you play against it. COPYING ======= This program is free sofware, released under GNU GPL 2.0. COMPILING ========= Please check the 'INSTALL' file to build the game on GNUstep, and the 'INSTALL.OSX' file to build the game on Apple/Mac OS X. RUNNING THE PROGRAM IN ANOTHER LANGUAGE ======================================= The program has been translated into the following languages: English Italian (by Nicola Pero ) French (by Emmanuel Maillard ) Swedish (by Erik Dalen ) Spanish (by Rodrigo Sancho Senosiain ) German (by Matthias Zoellner ) Traditional Chinese (by Yen-Ju Chen ) Hungarian (by Varga Peter ) Norwegian (by Per Christian Gaustad ) Under GNUstep, to run Gomoku.app in your preferite language, for example Italian, set your GNUstep preferences to use that language by giving the following command at the shell prompt: defaults write NSGlobalDomain NSLanguages "(Italian)" To translate it into another language, just take the English.lproj/Localizable.strings, translate each string into your language (look at Italian.lproj/Localizable.strings for an example), put everything into a new YourLanguage.lproj/Localizable.strings. Add your language to the GNUmakefile. Ah - and don't forget to send the result of your work to nicola.pero@meta-innovation.com so it can be included in the next release ! BOARDS OF DIFFERENT SIZES ========================= If you get bored with the standard board, you can play the game on boards of different size; the default size is 8 but 10 is also nice to play. Pass the size of the board as argument of Gomoku.app. For example, to play on a 10x10 board, you can start Gomoku with: openapp ./Gomoku.app 10 Warning: board size must be >= 8. BUGS ==== Please mail them to HOMEPAGE ======== http://www.gnustep.it/nicola/Applications/Gomoku/ THANKS ====== To David Relson , for providing support for boards of arbitrary sizes. Gomoku-1.2.9/Spanish.lproj/0000755000076500007650000000000007547634403015040 5ustar nicolanicolaGomoku-1.2.9/Spanish.lproj/Localizable.strings0000644000076500007650000000210607547634403020673 0ustar nicolanicola/* main.m */ "Info" = "Informacin"; "Info Panel..." = "Panel de Informacin..."; "Set Difficulty Level..." = "Elegir nivel de dificultad..."; "Help..." = "Ayuda..."; "Game" = "Juego"; "New Game" = "Nueva partida"; "Miniaturize" = "Miniaturizar"; "Close" = "Cerrar"; "Windows" = "Ventanas"; "Arrange" = "Ordenar"; "Hide" = "Ocultar"; "Quit" = "Salir"; /* Board.m */ "Quits" = "Empate"; "Game Over" = "Fin del juego"; "Great! You win!" = "Bien! Ha ganado!"; "Sorry, you loose." = "Lo siento, ha perdido."; "Internal Error: unknown difficultyLevel" = "Error interno: Nivel de dificultad desconocido"; "OK" = "Aceptar"; /* Controller.m */ "Level 0 (Trivial)" = "Nivel 0 (Trivial)"; "Level 1 (Beginner)" = "Nivel 1 (Principiante)"; "Level 2 (Easy)" = "Nivel 2 (Fcil)"; "Level 3 (Medium)" = "Nivel 3 (Medio)"; "Level 4 (Advanced)" = "Nivel 4 (Avanzado)"; "Level 5 (Difficult)" = "Nivel 5 (Difcil)"; "Choose Difficulty Level:" = "Elija nivel de dificultad"; "Difficulty level Panel" = "Panel de nivel de dificultad"; "Gomoku Game"= "Juego del Gomoku"; Gomoku-1.2.9/Swedish.lproj/0000755000076500007650000000000007547634403015041 5ustar nicolanicolaGomoku-1.2.9/Swedish.lproj/Localizable.strings0000644000076500007650000000176107547634403020702 0ustar nicolanicola/* main.m */ "Info" = "Info"; "Info Panel..." = "Imformations Panel..."; "Set Difficulty Level..." = "Stt Svrighetsgrad..."; "Help..." = "Hjlp..."; "Game" = "Spel"; "New Game" = "Nytt Parti"; "Miniaturize" = "Miniatyrisera"; "Close" = "Stng"; "Windows" = "Fnster"; "Arrange" = "Sida vid Sida"; "Hide" = "Gm"; "Quit" = "Stng"; /* Board.m */ "Quits" = "Oavgjort"; "Game Over" = "Spelet slut"; "Great! You win!" = "Utmrkt! Du vann!"; "Sorry, you loose." = "Ledsen, men du frlorade."; "Internal Error: unknown difficultyLevel" = "Internt fel: oknd svrighetsgrad"; "OK" = "OK"; /* Controller.m */ "Level 0 (Trivial)" = "Niv 0 (Trivial)"; "Level 1 (Beginner)" = "Niv 1 (Nybrjare)"; "Level 2 (Easy)" = "Niv 2 (Ltt)"; "Level 3 (Medium)" = "Niv 3 (Medel)"; "Level 4 (Advanced)" = "Niv 4 (Avancerad)"; "Level 5 (Difficult)" = "Niv 5 (Svr)"; "Choose Difficulty Level:" = "Vlj Svrighetsgrad"; "Difficulty level Panel" = "Svrighetsgrad"; "Gomoku Game"= "Gomoku Spel"; Gomoku-1.2.9/TODO0000644000076500007650000000023107547634403012772 0ustar nicolanicola* Allow the user to change the board size while the application is running; * Provide some winning tile icons (the code already support this); * etc. Gomoku-1.2.9/TraditionalChinese.lproj/0000755000076500007650000000000007547634602017205 5ustar nicolanicolaGomoku-1.2.9/TraditionalChinese.lproj/Localizable.strings0000644000076500007650000000161407547634602023043 0ustar nicolanicola/* main.m */ "Info" = ""; "Info Panel..." = "..."; "Set Difficulty Level..." = "]w..."; "Help..." = "DU..."; "Game" = "C"; "New Game" = "sC"; "Miniaturize" = "̤p"; "Close" = ""; "Windows" = ""; "Arrange" = "z"; "Hide" = ""; "Quit" = "}"; /* Board.m */ "Quits" = "}"; "Game Over" = "C"; "Great! You win!" = "! AĹF."; "Sorry, you loose." = "ܩp, AF."; "Internal Error: unknown difficultyLevel" = "~, "; "OK" = "Tw"; /* Controller.m */ "Level 0 (Trivial)" = " 0 (e)"; "Level 1 (Beginner)" = " 1 (J)"; "Level 2 (Easy)" = " 2 ()"; "Level 3 (Medium)" = " 3 ()"; "Level 4 (Advanced)" = " 4 ()"; "Level 5 (Difficult)" = " 5 ()"; "Choose Difficulty Level:" = ":"; "Difficulty level Panel" = "׭"; "Gomoku Game"= "lѹC"; Gomoku-1.2.9/TraditionalChinese.lproj/README0000644000076500007650000000007007547634602020062 0ustar nicolanicolaThe Localizable.strings file is in NSBIG5StringEncoding.