## Help for the Game of Mono

Welcome to the network Mono server. The challenge command is described here. Other commands are the same as for all pbmserv games.

mono challenge [-size=number] [-no_auto] [-take_min] [-take_max] userid1 userid2 [userid3 [userid4]]

starts a new game for two to four players.

The -size parameter sets the number of regions (default is 9).
The -no_auto parameter means that random moves are not automatically made.
The -take_min parameter means that the lowest opponent value is taken on each move (three or four players only).
The -take_max parameter means that the highest opponent value is taken on each move (three or four players only).

### Introduction

Mono is a puzzle game for two to four players. Players try to work out the positions of their opponent's regions, and score points by locating sequences of cells with non-decreasing values.

### Rules

Start: Each player has a 5x11 square grid, hidden from opponents, which they split up into nine regions. Region 1 has one cell of value 1, region 2 has two cells of value 2, region 3 has three cells of value 3, and so on. The following example shows a game about to start, from fred's perspective.

`      a b c d e f g h i       a b c d e f g h i   5   6 6 6 6 9 9 7 7 7   5   . . . . . . . . .   5  4   6 6 4 9 9 9 7 8 7   4   . . . . . . . . .   4  3   3 4 4 9 9 9 7 8 7   3   . . . . . . . . .   3  2   3 4 2 9 5 5 8 8 8   2   . . . . . . . . .   2  1   3 1 2 5 5 5 8 8 8   1   . . . . . . . . .   1       a b c d e f g h i       a b c d e f g h i           fred = 0                 ned = 0`

Play: Each turn the current player specifies a number of unvisited positions on the opponent's board, keeping a list of the opponent's values at each position. The turn continues until the player uncovers a value that is lower than the previous value in the list.

For example, the player might discover the values {2, 3, 5, 5, 5, 5, 7, 7, 8, 3} on their turn; the 3 ends the turn.

Score: The player's score for the turn is the sum of run lengths (squared) for non-decreasing values within the list.

So for the values {2, 3, 5, 5, 5, 5, 7, 7, 8, 3} the run lengths are 1, 1, 4, 2, 1 and the score is 1*1 + 1*1 + 4*4 + 2*2 + 1*1 = 23 points.

Aim: The game finishes at the end of the round in which any player has all of their values uncovered. The player with the highest score wins (tied game if equal).

### Notes

Consecutive positions in a move do not need to be connected or adjacent.

The game finishes at the end of the final round so that all players get an equal number of moves. This avoids a potential first move advantage.

Hexadecimal characters are used for games above size 9, so the sequence of region labels is 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e...

Players can enter as many moves as they like each turn. If all moves are made without discovering a decreasing value, then the server will continue to make random moves on the player's behalf until a decreasing value is found (unless the -no_auto option is used). This speeds the game along and mimics how an actual player would approach the game.

Use "end" to end a move if you don't want the server to automatically continue making random moves on your behalf, for instance if you want to keep key areas pristine and free from random hits with the intention of saving them for longer runs later.

Random moves are useful for opening up new board areas but will rarely score well, as higher-valued cells greatly outnumber lower-valued ones hence random move values tend to escalate quickly. It is better to puzzle out likely cell values based on the available information and make as many non-random moves per turn as possible.

Finding all cells belonging to a region on the one turn will optimise your score for that region. However, care must be taken as moving out of a region then back into it will end the turn, one way or the other.

The size and dimensions of the board required for r regions are given by:
num_cells = r (r + 1) / 2
height = floor[(r + 1) / 2]
width = num_cells / height

Die-hard puzzlers can devise their own region layouts and manually specify them on their first move. This requires some care, and a good procedure is to jot down the region layouts on paper then enter the values as you read them left-to-right and top-to-bottom.

However, it's much easier to just get the server to place the regions randomly on the first move. The following algorithm is used:
generate a list of regions to be placed (1..r)
shuffle the list
while (board not full)
{
find the smallest remaining gap on the board
find a combination of unused regions whose combined sizes
equal the gap size (if none, then start again)
randomly place a member of this combination within this gap
}

### Multiplayer Version

Multiplayer Mono is similar to the two-player game except that the same positions are uncovered on all opponents' boards for each move, possibly giving a choice of more than one value per coordinate.

By default, the choice that is best for the player's current list is used; this will be the lowest value that is not lower than the last value in the list. Alternatively, if the -take_min option is used then the lowest opponent value is always chosen, or if the -take_max option is used then the highest opponent value is always chosen (much harder).

### Syntax

The move syntax is:

mono move board# userid password random
- Place regions randomly (first move) or select random positions to uncover.

mono move board# userid password 666699777664999787...
- Place regions manually (first move only). Values are placed on the board in reading order, left-to-right and top-to-bottom. The number of values must be exactly the number of board positions (45 for the standard nine-region game).

mono move board# userid password a3
- Uncover the opponent's value(s) at a3.

mono move board# userid password a3,f2,g1,random
- Uncover the opponent's values at a3, f2 and g1, then continue to make random moves.

mono move board# userid password a1,a2,a3,end
- Uncover the opponent's values at a1, a2 and a3 then end the move (no random moves).

Note: It is not necessary to specify "random" at the end of every move. Random moves will automatically be made unless the -no_auto option is used. Random moves will be made until a decreasing value is encountered. Random moves are marked in the move list with an asterisk '*'. Use "end" to end a move without going on to make automatic random moves.

### History

Mono rules copyright (c) Cameron Browne, April 2007.

The name "Mono" refers to the fact that each scoring move is a list of monotonically increasing values. The complete rules took less than 30 minutes to devise.

Implementation and Help file by Cameron Browne, April 2007.