Support saving/loading games (any game type) in XML format.

Status:
It works well, but there are still a few details to improve/fix

More details about the changes:
 - New dependency on Arabica and Libxml2 to parse the XML
 - Loading the old format is still supported for this release, but won't be supported anymore in the next one
 - Games are now only saved in the new format
 - In training mode, the player is now created externally, like in the other modes
 - Avoid using GameIO (the one from game/) whenever possible
 - Do not use a FILE* argument anymore when loading a game
 - Throw and catch exceptions correctly when a game cannot be loaded or saved
 - The non-regression tests now use a new method to print the game history
This commit is contained in:
Olivier Teulière 2009-11-29 16:01:31 +00:00
parent eb22343932
commit 3c7a84d543
106 changed files with 2256 additions and 1734 deletions

8
TODO
View file

@ -2,10 +2,6 @@ TODO
====
- Improve error handling (use exceptions more)
- Correct game save/load functions: Advanced format
file saving for freegames and duplicate need a serious
rewrite. We need to specify a file format that can handle
all the information contained in a multiplayer game.
- getopt support for all the interfaces (only ncurses is done)?
- detection of blocked positions?
- distinguish misplaced and incorrect words?
@ -13,10 +9,10 @@ TODO
Requested by users
==================
- Save/load games (03/02/09)
- Drag & drop? (03/02/09)
- Continue a real game on Eliot (03/02/09)
- In duplicate mode, display the rack in the External board (19/02/09)
- Tiles on the rack more similar to the ones on the board (http://www.prise2tete.fr/forum/viewtopic.php?id=4956)
Implementation details
======================
@ -25,8 +21,6 @@ Implementation details
- board.h included in coord.cpp!
- use Boost.Format?
- compile with -ansi -pedantic by default?
- use Boost.Unorderedinstead of the custom hash map, when Boost 1.36
is in Ubuntu
Not so urgent
=============

View file

@ -113,6 +113,13 @@ PKG_CHECK_MODULES(LIBCONFIG, [libconfig++],
AC_DEFINE(HAVE_LIBCONFIG, 1, [Define to 1 if you have the libconfig library])],
[has_libconfig=0])
dnl Check for arabica and libxml2
PKG_CHECK_MODULES(ARABICA, [arabica], [],
[AC_MSG_ERROR([Could not find Arabica on your system (using pkg-config)])])
PKG_CHECK_MODULES(LIBXML2, [libxml-2.0], [],
[AC_MSG_ERROR([Could not find libxml2 on your system (using pkg-config)])])
dnl Check for ncurses
dnl We enable it if asked by the user, or if ncursesw is found
AC_ARG_ENABLE([ncurses],AC_HELP_STRING([--enable-ncurses],

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _DIC_AUTOMATON_H_
#define _DIC_AUTOMATON_H_
#ifndef DIC_AUTOMATON_H_
#define DIC_AUTOMATON_H_
class AutomatonHelper;
struct searchRegExpLists;

View file

@ -19,9 +19,10 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _DIC_H_
#define _DIC_H_
#ifndef DIC_H_
#define DIC_H_
#include <stdint.h>
#include <string>
#include <vector>
#include <map>

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _DIC_EXCEPTION_H_
#define _DIC_EXCEPTION_H_
#ifndef DIC_EXCEPTION_H_
#define DIC_EXCEPTION_H_
#include <exception>
#include <string>

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _DIC_INTERNALS_H_
#define _DIC_INTERNALS_H_
#ifndef DIC_INTERNALS_H_
#define DIC_INTERNALS_H_
#include <stdint.h>
#include "config.h"

View file

@ -223,10 +223,12 @@ string truncAndConvert(const wstring &iWstr, unsigned int iMaxWidth)
if (n == -1)
{
ostringstream ss;
ss << "truncAndConvert: non printable character: " << iWstr[pos];
// XXX: Should we throw an exception instead? Just ignore the problem?
#if 0
ss << "truncAndConvert: non printable character: " << iWstr[pos];
cerr << ss.str() << endl;;
//throw DicException(ss.str());
#endif
return convertToMb(iWstr);
}
if (width + n > iMaxWidth)
@ -249,10 +251,12 @@ string truncOrPad(const string &iStr, unsigned int iWidth, char iChar)
if (n == -1)
{
ostringstream ss;
ss << "truncAndConvert: non printable character: " << wstr[pos];
// XXX: Should we throw an exception instead? Just ignore the problem?
#if 0
ss << "truncAndConvert: non printable character: " << wstr[pos];
cerr << ss.str() << endl;;
//throw DicException(ss.str());
#endif
return convertToMb(wstr);
}
if (width + n > iWidth)
@ -277,10 +281,12 @@ string padAndConvert(const wstring &iWstr, unsigned int iLength,
if (n == -1)
{
ostringstream ss;
ss << "padAndConvert: non printable character: " << iWstr[i];
// XXX: Should we throw an exception instead? Just ignore the problem?
#if 0
ss << "padAndConvert: non printable character: " << iWstr[i];
cerr << ss.str() << endl;;
//throw DicException(ss.str());
#endif
return convertToMb(iWstr);
}
width += n;
@ -309,10 +315,12 @@ string centerAndConvert(const wstring &iWstr, unsigned int iLength, char c)
if (n == -1)
{
ostringstream ss;
ss << "padAndConvert: non printable character: " << iWstr[i];
// XXX: Should we throw an exception instead? Just ignore the problem?
#if 0
ss << "padAndConvert: non printable character: " << iWstr[i];
cerr << ss.str() << endl;;
//throw DicException(ss.str());
#endif
return convertToMb(iWstr);
}
width += n;
@ -441,3 +449,27 @@ unsigned int writeInUTF8(const wstring &iWString, char *oBuffer,
#endif
}
string writeInUTF8(const wstring &iWString, const string &iContext)
{
// Temporary buffer for output
// Each character will take at most 4 bytes in the UTF-8 string
unsigned int bufSize = iWString.size() * 4;
char *buf = new char[bufSize];
unsigned int number;
try
{
number = writeInUTF8(iWString, buf, bufSize, iContext);
}
catch (...)
{
// Make sure not to leak
delete[] buf;
throw;
}
// Copy the string
string res(buf, number);
delete[] buf;
return res;
}

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _ENCODING_H_
#define _ENCODING_H_
#ifndef ENCODING_H_
#define ENCODING_H_
#include <string>
@ -120,5 +120,15 @@ wstring readFromUTF8(const char *iBuffer, unsigned int iBufSize,
unsigned int writeInUTF8(const wstring &iWString, char *oBuffer,
unsigned int iBufSize, const string &iContext);
/**
* Same as the other writeInUTF8 function, dealing with a string
* instead of a char*. Note that it performs an additional copy
* of the output string...
* @param iWString: the wide string to encode
* @param iContext: free text used in case of exception
* @return: the converted string
*/
string writeInUTF8(const wstring &iWString, const string &iContext);
#endif

View file

@ -20,11 +20,11 @@
#include <string>
#include <stack>
#include <boost/spirit/core.hpp>
#include <boost/spirit/utility/chset.hpp>
#include <boost/spirit/tree/ast.hpp>
#include <boost/spirit/include/classic_core.hpp>
#include <boost/spirit/include/classic_chset.hpp>
#include <boost/spirit/include/classic_ast.hpp>
#ifdef DEBUG_RE
#include <boost/spirit/tree/tree_to_xml.hpp>
#include <boost/spirit/include/classic_tree_to_xml.hpp>
#include <map>
#include <iostream>
#endif
@ -33,7 +33,7 @@
#include "header.h"
#include "regexp.h"
using namespace boost::spirit;
using namespace boost::spirit::classic;
using namespace std;
// A few typedefs to simplify things

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _GRAMMAR_H_
#define _GRAMMAR_H_
#ifndef GRAMMAR_H_
#define GRAMMAR_H_
class Dictionary;
class Node;

View file

@ -21,6 +21,7 @@
#include "config.h"
#include <cstring> // for strcpy
#include <cstdio> // for snprintf
#include <string>
#include <sstream>
#include <iostream>

View file

@ -18,13 +18,14 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _HEADER_H
#define _HEADER_H
#ifndef HEADER_H_
#define HEADER_H_
#include <iosfwd>
#include <map>
#include <vector>
#include <time.h>
#include <stdint.h>
using namespace std;

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _REGEXP_H_
#define _REGEXP_H_
#ifndef REGEXP_H_
#define REGEXP_H_
#include <string>

View file

@ -19,8 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _TILE_H_
#define _TILE_H_
#ifndef TILE_H_
#define TILE_H_
#include <list>
#include <vector>

View file

@ -2,6 +2,9 @@ ICONV_VERSION = 1.12
LIBCONFIG_VERSION = 1.3.2
BOOST_VERSION = 1_39_0
QT_VERSION = 4.5.3
LIBXML2_VERSION = 2.7.5
ARABICA_VERSION = 2009-march
PREFIX = $(shell pwd)/inst
WGET = wget -c
@ -29,7 +32,7 @@ ICONV_DIR = libiconv-$(ICONV_VERSION)
ICONV_ARCHIVE = libiconv-$(ICONV_VERSION).tar.gz
$(ICONV_ARCHIVE): $(PREFIX)
$(WGET) http://ftp.gnu.org/pub/gnu/libiconv/$(ICONV_ARCHIVE)
$(WGET) http://ftp.gnu.org/pub/gnu/libiconv/$@
$(ICONV_DIR): $(ICONV_ARCHIVE)
tar xzf $<
@ -45,7 +48,7 @@ LIBCONFIG_DIR = libconfig-$(LIBCONFIG_VERSION)
LIBCONFIG_ARCHIVE = libconfig-$(LIBCONFIG_VERSION).tar.gz
$(LIBCONFIG_ARCHIVE): $(PREFIX)
$(WGET) http://www.hyperrealm.com/libconfig/$(LIBCONFIG_ARCHIVE)
$(WGET) http://www.hyperrealm.com/libconfig/$@
$(LIBCONFIG_DIR): $(LIBCONFIG_ARCHIVE)
tar xvf $<
@ -61,7 +64,7 @@ BOOST_DIR = boost_$(BOOST_VERSION)
BOOST_ARCHIVE = boost_$(BOOST_VERSION).tar.bz2
$(BOOST_ARCHIVE): $(PREFIX)
$(WGET) http://garr.dl.sourceforge.net/sourceforge/boost/$(BOOST_ARCHIVE)
$(WGET) http://garr.dl.sourceforge.net/sourceforge/boost/$@
$(BOOST_DIR): $(BOOST_ARCHIVE)
tar xjf $<
@ -81,7 +84,7 @@ QT_ARCHIVE = qt4-$(QT_VERSION)-win32-bin.tar.bz2
QT_DIR = qt4-$(QT_VERSION)-win32-bin
$(QT_ARCHIVE): $(PREFIX)
$(WGET) http://dl.sv.nongnu.org/releases-noredirect/eliot/other/$(QT_ARCHIVE)
$(WGET) http://dl.sv.nongnu.org/releases-noredirect/eliot/other/$@
$(QT_DIR): $(QT_ARCHIVE)
tar xjf $<
@ -91,3 +94,37 @@ $(QT_DIR): $(QT_ARCHIVE)
(cd $<; cp -r bin include lib share $(PREFIX); sed 's,@@PREFIX@@,$(PREFIX),' $(PREFIX)/lib/pkgconfig/QtCore.pc.in > $(PREFIX)/lib/pkgconfig/QtCore.pc; sed 's,@@PREFIX@@,$(PREFIX),' lib/pkgconfig/QtGui.pc.in > $(PREFIX)/lib/pkgconfig/QtGui.pc; rm $(PREFIX)/lib/pkgconfig/*.in)
touch $@
### LibXML 2 ###
LIBXML2_DIR = libxml2-$(LIBXML2_VERSION)
LIBXML2_ARCHIVE = libxml2-$(LIBXML2_VERSION).tar.gz
$(LIBXML2_ARCHIVE): $(PREFIX)
$(WGET) ftp://xmlsoft.org/libxml2/$@
$(LIBXML2_DIR): $(LIBXML2_ARCHIVE)
tar xzf $<
# TODO: add more --without-xxx flags (apparently needed for build: pattern, debug)
# --with-legacy and --with-html are needed for arabica
.libxml2: $(LIBXML2_DIR)
(cd $< && $(CONFIGURE) --enable-static --disable-shared --with-legacy --without-schematron --without-tree --without-zlib --without-http --without-ftp --without-html --without-python --without-docbook --without-regexps && make install)
touch $@
### Arabica ###
ARABICA_DIR = arabica-$(ARABICA_VERSION)
ARABICA_ARCHIVE = arabica-$(ARABICA_VERSION).tar.bz2
$(ARABICA_ARCHIVE): $(PREFIX)
$(WGET) http://downloads.sourceforge.net/project/arabica/arabica/March-09/$@?use_mirror=ovh
$(ARABICA_DIR): $(ARABICA_ARCHIVE)
tar xjf $<
.arabica: $(ARABICA_DIR)
(cd $< && patch -p0 < ../arabica-no-example.patch && $(CONFIGURE) --enable-static --disable-shared --with-parser=libxml2 --with-libxml2=$(PREFIX) --with-boost=$(PREFIX) --with-tests=no --with-dom=no && make install)
touch $@

View file

@ -19,7 +19,7 @@
noinst_LIBRARIES = libgame.a
AM_CPPFLAGS = -I$(top_srcdir)/dic -I../intl -I$(top_srcdir)/intl @LIBCONFIG_CFLAGS@
AM_CPPFLAGS = -I$(top_srcdir)/dic -I../intl -I$(top_srcdir)/intl @LIBCONFIG_CFLAGS@ @ARABICA_CFLAGS@ @LIBXML2_CFLAGS@
libgame_a_SOURCES= \
game_exception.cpp game_exception.h \
@ -50,10 +50,13 @@ libgame_a_SOURCES= \
game_move_cmd.h game_move_cmd.cpp \
turn_cmd.cpp turn_cmd.h \
duplicate.cpp duplicate.h \
mark_played_cmd.h mark_played_cmd.cpp \
freegame.cpp freegame.h \
training.cpp training.h \
public_game.cpp public_game.h \
game_factory.cpp game_factory.h \
game_io.cpp \
xml_writer.cpp xml_writer.h \
xml_reader.cpp xml_reader.h \
debug.h

View file

@ -35,6 +35,8 @@ AIPercent::AIPercent(float iPercent)
if (iPercent > 1)
iPercent = 1;
m_percent = iPercent;
// Use BestResults to be slightly faster when the percentage is 100%
if (iPercent == 1)
m_results = new BestResults;

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _AI_PERCENT_H_
#define _AI_PERCENT_H_
#ifndef AI_PERCENT_H_
#define AI_PERCENT_H_
#include "ai_player.h"
#include "results.h"
@ -42,6 +42,8 @@ public:
AIPercent(float iPercent);
virtual ~AIPercent();
float getPercent() const { return m_percent; }
/**
* This method does the actual computation. It will be called before any
* of the following methods, so it must prepare everything for them.
@ -52,6 +54,7 @@ public:
virtual Move getMove() const;
private:
float m_percent;
/// Container for all the found solutions
Results *m_results;
};

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _AI_PLAYER_H_
#define _AI_PLAYER_H_
#ifndef AI_PLAYER_H_
#define AI_PLAYER_H_
#include "player.h"

View file

@ -22,6 +22,7 @@
#include <boost/foreach.hpp>
#include <string>
#include <cstdio>
#include <cstdlib> // For rand()
#include <dic.h>

View file

@ -19,8 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _BAG_H_
#define _BAG_H_
#ifndef BAG_H_
#define BAG_H_
#include <map>
#include "tile.h"

View file

@ -21,6 +21,7 @@
#include <wctype.h>
#include <algorithm>
#include <cstdio>
#include "dic.h"

View file

@ -19,8 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _BOARD_H_
#define _BOARD_H_
#ifndef BOARD_H_
#define BOARD_H_
#include <string>

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _BOARD_SEARCH_H_
#define _BOARD_SEARCH_H_
#ifndef BOARD_SEARCH_H_
#define BOARD_SEARCH_H_
#include "coord.h"
#include "matrix.h"

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _COMMAND_H
#define _COMMAND_H
#ifndef COMMAND_H_
#define COMMAND_H_
#include <string>

View file

@ -20,6 +20,7 @@
*****************************************************************************/
#include <string>
#include <cstdio>
#include <wchar.h>
#include "coord.h"
#include "board.h" // for BOARD_MIN and BOARD_MAX (TODO: remove this include)

View file

@ -19,8 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _COORD_H
#define _COORD_H
#ifndef COORD_H_
#define COORD_H_
#include <string>

View file

@ -20,6 +20,7 @@
*****************************************************************************/
#include <string>
#include <cstdio>
#include "cross.h"
#define CROSS_MASK 0xFFFFFFFF

View file

@ -19,8 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _CROSS_H_
#define _CROSS_H_
#ifndef CROSS_H_
#define CROSS_H_
#include <set>
#include "tile.h"

View file

@ -19,8 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _DEBUG_H_
#define _DEBUG_H_
#ifndef DEBUG_H_
#define DEBUG_H_
/**********
* General

View file

@ -42,6 +42,7 @@
#include "player_move_cmd.h"
#include "player_rack_cmd.h"
#include "game_move_cmd.h"
#include "mark_played_cmd.h"
#include "ai_player.h"
#include "settings.h"
#include "debug.h"
@ -254,9 +255,7 @@ void Duplicate::endTurn()
}
// Play the best word on the board
Command *pCmd = new GameMoveCmd(*this, bestMove,
bestPlayer->getLastRack(),
bestPlayer->getId());
Command *pCmd = new GameMoveCmd(*this, bestMove, bestPlayer->getId());
accessNavigation().addAndExecute(pCmd);
// Leave the same reliquate to all players
@ -315,35 +314,3 @@ void Duplicate::setPlayedFlag(unsigned int iPlayerId, bool iNewFlag)
m_hasPlayed[iPlayerId] = iNewFlag;
}
Duplicate::MarkPlayedCmd::MarkPlayedCmd(Duplicate &ioDuplicate,
unsigned int iPlayerId,
bool iPlayedFlag)
: m_duplicateGame(ioDuplicate), m_playerId(iPlayerId),
m_newPlayedFlag(iPlayedFlag)
{
}
void Duplicate::MarkPlayedCmd::doExecute()
{
m_oldPlayedFlag = m_duplicateGame.hasPlayed(m_playerId);
m_duplicateGame.setPlayedFlag(m_playerId, m_newPlayedFlag);
}
void Duplicate::MarkPlayedCmd::doUndo()
{
m_duplicateGame.setPlayedFlag(m_playerId, m_oldPlayedFlag);
}
wstring Duplicate::MarkPlayedCmd::toString() const
{
wostringstream oss;
oss << L"MarkPlayedCmd (player " << m_playerId
<< L" marked " << m_newPlayedFlag << L")";
return oss.str();
}

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _DUPLICATE_H_
#define _DUPLICATE_H_
#ifndef DUPLICATE_H_
#define DUPLICATE_H_
#include "game.h"
#include "command.h"
@ -54,6 +54,7 @@ using std::wstring;
class Duplicate: public Game
{
friend class GameFactory;
friend class MarkPlayedCmd;
public:
virtual GameMode getMode() const { return kDUPLICATE; }
virtual string getModeAsString() const { return "Duplicate"; }
@ -132,27 +133,6 @@ private:
/// m_hasPlayed[p] is true iff player p has played for this turn
map<unsigned int, bool> m_hasPlayed;
/// Command used internally to change the "has played" flag of a player
class MarkPlayedCmd: public Command
{
public:
MarkPlayedCmd(Duplicate &ioDuplicate,
unsigned int iPlayerId,
bool iPlayedFlag);
virtual wstring toString() const;
protected:
virtual void doExecute();
virtual void doUndo();
private:
Duplicate &m_duplicateGame;
unsigned int m_playerId;
bool m_newPlayedFlag;
bool m_oldPlayedFlag;
};
};
#endif /* _DUPLICATE_H_ */

View file

@ -148,9 +148,7 @@ int FreeGame::endTurn()
{
const Move &move = getCurrentPlayer().getLastMove();
// Update the game
Command *pCmd = new GameMoveCmd(*this, move,
getCurrentPlayer().getLastRack(),
m_currPlayer);
Command *pCmd = new GameMoveCmd(*this, move, m_currPlayer);
accessNavigation().addAndExecute(pCmd);
// Complete the rack for the player that just played

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _FREEGAME_H_
#define _FREEGAME_H_
#ifndef FREEGAME_H_
#define FREEGAME_H_
#include "game.h"

View file

@ -501,7 +501,8 @@ void Game::nextPlayer()
int Game::checkPlayedWord(const wstring &iCoord,
const wstring &iWord, Round &oRound) const
const wstring &iWord,
Round &oRound, bool checkRack) const
{
ASSERT(getNPlayers() != 0, "Expected at least one player");
@ -550,28 +551,31 @@ int Game::checkPlayedWord(const wstring &iCoord,
return 10;
}
// Check that the word can be formed with the tiles in the rack:
// we first create a copy of the rack, then we remove the tiles
// one by one
Rack rack;
Player *player = m_players[m_currPlayer];
player->getCurrentRack().getRack(rack);
Tile t;
for (unsigned int i = 0; i < oRound.getWordLen(); i++)
if (checkRack)
{
if (oRound.isPlayedFromRack(i))
{
if (oRound.isJoker(i))
t = Tile::Joker();
else
t = oRound.getTile(i);
// Check that the word can be formed with the tiles in the rack:
// we first create a copy of the rack, then we remove the tiles
// one by one
Rack rack;
Player *player = m_players[m_currPlayer];
player->getCurrentRack().getRack(rack);
if (!rack.in(t))
Tile t;
for (unsigned int i = 0; i < oRound.getWordLen(); i++)
{
if (oRound.isPlayedFromRack(i))
{
return 4;
if (oRound.isJoker(i))
t = Tile::Joker();
else
t = oRound.getTile(i);
if (!rack.in(t))
{
return 4;
}
rack.remove(t);
}
rack.remove(t);
}
}

View file

@ -19,8 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _GAME_H_
#define _GAME_H_
#ifndef GAME_H_
#define GAME_H_
#include <string>
#include <vector>
@ -178,30 +178,13 @@ public:
***************/
/**
* Possible formats for the saved games
*/
enum game_file_format
{
FILE_FORMAT_STANDARD,
FILE_FORMAT_ADVANCED
};
/**
* XXX FIXME XXX: these methods are deprecated, don't use them anymore.
* load() returns the loaded game, or NULL if there was a problem
* load() does need some more work to be robust enough to
* handle "hand written" files
*/
static Game * load(FILE *fin, const Dictionary &iDic);
/**
* Save a game to a file
* Standard format is used for training games so that it is compatible
* with previous versions of Eliot.
*
* Saving can be forced to advanced format for training games by
* setting the last parameter to FILE_FORMAT_ADVANCED
*/
void save(ostream &out, game_file_format format = FILE_FORMAT_STANDARD) const;
static Game * load(const string &iFileName, const Dictionary &iDic);
/***************
* Setting the rack
@ -214,6 +197,19 @@ public:
const Navigation & getNavigation() const { return m_navigation; }
Navigation & accessNavigation() { return m_navigation; }
/**
* This function checks whether it is legal to play the given word at the
* given coordinates. If so, the function fills a Round object, also given
* as a parameter.
* Possible return values: same as the play() method
* If checkRack is false, the return value 4 is impossible to get
* (no check is done on the rack letters).
*/
int checkPlayedWord(const wstring &iCoord,
const wstring &iWord,
Round &oRound,
bool checkRack = true) const;
private:
/// Variant
GameVariant m_variant;
@ -317,15 +313,6 @@ protected:
*/
bool rackInBag(const Rack &iRack, const Bag &iBag) const;
/**
* This function checks whether it is legal to play the given word at the
* given coordinates. If so, the function fills a Round object, also given
* as a parameter.
* Possible return values: same as the play() method
*/
int checkPlayedWord(const wstring &iCoord,
const wstring &iWord, Round &oRound) const;
/**
* load games from File using the first format.
* This format is used for Training games
@ -338,6 +325,7 @@ protected:
*/
static Game* gameLoadFormat_15(FILE *fin, const Dictionary& iDic);
#if 0
/**
* Training games ares saved using the initial Eliot format
*/
@ -347,6 +335,7 @@ protected:
* Advanced game file format output
*/
void gameSaveFormat_15(ostream &out) const;
#endif
};

View file

@ -40,3 +40,15 @@ EndGameException::EndGameException(const string &iMessage)
{
}
LoadGameException::LoadGameException(const string &iMessage)
: GameException(iMessage)
{
}
SaveGameException::SaveGameException(const string &iMessage)
: GameException(iMessage)
{
}

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _GAME_EXCEPTION_H_
#define _GAME_EXCEPTION_H_
#ifndef GAME_EXCEPTION_H_
#define GAME_EXCEPTION_H_
#include <exception>
#include <string>
@ -48,4 +48,18 @@ class EndGameException: public GameException
EndGameException(const std::string &iMessage);
};
class LoadGameException: public GameException
{
public:
LoadGameException(const std::string &iMessage);
};
class SaveGameException: public GameException
{
public:
SaveGameException(const std::string &iMessage);
};
#endif

View file

@ -42,6 +42,7 @@
#include "ai_percent.h"
#include "dic.h"
#include "encoding.h"
#include "xml_reader.h"
GameFactory *GameFactory::m_factory = NULL;
@ -227,15 +228,7 @@ Game *GameFactory::createFromCmdLine(int argc, char **argv)
Game* GameFactory::load(const string &iFileName, const Dictionary &iDic)
{
FILE* fin = fopen(iFileName.c_str(), "r");
if (fin == NULL)
{
printf("Cannot open %s\n", iFileName.c_str());
return NULL;
}
Game *game = Game::load(fin, iDic);
fclose(fin);
return game;
return XmlReader::read(iFileName, iDic);
}

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _GAME_FACTORY_H_
#define _GAME_FACTORY_H_
#ifndef GAME_FACTORY_H_
#define GAME_FACTORY_H_
#include <string>
#include <vector>

View file

@ -21,6 +21,7 @@
#include <cstring>
#include <cstdlib> // For atoi
#include <cstdio>
#include "dic.h"
#include "pldrack.h"
@ -106,6 +107,7 @@ Game* Game::gameLoadFormat_14(FILE *fin, const Dictionary& iDic)
Game *pGame = NULL;
pGame = GameFactory::Instance()->createTraining(iDic);
pGame->addPlayer(new HumanPlayer);
pGame->start();
/* rack word ?bonus pts coord */
@ -390,9 +392,7 @@ Game* Game::gameLoadFormat_15(FILE *fin, const Dictionary& iDic)
// pGame->m_players[player]->endTurn(round,num - 1);
// Play the round
GameMoveCmd cmd(*pGame, Move(round),
pGame->getCurrentPlayer().getLastRack(),
pGame->m_currPlayer);
GameMoveCmd cmd(*pGame, Move(round), pGame->m_currPlayer);
cmd.execute();
}
@ -437,170 +437,3 @@ Game* Game::gameLoadFormat_15(FILE *fin, const Dictionary& iDic)
return pGame;
}
/********************************************************
*
* Loading games
*
********************************************************/
void Game::save(ostream &out, game_file_format format) const
{
if (getMode() == kTRAINING && format == FILE_FORMAT_STANDARD)
{
gameSaveFormat_14(out);
}
else
{
gameSaveFormat_15(out);
}
}
void Game::gameSaveFormat_14(ostream &out) const
{
char line[100];
const string decal = " ";
out << IDENT_STRING << endl << endl;
for (unsigned int i = 0; i < m_history.getSize(); i++)
{
const Turn& turn = m_history.getTurn(i);
wstring rack = turn.getPlayedRack().toString(PlayedRack::RACK_EXTRA);
// FIXME: this will not work if the move does not correspond to a played round!
const Round &round = turn.getMove().getRound();
wstring word = round.getWord();
string coord = convertToMb(round.getCoord().toString(Coord::COORD_MODE_LONG));
// rack [space] word [space] bonus points coord
sprintf(line,"%s%s%c%4d %s",
padAndConvert(rack, 12, false).c_str(),
padAndConvert(word, 16, false).c_str(),
round.getBonus() ? '*' : ' ',
round.getPoints(),
coord.c_str()
);
out << decal << line << endl;
}
out << endl;
out << decal << "total" << string(24,' ');
sprintf(line, "%4d", getCurrentPlayer().getPoints());
out << line << endl;
}
void Game::gameSaveFormat_15(ostream &out) const
{
const string decal = " ";
// "Header" of the game
out << IDENT_STRING << " " << IDENT_FORMAT_15 << endl << endl;
// Game type
out << "Game type: " << getModeAsString() << endl;
// Player list
for (unsigned int i = 0; i < getNPlayers(); i++)
{
out << "Player " << i << ": ";
if (m_players[i]->isHuman())
out << "Human" << endl;
else
out << "Computer" << endl;
}
out << endl;
// Title of the columns
char line[100];
out << decal << " N | RACK | SOLUTION | REF | PTS | P | BONUS" << endl;
out << decal << "===|==========|=================|=====|=====|===|======" << endl;
// Print the game itself
for (unsigned int i = 0; i < m_history.getSize(); i++)
{
const Turn& turn = m_history.getTurn(i);
wstring rack = turn.getPlayedRack().toString(PlayedRack::RACK_EXTRA);
const Move &move = turn.getMove();
switch (move.getType())
{
case Move::VALID_ROUND:
{
const Round &round = move.getRound();
wstring word = round.getWord();
string coord = convertToMb(round.getCoord().toString());
sprintf(line, "%2d | %s | %s | %3s | %3d | %1d | %c",
i + 1,
padAndConvert(rack, 8).c_str(), /* pldrack */
padAndConvert(word, 15, false).c_str(), /* word */
coord.c_str(), /* coord */
move.getScore(),
turn.getPlayer(),
round.getBonus() ? '*' : ' ');
break;
}
case Move::INVALID_WORD:
{
wstring word = move.getBadWord();
string coord = convertToMb(move.getBadCoord());
sprintf(line, "%2d | %s | %s | %3s | %3d | %1d |",
i + 1,
padAndConvert(rack, 8).c_str(), /* pldrack */
padAndConvert(word, 15, false).c_str(), /* word */
coord.c_str(), /* coord */
move.getScore(),
turn.getPlayer());
break;
}
case Move::PASS:
{
string action = "(PASS)";
string coord = " - ";
sprintf(line, "%2d | %s | %s | %3s | %3d | %1d |",
i + 1,
padAndConvert(rack, 8).c_str(), /* pldrack */
truncOrPad(action, 15, ' ').c_str(), /* word */
coord.c_str(), /* coord */
move.getScore(),
turn.getPlayer());
break;
}
case Move::CHANGE_LETTERS:
{
wstring action = L"(-" + move.getChangedLetters() + L")";
string coord = " - ";
sprintf(line, "%2d | %s | %s | %3s | %3d | %1d |",
i + 1,
padAndConvert(rack, 8).c_str(), /* pldrack */
padAndConvert(action, 15, false).c_str(), /* word */
coord.c_str(), /* coord */
move.getScore(),
turn.getPlayer());
break;
}
}
out << decal << line << endl;
}
switch (getMode())
{
case kDUPLICATE:
// TODO : we should note the score individualy
out << endl << decal << "Total: " << m_points << endl;
break;
case kFREEGAME:
out << endl << decal << "Total: " << m_points << endl;
break;
case kTRAINING:
out << endl << decal << "Total: " << m_points << endl;
break;
}
// Print current rack for all the players
out << endl;
for (unsigned int i = 0; i < getNPlayers(); i++)
{
wstring rack = m_players[i]->getCurrentRack().toString();
out << "Rack " << i << ": " << convertToMb(rack) << endl;
}
}

View file

@ -24,11 +24,13 @@
#include "player.h"
#include "game.h"
#include "rack.h"
#include "turn.h"
GameMoveCmd::GameMoveCmd(Game &ioGame, const Move &iMove,
const PlayedRack &iMoveRack, unsigned int iPlayerId)
: m_game(ioGame), m_move(iMove), m_moveRack(iMoveRack),
unsigned int iPlayerId)
: m_game(ioGame), m_move(iMove),
m_moveRack(ioGame.getPlayer(iPlayerId).getHistory().getPreviousTurn().getPlayedRack()),
m_playerId(iPlayerId)
{
}

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _GAME_MOVE_CMD_H
#define _GAME_MOVE_CMD_H
#ifndef GAME_MOVE_CMD_H_
#define GAME_MOVE_CMD_H_
#include "command.h"
#include "move.h"
@ -44,11 +44,14 @@ class GameMoveCmd: public Command
{
public:
GameMoveCmd(Game &ioGame, const Move &iMove,
const PlayedRack &iMoveRack,
unsigned int iPlayerId);
virtual wstring toString() const;
// Getters
const Move & getMove() const { return m_move; }
unsigned int getPlayerId() const { return m_playerId; }
protected:
virtual void doExecute();
virtual void doUndo();

View file

@ -19,8 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _HISTORY_H
#define _HISTORY_H
#ifndef HISTORY_H_
#define HISTORY_H_
#include <string>
#include <vector>

57
game/mark_played_cmd.cpp Normal file
View file

@ -0,0 +1,57 @@
/*****************************************************************************
* Eliot
* Copyright (C) 2009 Olivier Teulière
* Authors: Olivier Teulière <ipkiss @@ gmail.com>
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#include <sstream>
#include "mark_played_cmd.h"
#include "duplicate.h"
using namespace std;
MarkPlayedCmd::MarkPlayedCmd(Duplicate &ioDuplicate,
unsigned int iPlayerId,
bool iPlayedFlag)
: m_duplicateGame(ioDuplicate), m_playerId(iPlayerId),
m_newPlayedFlag(iPlayedFlag)
{
}
void MarkPlayedCmd::doExecute()
{
m_oldPlayedFlag = m_duplicateGame.hasPlayed(m_playerId);
m_duplicateGame.setPlayedFlag(m_playerId, m_newPlayedFlag);
}
void MarkPlayedCmd::doUndo()
{
m_duplicateGame.setPlayedFlag(m_playerId, m_oldPlayedFlag);
}
wstring MarkPlayedCmd::toString() const
{
wostringstream oss;
oss << L"MarkPlayedCmd (player " << m_playerId
<< L" marked " << m_newPlayedFlag << L")";
return oss.str();
}

54
game/mark_played_cmd.h Normal file
View file

@ -0,0 +1,54 @@
/*****************************************************************************
* Eliot
* Copyright (C) 2009 Olivier Teulière
* Authors: Olivier Teulière <ipkiss @@ gmail.com>
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef MARK_PLAYED_CMD_H_
#define MARK_PLAYED_CMD_H_
#include "command.h"
class Duplicate;
/**
* Command used internally to change the "has played" flag of a player
* in a duplicate game.
*/
class MarkPlayedCmd: public Command
{
public:
MarkPlayedCmd(Duplicate &ioDuplicate,
unsigned int iPlayerId,
bool iPlayedFlag);
virtual wstring toString() const;
protected:
virtual void doExecute();
virtual void doUndo();
private:
Duplicate &m_duplicateGame;
unsigned int m_playerId;
bool m_newPlayedFlag;
bool m_oldPlayedFlag;
};
#endif

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _MATRIX_H_
#define _MATRIX_H_
#ifndef MATRIX_H_
#define MATRIX_H_
#include <vector>

View file

@ -147,7 +147,7 @@ wstring Move::toString() const
else if (m_type == CHANGE_LETTERS)
wss << "CHANGE=" << m_letters;
else if (m_type == INVALID_WORD)
wss << "INVALID: word=" << m_round.toString() << " coords=" << m_coord;
wss << "INVALID: word=" << m_word << " coords=" << m_coord;
else if (m_type == VALID_ROUND)
wss << "VALID: word=" << m_round.toString();
wss << " score=" << m_score;

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _MOVE_H
#define _MOVE_H
#ifndef MOVE_H_
#define MOVE_H_
#include <string>
@ -81,7 +81,7 @@ class Move
Type getType() const { return m_type; }
/// Get the score of this move (0 unless the round is valid)
int getScore() const { return m_score; };
int getScore() const { return m_score; }
/**
* Return the round associated with the move, or throw an exception

View file

@ -172,12 +172,18 @@ void Navigation::clearFuture()
}
const vector<TurnCmd *> & Navigation::getCommands() const
{
return m_turnCommands;
}
void Navigation::print() const
{
cout << "=== Commands history ===" << endl;
cout << "Current position right after turn " << m_currTurn - 1<< endl;
cout << "Current position right after turn " << m_currTurn - 1 << endl;
int index = 0;
BOOST_FOREACH(Command *c, m_turnCommands)
BOOST_FOREACH(const Command *c, m_turnCommands)
{
cout << index << " " << convertToMb(c->toString()) << endl;
++index;

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _NAVIGATION_H
#define _NAVIGATION_H
#ifndef NAVIGATION_H_
#define NAVIGATION_H_
#include <vector>
@ -53,6 +53,8 @@ class Navigation
*/
void clearFuture();
const vector<TurnCmd *> & getCommands() const;
/**
* Print the contents of the commands history, to ease debugging
*/

View file

@ -19,8 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _PLAYER_H_
#define _PLAYER_H_
#ifndef PLAYER_H_
#define PLAYER_H_
#include <vector>
#include <string>

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _PLAYER_MOVE_CMD_H
#define _PLAYER_MOVE_CMD_H
#ifndef PLAYER_MOVE_CMD_H_
#define PLAYER_MOVE_CMD_H_
#include "command.h"
#include "move.h"
@ -46,6 +46,10 @@ class PlayerMoveCmd: public Command
virtual wstring toString() const;
// Getters
const Player & getPlayer() const { return m_player; }
const Move & getMove() const { return m_move; }
protected:
virtual void doExecute();
virtual void doUndo();

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _PLAYER_POINTS_CMD_H
#define _PLAYER_POINTS_CMD_H
#ifndef PLAYER_POINTS_CMD_H_
#define PLAYER_POINTS_CMD_H_
#include "command.h"
@ -37,6 +37,10 @@ class PlayerPointsCmd: public Command
virtual wstring toString() const;
// Getters
const Player & getPlayer() const { return m_player; }
int getPoints() const { return m_points; }
protected:
virtual void doExecute();
virtual void doUndo();

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _PLAYER_RACK_CMD_H
#define _PLAYER_RACK_CMD_H
#ifndef PLAYER_RACK_CMD_H_
#define PLAYER_RACK_CMD_H_
#include "command.h"
#include "pldrack.h"
@ -38,6 +38,10 @@ class PlayerRackCmd: public Command
virtual wstring toString() const;
// Getters
const Player & getPlayer() const { return m_player; }
const PlayedRack &getRack() const { return m_newRack; }
protected:
virtual void doExecute();
virtual void doUndo();

View file

@ -19,8 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _PLAYEDRACK_H_
#define _PLAYEDRACK_H_
#ifndef PLAYEDRACK_H_
#define PLAYEDRACK_H_
#include <vector>
#include <string>

View file

@ -23,7 +23,9 @@
#include "training.h"
#include "duplicate.h"
#include "freegame.h"
#include "game_factory.h"
#include "game_exception.h"
#include "xml_writer.h"
PublicGame::PublicGame(Game &iGame)
@ -70,6 +72,8 @@ PublicGame::GameVariant PublicGame::getVariant() const
{
if (m_game.getVariant() == Game::kJOKER)
return kJOKER;
else if (m_game.getVariant() == Game::kEXPLOSIVE)
return kEXPLOSIVE;
else
return kNONE;
}
@ -251,21 +255,16 @@ int PublicGame::freeGamePass(const wstring &iToChange)
/***************************/
PublicGame *PublicGame::load(FILE *fin, const Dictionary &iDic)
PublicGame *PublicGame::load(const string &iFileName, const Dictionary &iDic)
{
Game *game = Game::load(fin, iDic);
if (game == NULL)
return NULL;
Game *game = GameFactory::Instance()->load(iFileName, iDic);
return new PublicGame(*game);
}
void PublicGame::save(ostream &out, GameFileFormat format) const
void PublicGame::save(const string &iFileName) const
{
if (format == kFILE_FORMAT_ADVANCED)
m_game.save(out, Game::FILE_FORMAT_ADVANCED);
else
m_game.save(out, Game::FILE_FORMAT_STANDARD);
XmlWriter::write(m_game, iFileName);
}
/***************************/

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _PUBLIC_GAME_H_
#define _PUBLIC_GAME_H_
#ifndef PUBLIC_GAME_H_
#define PUBLIC_GAME_H_
#include <string>
@ -241,30 +241,15 @@ public:
***************/
/**
* Possible formats for the saved games
* Return the loaded game, from an XML file.
* An exception is thrown in case of problem.
*/
enum GameFileFormat
{
kFILE_FORMAT_STANDARD,
kFILE_FORMAT_ADVANCED
};
static PublicGame * load(const string &iFileName, const Dictionary &iDic);
/**
* load() returns the loaded game, or NULL if there was a problem
* load() does need some more work to be robust enough to
* handle "hand written" files
* Save a game to a XML file
*/
static PublicGame * load(FILE *fin, const Dictionary &iDic);
/**
* Save a game to a file
* Standard format is used for training games so that it is compatible
* with previous versions of Eliot.
*
* Saving can be forced to advanced format for training games by
* setting the last parameter to kFILE_FORMAT_ADVANCED
*/
void save(ostream &out, GameFileFormat format = kFILE_FORMAT_STANDARD) const;
void save(const string &iFileName) const;
/***************
* Navigation in the game history

View file

@ -19,8 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _RACK_H_
#define _RACK_H_
#ifndef RACK_H_
#define RACK_H_
#include <vector>
#include <string>

View file

@ -19,8 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _RESULTS_H_
#define _RESULTS_H_
#ifndef RESULTS_H_
#define RESULTS_H_
#include <vector>
#include <map>

View file

@ -19,8 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _ROUND_H_
#define _ROUND_H_
#ifndef ROUND_H_
#define ROUND_H_
#include <vector>
#include "tile.h"

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _SETTINGS_H_
#define _SETTINGS_H_
#ifndef SETTINGS_H_
#define SETTINGS_H_
#include <string>
#include <map>

View file

@ -48,9 +48,6 @@
Training::Training(const Dictionary &iDic)
: Game(iDic), m_results(1000)
{
// Training mode implicitly uses 1 human player
Game::addPlayer(new HumanPlayer);
m_players[0]->setName(convertToWc(_("Training")));
}
@ -135,9 +132,7 @@ void Training::endTurn()
// Play the word on the board
const Move &move = m_players[m_currPlayer]->getLastMove();
Command *pCmd = new GameMoveCmd(*this, move,
getCurrentPlayer().getLastRack(),
m_currPlayer);
Command *pCmd = new GameMoveCmd(*this, move, m_currPlayer);
accessNavigation().addAndExecute(pCmd);
accessNavigation().newTurn();
}
@ -172,9 +167,11 @@ int Training::playResult(unsigned int n)
void Training::addPlayer(Player *iPlayer)
{
// Override the default behaviour to do nothing
// except releasing memory
delete iPlayer;
ASSERT(getNPlayers() == 0,
"Only one player can be added in Training mode");
// Force the name of the player
iPlayer->setName(convertToWc(_("Training")));
Game::addPlayer(iPlayer);
}

View file

@ -19,8 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _TRAINING_H_
#define _TRAINING_H_
#ifndef TRAINING_H_
#define TRAINING_H_
#include <string>

View file

@ -19,8 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _TURN_H
#define _TURN_H
#ifndef TURN_H_
#define TURN_H_
#include <string>
#include "pldrack.h"

View file

@ -18,8 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef _TURN_CMD_H
#define _TURN_CMD_H
#ifndef TURN_CMD_H_
#define TURN_CMD_H_
#include <vector>
@ -46,6 +46,8 @@ class TurnCmd: public Command
bool isEmpty() const { return m_commands.empty(); }
const vector<Command *> & getCommands() const { return m_commands; }
virtual bool isAutoExecution() const;
virtual wstring toString() const;

337
game/xml_reader.cpp Normal file
View file

@ -0,0 +1,337 @@
/*******************************************************************
* Eliot
* Copyright (C) 2009 Olivier Teulière
* Authors: Olivier Teulière <ipkiss @@ gmail.com>
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#include <fstream>
#include <SAX/XMLReader.hpp>
#include <SAX/InputSource.hpp>
#include "xml_reader.h"
#include "dic.h"
#include "game_exception.h"
#include "game_factory.h"
#include "training.h"
#include "duplicate.h"
#include "freegame.h"
#include "player.h"
#include "ai_percent.h"
#include "encoding.h"
#include "game_move_cmd.h"
#include "player_rack_cmd.h"
#include "player_move_cmd.h"
#include "player_points_cmd.h"
#include "navigation.h"
using namespace std;
Game * XmlReader::read(const string &iFileName, const Dictionary &iDic)
{
// Try to load the old format first
try
{
FILE *fin = fopen(iFileName.c_str(), "r");
if (fin != NULL)
{
Game *game = Game::load(fin, iDic);
fclose(fin);
if (game != NULL)
return game;
}
}
catch (const GameException &e)
{
// Ignore the exception
}
ifstream is(iFileName.c_str());
if (!is.is_open())
throw LoadGameException("Cannot open file '" + iFileName + "'");
XmlReader handler(iDic);
// Set up of the parser
Arabica::SAX::XMLReader<std::string> parser;
parser.setContentHandler(handler);
parser.setErrorHandler(handler);
// Parsing
Arabica::SAX::InputSource<std::string> source(is);
parser.parse(source);
Game *game = handler.getGame();
if (game == NULL)
throw LoadGameException(handler.errorMessage);
return game;
}
static wstring fromUtf8(const string &str)
{
return readFromUTF8(str.c_str(), str.size(), "Loading game");
}
static int toInt(const string &str)
{
if (str.empty())
throw LoadGameException("Invalid string to int conversion: empty string received");
return atoi(str.c_str());
}
static Player & getPlayer(map<string, Player*> &players, const string &id)
{
if (players.find(id) == players.end())
throw LoadGameException("Invalid player ID: " + id);
return *players[id];
}
static Move buildMove(const Game &iGame, map<string, string> &attr,
bool checkRack)
{
// Build the Move object
string type = attr["type"];
if (type == "valid")
{
Round round;
int res = iGame.checkPlayedWord(fromUtf8(attr["coord"]),
fromUtf8(attr["word"]),
round, checkRack);
if (res != 0)
{
throw LoadGameException("Invalid move marked as valid: " +
attr["word"] + " (" + attr["coord"] + ")");
}
return Move(round);
}
else if (type == "invalid")
{
return Move(fromUtf8(attr["word"]),
fromUtf8(attr["coord"]));
}
else if (type == "change")
{
return Move(fromUtf8(attr["letters"]));
}
else if (type == "pass")
{
return Move(L"");
}
else
throw LoadGameException("Invalid move type: " + type);
}
Game * XmlReader::getGame()
{
// TODO
return m_game;
}
void XmlReader::startElement(const string& namespaceURI,
const string& localName,
const string& qName,
const Arabica::SAX::Attributes<string>& atts)
{
(void) namespaceURI;
(void) qName;
#if 0
if (!localName.empty())
std::cout << "Start Element: " << namespaceURI << ":" << localName << std::endl;
else
std::cout << "Start Element: " << qName << std::endl;
#endif
m_data.clear();
const string &tag = localName;
if (tag == "Player")
{
m_context = "Player";
m_attributes.clear();
for (int i = 0; i < atts.getLength(); ++i)
{
m_attributes[atts.getLocalName(i)] = atts.getValue(i);
}
}
else if (tag == "PlayerRack")
{
m_attributes.clear();
for (int i = 0; i < atts.getLength(); ++i)
{
m_attributes[atts.getLocalName(i)] = atts.getValue(i);
}
}
else if (tag == "PlayerMove" || tag == "GameMove")
{
m_attributes.clear();
for (int i = 0; i < atts.getLength(); ++i)
{
m_attributes[atts.getLocalName(i)] = atts.getValue(i);
}
}
}
void XmlReader::endElement(const string& namespaceURI,
const string& localName,
const string&)
{
(void) namespaceURI;
#if 0
std::cout << "endElement: " << namespaceURI << ":" << localName << "(" << m_data << ")" << std::endl;
#endif
const string &tag = localName;
if (tag == "Mode")
{
if (m_data == "duplicate")
m_game = GameFactory::Instance()->createDuplicate(m_dic);
else if (m_data == "freegame")
m_game = GameFactory::Instance()->createFreeGame(m_dic);
else if (m_data == "training")
m_game = GameFactory::Instance()->createTraining(m_dic);
else
throw LoadGameException("Invalid game mode: " + m_data);
return;
}
// At this point, m_game must not be null anymore
if (m_game == NULL)
throw LoadGameException("The 'Mode' tag should be the first one to be closed");
if (tag == "Variant")
{
if (m_data == "bingo")
m_game->setVariant(Game::kJOKER);
else if (m_data == "explosive")
m_game->setVariant(Game::kEXPLOSIVE);
else
throw LoadGameException("Invalid game variant: " + m_data);
}
else if (m_context == "Player")
{
if (tag == "Name")
m_attributes["name"] = m_data;
else if (tag == "Type")
m_attributes["type"] = m_data;
else if (tag == "Level")
m_attributes["level"] = m_data;
else if (tag == "Player")
{
if (m_players.find(m_attributes["id"]) != m_players.end())
throw LoadGameException("A player ID must be unique: " + m_attributes["id"]);
// Create the player
Player *p;
if (m_attributes["type"] == "human")
p = new HumanPlayer();
else if (m_attributes["type"] == "computer")
{
int level = toInt(m_attributes["level"]);
p = new AIPercent(0.01 * level);
}
else
throw LoadGameException("Invalid player type: " + m_attributes["type"]);
m_players[m_attributes["id"]] = p;
// Set the name
p->setName(fromUtf8(m_attributes["name"]));
m_game->addPlayer(p);
m_context = "";
}
}
else if (tag == "Turn")
{
m_game->accessNavigation().newTurn();
}
else if (tag == "PlayerRack")
{
// Build a rack for the correct player
PlayedRack pldrack;
if (!m_dic.validateLetters(fromUtf8(m_data), L"-+"))
{
throw LoadGameException("Rack invalid for the current dictionary: " + m_data);
}
pldrack.setManual(fromUtf8(m_data));
#if 0
cerr << "loaded rack: " << convertToMb(pldrack.toString()) << endl;
#endif
Player &p = getPlayer(m_players, m_attributes["playerid"]);
PlayerRackCmd *cmd = new PlayerRackCmd(p, pldrack);
m_game->accessNavigation().addAndExecute(cmd);
#if 0
cerr << "rack: " << convertToMb(pldrack.toString()) << endl;
#endif
}
else if (tag == "PlayerMove")
{
const Move &move = buildMove(*m_game, m_attributes, /*XXX:true*/false);
Player &p = getPlayer(m_players, m_attributes["playerid"]);
PlayerMoveCmd *cmd = new PlayerMoveCmd(p, move);
m_game->accessNavigation().addAndExecute(cmd);
}
else if (tag == "GameMove")
{
const Move &move = buildMove(*m_game, m_attributes, false);
Player &p = getPlayer(m_players, m_attributes["playerid"]);
GameMoveCmd *cmd = new GameMoveCmd(*m_game, move, p.getId());
m_game->accessNavigation().addAndExecute(cmd);
}
}
void XmlReader::characters(const string& ch)
{
m_data += ch;
#if 0
std::cout << "Characters: " << ch << std::endl;
#endif
}
void XmlReader::warning(const Arabica::SAX::SAXParseException<string>& exception)
{
errorMessage = string("warning: ") + exception.what();
//throw LoadGameException(string("warning: ") + exception.what());
}
void XmlReader::error(const Arabica::SAX::SAXParseException<string>& exception)
{
errorMessage = string("error: ") + exception.what();
//throw LoadGameException(string("error: ") + exception.what());
}
void XmlReader::fatalError(const Arabica::SAX::SAXParseException<string>& exception)
{
errorMessage = string("fatal error: ") + exception.what();
//throw LoadGameException(string("fatal error: ") + exception.what());
}

89
game/xml_reader.h Normal file
View file

@ -0,0 +1,89 @@
/*****************************************************************************
* Copyright (C) 2009 Eliot
* Authors: Olivier Teuliere <ipkiss@via.ecp.fr>
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef XML_READER_H_
#define XML_READER_H_
#include <map>
#include <SAX/helpers/DefaultHandler.hpp>
#include <SAX/Locator.hpp>
#include <SAX/Attributes.hpp>
#include <SAX/SAXException.hpp>
class Dictionary;
class Game;
class Player;
using std::string;
using std::map;
class XmlReader : public Arabica::SAX::DefaultHandler<string>
{
public:
virtual ~XmlReader() {}
/**
* Only entry point of the class.
* Create a Game object, from a XML file created using the XmlWriter class.
* The method throws an exception in case of problem.
*/
static Game * read(const string &iFileName, const Dictionary &iDic);
// Return the built game
Game * getGame();
////////////////////////////////////////////////////
// ContentHandler
virtual void startElement(const string& namespaceURI,
const string& localName,
const string& qName,
const AttributesT& atts);
virtual void endElement(const string& namespaceURI,
const string& localName,
const string& qName);
virtual void characters(const string& ch);
/////////////////////////////////////////////////////
// ErrorHandler
virtual void warning(const Arabica::SAX::SAXParseException<string>&);
virtual void error(const Arabica::SAX::SAXParseException<string>&);
virtual void fatalError(const Arabica::SAX::SAXParseException<string>& exception);
private:
const Dictionary &m_dic;
Game *m_game;
string errorMessage;
string m_context;
string m_data;
map<string, Player*> m_players;
map<string, string> m_attributes;
// Private constructor, because we only want the read() method
// to be called externally
XmlReader(const Dictionary &iDic) : m_dic(iDic), m_game(NULL) {}
XmlReader(const XmlReader&);
XmlReader& operator=(const XmlReader&);
bool operator==(const XmlReader&);
};
#endif

212
game/xml_writer.cpp Normal file
View file

@ -0,0 +1,212 @@
/*******************************************************************
* Eliot
* Copyright (C) 2009 Olivier Teulière
* Authors: Olivier Teulière <ipkiss @@ gmail.com>
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#include <vector>
#include <fstream>
#include <boost/foreach.hpp>
#include "xml_writer.h"
#include "encoding.h"
#include "turn_cmd.h"
#include "game.h"
#include "player.h"
#include "ai_percent.h"
#include "game_exception.h"
#include "turn_cmd.h"
#include "game_move_cmd.h"
#include "player_rack_cmd.h"
#include "player_move_cmd.h"
#include "player_points_cmd.h"
#include "mark_played_cmd.h"
using namespace std;
static void addIndent(string &s)
{
s += " ";
}
static void removeIndent(string &s)
{
if (s.size() >= 4)
s.resize(s.size() - 4);
}
static string toUtf8(const wstring &s)
{
return writeInUTF8(s, "Saving game");
}
static void writeMove(ostream &out, const Move &iMove,
const string &iTag, unsigned int iPlayerId)
{
out << "<" << iTag << " playerid=\"" << iPlayerId << "\" type=\"";
if (iMove.getType() == Move::VALID_ROUND)
{
const Round &round = iMove.getRound();
out << "valid\" word=\"" << toUtf8(round.getWord())
<< "\" coord=\"" << toUtf8(round.getCoord().toString()) << "\" />";
}
else if (iMove.getType() == Move::INVALID_WORD)
{
out << "invalid\" word=\"" << toUtf8(iMove.getBadWord())
<< "\" coord=\"" << toUtf8(iMove.getBadCoord()) << "\" />";
}
else if (iMove.getType() == Move::CHANGE_LETTERS)
out << "change\" letters=\"" << toUtf8(iMove.getChangedLetters()) << "\" />";
else if (iMove.getType() == Move::PASS)
out << "pass\" />";
else
throw SaveGameException("Unsupported move: " + convertToMb(iMove.toString()));
}
void XmlWriter::write(const Game &iGame, const string &iFileName)
{
ofstream out(iFileName.c_str());
if (!out.is_open())
throw SaveGameException("Cannot open file for writing: '" + iFileName + "'");
out << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << endl;
string indent = "";
out << indent << "<EliotGame format=\"1\">" << endl;
addIndent(indent);
// ------------------------
// Write the header
out << indent << "<Game>" << endl;
addIndent(indent);
// Game type
out << indent << "<Mode>";
if (iGame.getMode() == Game::kDUPLICATE)
out << "duplicate";
else if (iGame.getMode() == Game::kFREEGAME)
out << "freegame";
else
out << "training";
out << "</Mode>" << endl;
// Game variant
if (iGame.getVariant() == Game::kJOKER)
out << indent << "<Variant>bingo</Variant>" << endl;
if (iGame.getVariant() == Game::kEXPLOSIVE)
out << indent << "<Variant>explosive</Variant>" << endl;
// Players
for (unsigned int i = 0; i < iGame.getNPlayers(); ++i)
{
const Player &player = iGame.getPlayer(i);
out << indent << "<Player id=\"" << player.getId() + 1 << "\">" << endl;
addIndent(indent);
out << indent << "<Name>" << toUtf8(player.getName()) << "</Name>" << endl;
out << indent << "<Type>" << (player.isHuman() ? "human" : "computer") << "</Type>" << endl;
if (!player.isHuman())
{
const AIPercent *ai = dynamic_cast<const AIPercent *>(&player);
if (ai == NULL)
throw SaveGameException("Invalid player type for player " + i);
out << indent << "<Level>" << (int)(ai->getPercent() * 100) << "</Level>" << endl;
}
removeIndent(indent);
out << indent << "</Player>" << endl;
}
// Number of turns
out << indent << "<Turns>"
<< iGame.getNavigation().getNbTurns() << "</Turns>" << endl;
removeIndent(indent);
out << indent << "</Game>" << endl;
// End of the header
// ------------------------
// ------------------------
// Write the game history
out << indent << "<History>" << endl;
addIndent(indent);
#if 0
iGame.getNavigation().print();
#endif
const vector<TurnCmd *> &turnCmdVect = iGame.getNavigation().getCommands();
BOOST_FOREACH(const TurnCmd *turn, turnCmdVect)
{
if (turn->getCommands().empty() && turn == turnCmdVect.back())
continue;
out << indent << "<Turn>" << endl;
addIndent(indent);
BOOST_FOREACH(const Command *cmd, turn->getCommands())
{
if (dynamic_cast<const PlayerRackCmd*>(cmd))
{
const PlayerRackCmd *rackCmd = static_cast<const PlayerRackCmd*>(cmd);
unsigned int id = rackCmd->getPlayer().getId() + 1;
out << indent << "<PlayerRack playerid=\"" << id << "\">"
<< toUtf8(rackCmd->getRack().toString())
<< "</PlayerRack>" << endl;
}
else if (dynamic_cast<const PlayerPointsCmd*>(cmd))
{
const PlayerPointsCmd *pointsCmd = static_cast<const PlayerPointsCmd*>(cmd);
unsigned int id = pointsCmd->getPlayer().getId() + 1;
out << indent << "<PlayerPoints playerid=\"" << id << "\">"
<< pointsCmd->getPoints() << "</PlayerPoints>" << endl;
}
else if (dynamic_cast<const PlayerMoveCmd*>(cmd))
{
const PlayerMoveCmd *moveCmd = static_cast<const PlayerMoveCmd*>(cmd);
unsigned int id = moveCmd->getPlayer().getId() + 1;
out << indent;
writeMove(out, moveCmd->getMove(), "PlayerMove", id);
out << endl;
}
else if (dynamic_cast<const GameMoveCmd*>(cmd))
{
const GameMoveCmd *moveCmd = static_cast<const GameMoveCmd*>(cmd);
unsigned int id = moveCmd->getPlayerId() + 1;
out << indent;
writeMove(out, moveCmd->getMove(), "GameMove", id);
out << endl;
}
else if (dynamic_cast<const MarkPlayedCmd*>(cmd))
{
// Ignore this command, as it is an implementation detail
}
else
{
// XXX
//throw SaveGameException("Unsupported command: " + convertToMb(cmd->toString()));
}
// TODO
}
removeIndent(indent);
out << indent << "</Turn>" << endl;
}
removeIndent(indent);
out << indent << "</History>" << endl;
// End of the game history
// ------------------------
out << "</EliotGame>" << endl;
}

37
game/xml_writer.h Normal file
View file

@ -0,0 +1,37 @@
/*****************************************************************************
* Copyright (C) 2009 Eliot
* Authors: Olivier Teuliere <ipkiss@via.ecp.fr>
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
#ifndef XML_WRITER_H_
#define XML_WRITER_H_
#include <iosfwd>
class Game;
using std::string;
class XmlWriter
{
public:
static void write(const Game &iGame, const string &iFileName);
};
#endif

View file

@ -80,7 +80,7 @@ eliot_SOURCES = \
main.cpp
eliot_SOURCES += $(BUILT_SOURCES)
eliot_LDADD = ../game/libgame.a ../dic/libdic.a @QT_LIBS@ @LIBINTL@ @LIBCONFIG_LIBS@
eliot_LDADD = ../game/libgame.a ../dic/libdic.a @QT_LIBS@ @LIBINTL@ @LIBCONFIG_LIBS@ @ARABICA_LIBS@
# Generate a cpp file from the resources
resources.cpp: eliot.qrc $(RESOURCES)

View file

@ -21,7 +21,6 @@
#include "config.h"
#include <iostream>
#include <fstream>
#include <QtGui/QLabel>
#include <QtGui/QMessageBox>
#include <QtGui/QFileDialog>
@ -263,19 +262,17 @@ void MainWindow::updateForGame(const PublicGame *iGame)
else
{
m_actionGamePrint->setEnabled(true);
m_actionGameSaveAs->setEnabled(true);
if (iGame->getMode() == PublicGame::kTRAINING)
{
m_actionGameSaveAs->setEnabled(true);
setWindowTitle(_q("Training mode") + " - Eliot");
}
else if (iGame->getMode() == PublicGame::kDUPLICATE)
{
m_actionGameSaveAs->setEnabled(false);
setWindowTitle(_q("Duplicate game") + " - Eliot");
}
else
{
m_actionGameSaveAs->setEnabled(false);
setWindowTitle(_q("Free game") + " - Eliot");
}
}
@ -503,14 +500,17 @@ void MainWindow::onGameLoad()
QString fileName = QFileDialog::getOpenFileName(this, _q("Load a game"));
if (fileName != "")
{
destroyCurrentGame();
Game *tmpGame = GameFactory::Instance()->load(qtl(fileName), *m_dic);
if (tmpGame == NULL)
try
{
displayErrorMsg(_q("Error while loading the game"));
PublicGame *tmpGame = PublicGame::load(qtl(fileName), *m_dic);
destroyCurrentGame();
m_game = tmpGame;
}
catch (std::exception &e)
{
displayErrorMsg(_q("Error while loading the game:\n") + e.what());
return;
}
m_game = new PublicGame(*tmpGame);
m_ui.groupBoxPlayers->show();
emit gameChangedNonConst(m_game);
emit gameChanged(m_game);
@ -528,9 +528,15 @@ void MainWindow::onGameSaveAs()
QString fileName = QFileDialog::getSaveFileName(this, _q("Save a game"));
if (fileName != "")
{
ofstream fout(qtl(fileName));
m_game->save(fout);
displayInfoMsg(_q("Game saved"));
try
{
m_game->save(qtl(fileName));
displayInfoMsg(_q("Game saved"));
}
catch (std::exception &e)
{
displayErrorMsg(_q("Error saving game: %1").arg(e.what()));
}
}
}

View file

@ -139,7 +139,7 @@ PublicGame * NewGame::createGame(const Dictionary &iDic) const
}
else
{
const_cast<Player *>(&game->getPlayer(0))->setName(qtw(_q("Training")));
game->addPlayer(new HumanPlayer);
}
// Joker game?

View file

@ -49,10 +49,6 @@ training_cross4 0
# Joker problem on game load
training_joker 0
# Joker problem on game search
# Eliot Rosace coup 10 nuageuse dans la recherche
training_joker2 0
#################
# Duplicate mode
#################

View file

@ -4,15 +4,15 @@ commande> d 1 0
mode duplicate
[?] pour l'aide
commande> a T
Joueur 0: UAXEHTS
Rack 0: UAXEHTS
commande> j SEAUX H8
commande> a S
Joueur 0: 48
Score 0: 48
commande> a T
Joueur 0: HTIUONU
Rack 0: HT+IUONU
commande> j HUTIN i9
commande> a S
Joueur 0: 85
Score 0: 85
commande> a t
OUNEUNE
commande> a g
@ -33,19 +33,18 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 1
Game: mode=Duplicate
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | UAXEHTS | SEAUX | H8 | 48 |
2 | 0 | HT+IUONU | HUTIN | I9 | 37 |
Game type: Duplicate
Player 0: Human
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | UAXEHTS | SEAUX | H8 | 48 | 0 |
2 | HT+IUONU | HUTIN | I9 | 37 | 0 |
Total: 85
Rack 0: OU+NEUNE
Score 0: 85
commande> q
fin du mode duplicate
commande> q

View file

@ -4,48 +4,47 @@ commande> d 0 2
mode duplicate
[?] pour l'aide
commande> a S
Joueur 0: 929
Joueur 1: 929
Score 0: 929
Score 1: 929
commande> a T
Joueur 0: TTV
Joueur 1: TTV
Rack 0: TTV
Rack 1: TTV
commande> a l
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 1 0 2 0 1 0 0 0 0 0
commande> a p
Eliot 1.5
Game: player 1 out of 2
Game: mode=Duplicate
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | ?EBAAEF | FABAcEE | H4 | 80 | *
2 | 0 | KEELIFE | KIEF | 10F | 36 |
3 | 0 | EEEL+IJX | FIXEE | 4H | 34 |
4 | 0 | EJL+RANS | JALES | J6 | 49 |
5 | 0 | NR+OAHPU | HURON | 5K | 28 |
6 | 0 | AP+MOEIA | LIPOME | 8J | 36 |
7 | 0 | AA+SMOND | ADONNAMES | O1 | 86 | *
8 | 0 | LEATCYL | CATLEYA | 5B | 36 |
9 | 0 | L+EARBHO | BROCHA | B2 | 42 |
10 | 0 | EL+OSULA | ALLOUES | A6 | 81 | *
11 | 0 | DSNIMEN | DEMIS | I1 | 28 |
12 | 0 | INN+NQUS | QUINTS | D1 | 42 |
13 | 0 | NN+IEUR? | MUNIRENt | N8 | 72 | *
14 | 0 | ISITTIE | EDITS | 1H | 21 |
15 | 0 | IIT+NEOP | POTINIER | 12G | 72 | *
16 | 0 | DVZEAET | DZETA | 15K | 72 |
17 | 0 | ETV+RWEV | EWE | F5 | 32 |
18 | 0 | ERTVV+TC | YET | G5 | 31 |
19 | 0 | CRTVV+UR | REVUE | M11 | 30 |
20 | 0 | CRTV+TUL | CRUEL | 2F | 21 |
Game type: Duplicate
Player 0: Computer
Player 1: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | ?EBAAEF | FABAcEE | H4 | 80 | 0 | *
2 | KEELIFE | KIEF | 10F | 36 | 0 |
3 | EEEL+IJX | FIXEE | 4H | 34 | 0 |
4 | EJL+RANS | JALES | J6 | 49 | 0 |
5 | NR+OAHPU | HURON | 5K | 28 | 0 |
6 | AP+MOEIA | LIPOME | 8J | 36 | 0 |
7 | AA+SMOND | ADONNAMES | O1 | 86 | 0 | *
8 | LEATCYL | CATLEYA | 5B | 36 | 0 |
9 | L+EARBHO | BROCHA | B2 | 42 | 0 |
10 | EL+OSULA | ALLOUES | A6 | 81 | 0 | *
11 | DSNIMEN | DEMIS | I1 | 28 | 0 |
12 | INN+NQUS | QUINTS | D1 | 42 | 0 |
13 | NN+IEUR? | MUNIRENt | N8 | 72 | 0 | *
14 | ISITTIE | EDITS | 1H | 21 | 0 |
15 | IIT+NEOP | POTINIER | 12G | 72 | 0 | *
16 | DVZEAET | DZETA | 15K | 72 | 0 |
17 | ETV+RWEV | EWE | F5 | 32 | 0 |
18 | ERTVV+TC | YET | G5 | 31 | 0 |
19 | CRTVV+UR | REVUE | M11 | 30 | 0 |
20 | CRTV+TUL | CRUEL | 2F | 21 | 0 |
Total: 929
Rack 0: TTV
Rack 1: TTV
Score 0: 929
Score 1: 929
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
A - - - - - A L L O U E S - - -

View file

@ -21,36 +21,35 @@ commande> a g
N - - - U - - - I - V I D E R -
O F A U X - - - S - - - E - - -
commande> a p
Eliot 1.5
Game: player 1 out of 1
Game: mode=Duplicate
Game: variant=explosive
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | HSGPYEL | GLYPHES | H2 | 114 | *
2 | 0 | OIAWEFR | FERIA | 1D | 105 |
3 | 0 | OW+HGBAE | BOGHEY | 4C | 42 |
4 | 0 | AW+EDESK | KWAS | 2B | 51 |
5 | 0 | DEE+PISA | SPEEDAIS | 8H | 89 | *
6 | 0 | OAADEIR | WEBRADIO | C2 | 46 |
7 | 0 | A+ZTTNUE | ATTENUEZ | K5 | 118 | *
8 | 0 | CEUIELN | GENICULE | E4 | 94 | *
9 | 0 | TVIRETR | TREVIRAT | M2 | 76 | *
10 | 0 | CSN?UXN | CEUX | 4L | 50 |
11 | 0 | NNS?+LOT | PLaNTONS | I8 | 61 | *
12 | 0 | ?OUANAF | FAUX | O1 | 48 |
13 | 0 | ANO?+RTI | NOTeRAIT | 12B | 77 | *
14 | 0 | MLIEDNO | ZOIDE | 12K | 32 |
15 | 0 | LMN+AUSE | SUA | I4 | 34 |
16 | 0 | ELMN+ARE | LAINEE | H10 | 31 |
17 | 0 | MR+IVMEL | VIDER | N10 | 34 |
18 | 0 | LMM+QUEJ | JAUNE | 6B | 30 |
19 | 0 | LMMQ+OSM | MOS | 10A | 27 |
Game type: Duplicate
Player 0: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | HSGPYEL | GLYPHES | H2 | 114 | 0 | *
2 | OIAWEFR | FERIA | 1D | 105 | 0 |
3 | OW+HGBAE | BOGHEY | 4C | 42 | 0 |
4 | AW+EDESK | KWAS | 2B | 51 | 0 |
5 | DEE+PISA | SPEEDAIS | 8H | 89 | 0 | *
6 | OAADEIR | WEBRADIO | C2 | 46 | 0 |
7 | A+ZTTNUE | ATTENUEZ | K5 | 118 | 0 | *
8 | CEUIELN | GENICULE | E4 | 94 | 0 | *
9 | TVIRETR | TREVIRAT | M2 | 76 | 0 | *
10 | CSN?UXN | CEUX | 4L | 50 | 0 |
11 | NNS?+LOT | PLaNTONS | I8 | 61 | 0 | *
12 | ?OUANAF | FAUX | O1 | 48 | 0 |
13 | ANO?+RTI | NOTeRAIT | 12B | 77 | 0 | *
14 | MLIEDNO | ZOIDE | 12K | 32 | 0 |
15 | LMN+AUSE | SUA | I4 | 34 | 0 |
16 | ELMN+ARE | LAINEE | H10 | 31 | 0 |
17 | MR+IVMEL | VIDER | N10 | 34 | 0 |
18 | LMM+QUEJ | JAUNE | 6B | 30 | 0 |
19 | LMMQ+OSM | MOS | 10A | 27 | 0 |
Total: 1159
Rack 0: LMMQ
Score 0: 1159
commande> q
fin du mode duplicate
commande> q

View file

@ -4,38 +4,38 @@ commande> d 2 1
mode duplicate
[?] pour l'aide
commande> a T
Joueur 0: ATOYDSI
Joueur 1: ATOYDSI
Joueur 2: ATOYDSI
Rack 0: ATOYDSI
Rack 1: ATOYDSI
Rack 2: ATOYDSI
commande> j DOSAIT H4
commande> j DOSAIT h5
commande> a S
Joueur 0: 18
Joueur 1: 14
Joueur 2: 30
Score 0: 18
Score 1: 14
Score 2: 30
commande> a T
Joueur 0: DIAEINS
Joueur 1: DIAEINS
Joueur 2: DIAEINS
Rack 0: DI+AEINS
Rack 1: DI+AEINS
Rack 2: DI+AEINS
commande> n 1
commande> j DISAIENT 7A
commande> a S
Joueur 0: 18
Joueur 1: 75
Joueur 2: 30
Score 0: 18
Score 1: 75
Score 2: 30
commande> j DESTINAI 7E
commande> a S
Joueur 0: 79
Joueur 1: 75
Joueur 2: 93
Score 0: 79
Score 1: 75
Score 2: 93
commande> a t
P?RBFEG
commande> j FRaYE 5E
commande> j BoY 5F
commande> a S
Joueur 0: 124
Joueur 1: 93
Joueur 2: 138
Score 0: 124
Score 1: 93
Score 2: 138
commande> a t
BGPBEET
commande> a g
@ -56,24 +56,23 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 3
Game: mode=Duplicate
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 2 | ATOYDSI | OYATS | H4 | 30 |
2 | 2 | DI+AEINS | DENIAISA | 6A | 63 | *
3 | 0 | P?RBFEG | FRaYE | 5E | 45 |
Game type: Duplicate
Player 0: Human
Player 1: Human
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | ATOYDSI | OYATS | H4 | 30 | 2 |
2 | DI+AEINS | DENIAISA | 6A | 63 | 2 | *
3 | P?RBFEG | FRaYE | 5E | 45 | 0 |
Total: 138
Rack 0: BGP+BEET
Rack 1: BGP+BEET
Rack 2: BGP+BEET
Score 0: 124
Score 1: 93
Score 2: 138
commande> q
fin du mode duplicate
commande> q

View file

@ -9,48 +9,46 @@ ILERERU
commande> j RELIEUR 8E
commande> j ERROR H2
commande> a T
Joueur 0: EEILRRU
Joueur 1: EEILRRU
Rack 0: EEILRRU
Rack 1: EEILRRU
commande> a S
Joueur 0: 0
Joueur 1: 0
Score 0: 0
Score 1: 0
commande> a p
Eliot 1.5
Game: player 1 out of 2
Game: mode=Duplicate
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
Game type: Duplicate
Player 0: Human
Player 1: Human
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
Total: 0
Rack 0: EEILRRU
Rack 1: EEILRRU
Score 0: 0
Score 1: 0
commande> j RELIURE h4
commande> j RELIEUR h4
commande> a S
Joueur 0: 66
Joueur 1: 66
Score 0: 66
Score 1: 66
commande> a T
Joueur 0: GUAUVBP
Joueur 1: GUAUVBP
Rack 0: GUAUVBP
Rack 1: GUAUVBP
commande> a p
Eliot 1.5
Game: player 1 out of 2
Game: mode=Duplicate
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | EEILRRU | RELIURE | H4 | 66 | *
Game type: Duplicate
Player 0: Human
Player 1: Human
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | EEILRRU | RELIURE | H4 | 66 | 0 | *
Total: 66
Rack 0: GUAUVBP
Rack 1: GUAUVBP
Score 0: 66
Score 1: 66
commande> q
fin du mode duplicate
commande> q

View file

@ -7,8 +7,8 @@ commande> a t
AK?EZEN
commande> j gENEZ h8
commande> a S
Joueur 0: 46
Joueur 1: 48
Score 0: 46
Score 1: 48
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
A - - - - - - - - - - - - - - -
@ -30,20 +30,19 @@ commande> a l
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
8 2 2 3 13 2 2 2 8 1 0 5 3 5 6 2 1 6 5 6 6 2 1 1 1 1 2
commande> a p
Eliot 1.5
Game: player 1 out of 2
Game: mode=Duplicate
Game: variant=joker
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 1 | AK?EZEN | AKENEs | H3 | 48 |
Game type: Duplicate
Player 0: Human
Player 1: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | AK?EZEN | AKENEs | H3 | 48 | 1 |
Total: 48
Rack 0: Z+IL?ENT
Rack 1: Z+IL?ENT
Score 0: 46
Score 1: 48
commande> j pLANTIEZ 3f
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -66,21 +65,20 @@ commande> a l
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
8 2 2 3 12 2 2 2 7 1 0 4 3 4 6 1 1 6 5 5 6 2 1 1 1 0 2
commande> a p
Eliot 1.5
Game: player 1 out of 2
Game: mode=Duplicate
Game: variant=joker
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 1 | AK?EZEN | AKENEs | H3 | 48 |
2 | 0 | Z+IL?ENT | pLANTIEZ | 3F | 86 | *
Game type: Duplicate
Player 0: Human
Player 1: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | AK?EZEN | AKENEs | H3 | 48 | 1 |
2 | Z+IL?ENT | pLANTIEZ | 3F | 86 | 0 | *
Total: 134
Rack 0: DEDOTC?
Rack 1: DEDOTC?
Score 0: 132
Score 1: 134
commande> j DECODaT g5
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -103,22 +101,21 @@ commande> a l
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
7 2 1 1 11 2 2 2 7 1 0 4 3 4 5 1 1 6 5 4 6 2 1 1 1 0 2
commande> a p
Eliot 1.5
Game: player 1 out of 2
Game: mode=Duplicate
Game: variant=joker
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 1 | AK?EZEN | AKENEs | H3 | 48 |
2 | 0 | Z+IL?ENT | pLANTIEZ | 3F | 86 | *
3 | 0 | DEDOTC? | DECODaT | G5 | 79 | *
Game type: Duplicate
Player 0: Human
Player 1: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | AK?EZEN | AKENEs | H3 | 48 | 1 |
2 | Z+IL?ENT | pLANTIEZ | 3F | 86 | 0 | *
3 | DEDOTC? | DECODaT | G5 | 79 | 0 | *
Total: 213
Rack 0: RABEGE?
Rack 1: RABEGE?
Score 0: 211
Score 1: 213
commande> j dEPLANTIEZ 3d
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -141,23 +138,22 @@ commande> a l
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
6 1 1 1 9 2 1 1 7 1 0 4 3 4 5 1 1 5 5 4 6 2 1 1 1 0 2
commande> a p
Eliot 1.5
Game: player 1 out of 2
Game: mode=Duplicate
Game: variant=joker
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 1 | AK?EZEN | AKENEs | H3 | 48 |
2 | 0 | Z+IL?ENT | pLANTIEZ | 3F | 86 | *
3 | 0 | DEDOTC? | DECODaT | G5 | 79 | *
4 | 1 | RABEGE? | hEBERGEA | L2 | 72 | *
Game type: Duplicate
Player 0: Human
Player 1: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | AK?EZEN | AKENEs | H3 | 48 | 1 |
2 | Z+IL?ENT | pLANTIEZ | 3F | 86 | 0 | *
3 | DEDOTC? | DECODaT | G5 | 79 | 0 | *
4 | RABEGE? | hEBERGEA | L2 | 72 | 1 | *
Total: 285
Rack 0: X?MFETR
Rack 1: X?MFETR
Score 0: 231
Score 1: 285
commande> h p
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -177,22 +173,21 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 2
Game: mode=Duplicate
Game: variant=joker
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 1 | AK?EZEN | AKENEs | H3 | 48 |
2 | 0 | Z+IL?ENT | pLANTIEZ | 3F | 86 | *
3 | 0 | DEDOTC? | DECODaT | G5 | 79 | *
Game type: Duplicate
Player 0: Human
Player 1: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | AK?EZEN | AKENEs | H3 | 48 | 1 |
2 | Z+IL?ENT | pLANTIEZ | 3F | 86 | 0 | *
3 | DEDOTC? | DECODaT | G5 | 79 | 0 | *
Total: 213
Rack 0: RABEGE?
Rack 1: RABEGE?
Score 0: 211
Score 1: 213
commande> h p
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -212,21 +207,20 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 2
Game: mode=Duplicate
Game: variant=joker
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 1 | AK?EZEN | AKENEs | H3 | 48 |
2 | 0 | Z+IL?ENT | pLANTIEZ | 3F | 86 | *
Game type: Duplicate
Player 0: Human
Player 1: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | AK?EZEN | AKENEs | H3 | 48 | 1 |
2 | Z+IL?ENT | pLANTIEZ | 3F | 86 | 0 | *
Total: 134
Rack 0: DEDOTC?
Rack 1: DEDOTC?
Score 0: 132
Score 1: 134
commande> a l
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
8 2 2 3 12 2 2 2 7 1 0 4 3 4 6 1 1 6 5 5 6 2 1 1 1 0 2

View file

@ -24,21 +24,20 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 2 out of 3
Game: mode=Duplicate
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
Game type: Duplicate
Player 0: Human
Player 1: Human
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
Total: 0
Rack 0: JL
Rack 1: IMEJVSL
Rack 2: IMEJVSL
Score 0: 26
Score 1: 0
Score 2: 0
commande> h p
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -58,21 +57,20 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 2 out of 3
Game: mode=Duplicate
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
Game type: Duplicate
Player 0: Human
Player 1: Human
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
Total: 0
Rack 0: IMEJVSL
Rack 1: IMEJVSL
Rack 2: IMEJVSL
Score 0: 0
Score 1: 0
Score 2: 0
commande> h n
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -92,21 +90,20 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 2 out of 3
Game: mode=Duplicate
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
Game type: Duplicate
Player 0: Human
Player 1: Human
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
Total: 0
Rack 0: JL
Rack 1: IMEJVSL
Rack 2: IMEJVSL
Score 0: 26
Score 1: 0
Score 2: 0
commande> j JE h8
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -126,22 +123,21 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 3
Game: mode=Duplicate
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | IMEJVSL | VIMES | H4 | 26 |
Game type: Duplicate
Player 0: Human
Player 1: Human
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | IMEJVSL | VIMES | H4 | 26 | 0 |
Total: 26
Rack 0: JL+NHAYG
Rack 1: JL+NHAYG
Rack 2: JL+NHAYG
Score 0: 26
Score 1: 18
Score 2: 26
commande> h p
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -161,21 +157,20 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 3
Game: mode=Duplicate
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
Game type: Duplicate
Player 0: Human
Player 1: Human
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
Total: 0
Rack 0: IMEJVSL
Rack 1: IMEJVSL
Rack 2: IMEJVSL
Score 0: 0
Score 1: 0
Score 2: 0
commande> h n
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -195,32 +190,31 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 3
Game: mode=Duplicate
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | IMEJVSL | VIMES | H4 | 26 |
Game type: Duplicate
Player 0: Human
Player 1: Human
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | IMEJVSL | VIMES | H4 | 26 | 0 |
Total: 26
Rack 0: JL+NHAYG
Rack 1: JL+NHAYG
Rack 2: JL+NHAYG
Score 0: 26
Score 1: 18
Score 2: 26
commande> n 1
commande> j JAN g7
commande> a T
Joueur 0: JLNHAYG
Joueur 1: GHLY
Joueur 2: JLNHAYG
Rack 0: JL+NHAYG
Rack 1: GHLY
Rack 2: JL+NHAYG
commande> a S
Joueur 0: 26
Joueur 1: 56
Joueur 2: 26
Score 0: 26
Score 1: 56
Score 2: 26
commande> h r
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -240,22 +234,21 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 3
Game: mode=Duplicate
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | IMEJVSL | VIMES | H4 | 26 |
Game type: Duplicate
Player 0: Human
Player 1: Human
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | IMEJVSL | VIMES | H4 | 26 | 0 |
Total: 26
Rack 0: JL+NHAYG
Rack 1: GHLY
Rack 2: JL+NHAYG
Score 0: 26
Score 1: 56
Score 2: 26
commande> j AH i6
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -275,23 +268,22 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 3
Game: mode=Duplicate
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | IMEJVSL | VIMES | H4 | 26 |
2 | 1 | JL+NHAYG | JAN | G7 | 38 |
Game type: Duplicate
Player 0: Human
Player 1: Human
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | IMEJVSL | VIMES | H4 | 26 | 0 |
2 | JL+NHAYG | JAN | G7 | 38 | 1 |
Total: 64
Rack 0: GHLY+ELA
Rack 1: GHLY+ELA
Rack 2: GHLY+ELA
Score 0: 47
Score 1: 56
Score 2: 64
commande> j AY f9
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -311,27 +303,26 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 2 out of 3
Game: mode=Duplicate
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | IMEJVSL | VIMES | H4 | 26 |
2 | 1 | JL+NHAYG | JAN | G7 | 38 |
Game type: Duplicate
Player 0: Human
Player 1: Human
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | IMEJVSL | VIMES | H4 | 26 | 0 |
2 | JL+NHAYG | JAN | G7 | 38 | 1 |
Total: 64
Rack 0: EGHLL
Rack 1: GHLY+ELA
Rack 2: GHLY+ELA
Score 0: 80
Score 1: 56
Score 2: 64
commande> a S
Joueur 0: 80
Joueur 1: 56
Joueur 2: 64
Score 0: 80
Score 1: 56
Score 2: 64
commande> h f
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -351,21 +342,20 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 2 out of 3
Game: mode=Duplicate
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
Game type: Duplicate
Player 0: Human
Player 1: Human
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
Total: 0
Rack 0: IMEJVSL
Rack 1: IMEJVSL
Rack 2: IMEJVSL
Score 0: 0
Score 1: 0
Score 2: 0
commande> h n
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -385,22 +375,21 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 2 out of 3
Game: mode=Duplicate
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | IMEJVSL | VIMES | H4 | 26 |
Game type: Duplicate
Player 0: Human
Player 1: Human
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | IMEJVSL | VIMES | H4 | 26 | 0 |
Total: 26
Rack 0: JL+NHAYG
Rack 1: JL+NHAYG
Rack 2: JL+NHAYG
Score 0: 26
Score 1: 18
Score 2: 26
commande> h l
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -420,23 +409,22 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 2 out of 3
Game: mode=Duplicate
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | IMEJVSL | VIMES | H4 | 26 |
2 | 1 | JL+NHAYG | JAN | G7 | 38 |
Game type: Duplicate
Player 0: Human
Player 1: Human
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | IMEJVSL | VIMES | H4 | 26 | 0 |
2 | JL+NHAYG | JAN | G7 | 38 | 1 |
Total: 64
Rack 0: EGHLL
Rack 1: GHLY+ELA
Rack 2: GHLY+ELA
Score 0: 80
Score 1: 56
Score 2: 64
commande> h p
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -456,23 +444,22 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 2 out of 3
Game: mode=Duplicate
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | IMEJVSL | VIMES | H4 | 26 |
2 | 1 | JL+NHAYG | JAN | G7 | 38 |
Game type: Duplicate
Player 0: Human
Player 1: Human
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | IMEJVSL | VIMES | H4 | 26 | 0 |
2 | JL+NHAYG | JAN | G7 | 38 | 1 |
Total: 64
Rack 0: GHLY+ELA
Rack 1: GHLY+ELA
Rack 2: GHLY+ELA
Score 0: 47
Score 1: 56
Score 2: 64
commande> h p
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -492,22 +479,21 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 2 out of 3
Game: mode=Duplicate
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | IMEJVSL | VIMES | H4 | 26 |
Game type: Duplicate
Player 0: Human
Player 1: Human
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | IMEJVSL | VIMES | H4 | 26 | 0 |
Total: 26
Rack 0: JL+NHAYG
Rack 1: JL+NHAYG
Rack 2: JL+NHAYG
Score 0: 26
Score 1: 18
Score 2: 26
commande> j JAN g7
Cannot add a command to an old turn
commande> h r
@ -529,22 +515,21 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 2 out of 3
Game: mode=Duplicate
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | IMEJVSL | VIMES | H4 | 26 |
Game type: Duplicate
Player 0: Human
Player 1: Human
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | IMEJVSL | VIMES | H4 | 26 | 0 |
Total: 26
Rack 0: JL+NHAYG
Rack 1: JL+NHAYG
Rack 2: JL+NHAYG
Score 0: 26
Score 1: 18
Score 2: 26
commande> j JAN g7
commande> j JE 7G
commande> a g
@ -565,23 +550,22 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 3
Game: mode=Duplicate
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | IMEJVSL | VIMES | H4 | 26 |
2 | 1 | JL+NHAYG | JAN | G7 | 38 |
Game type: Duplicate
Player 0: Human
Player 1: Human
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | IMEJVSL | VIMES | H4 | 26 | 0 |
2 | JL+NHAYG | JAN | G7 | 38 | 1 |
Total: 64
Rack 0: GHLY+ITA
Rack 1: GHLY+ITA
Rack 2: GHLY+ITA
Score 0: 43
Score 1: 56
Score 2: 64
commande> q
fin du mode duplicate
commande> q

View file

@ -9,26 +9,25 @@ ATNE??A
commande> j XXX a1
commande> j ay h8
commande> a T
Joueur 0: AAENTUL
Joueur 1: AAENTUL
Rack 0: AAENT+UL
Rack 1: AAENT+UL
commande> a S
Joueur 0: 0
Joueur 1: 0
Score 0: 0
Score 1: 0
commande> a p
Eliot 1.5
Game: player 1 out of 2
Game: mode=Duplicate
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 1 | ATNE??A | ay | H8 | 0 |
Game type: Duplicate
Player 0: Human
Player 1: Human
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | ATNE??A | ay | H8 | 0 | 1 |
Total: 0
Rack 0: AAENT+UL
Rack 1: AAENT+UL
Score 0: 0
Score 1: 0
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
A - - - - - - - - - - - - - - -

View file

@ -4,46 +4,45 @@ commande> l 0 3
mode partie libre
[?] pour l'aide
commande> a T
Joueur 0: KSROCT
Joueur 1:
Joueur 2: DIUDGEA
Rack 0: KS+ROCT
Rack 1:
Rack 2: DIU+DGEA
commande> a S
Joueur 0: 296
Joueur 1: 362
Joueur 2: 263
Score 0: 296
Score 1: 362
Score 2: 263
commande> a p
Eliot 1.5
Game: player 2 out of 3
Game: mode=Free game
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | RAHITRD | HARDI | H4 | 26 |
2 | 1 | ?TIEXFA | FAXAIEnT | 5E | 126 | *
3 | 2 | ATOSBUF | BOUTEFAS | J1 | 73 | *
4 | 0 | RT+AREEN | ENTERRAI | 8A | 77 | *
5 | 1 | RZUGNSS | AZURS | F5 | 34 |
6 | 2 | MIMLLOP | PLOMB | 1F | 30 |
7 | 0 | EEMNETV | VETEMENT | C6 | 78 | *
8 | 1 | GNRS+PEN | PURGES | 3I | 24 |
9 | 2 | ILM+HSVI | VIS | 14A | 25 |
10 | 0 | AWELOUB | BAVE | A12 | 36 |
11 | 1 | NN+ELEEE | SELENE | 8J | 21 |
12 | 2 | HILM+?IC | aLCHIMIE | A1 | 101 | *
13 | 0 | LOUW+ULS | SLOW | N3 | 33 |
14 | 1 | EN+STAAI | NANTAISE | N8 | 70 | *
15 | 2 | DIJUUYO | JOYAU | 12K | 44 |
16 | 0 | LSUU+KAQ | AUQUEL | 15J | 63 |
17 | 1 | OENIREN | NERONIEN | 10G | 60 | *
Game type: Free game
Player 0: Computer
Player 1: Computer
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | RAHITRD | HARDI | H4 | 26 | 0 |
2 | ?TIEXFA | FAXAIEnT | 5E | 126 | 1 | *
3 | ATOSBUF | BOUTEFAS | J1 | 73 | 2 | *
4 | RT+AREEN | ENTERRAI | 8A | 77 | 0 | *
5 | RZUGNSS | AZURS | F5 | 34 | 1 |
6 | MIMLLOP | PLOMB | 1F | 30 | 2 |
7 | EEMNETV | VETEMENT | C6 | 78 | 0 | *
8 | GNRS+PEN | PURGES | 3I | 24 | 1 |
9 | ILM+HSVI | VIS | 14A | 25 | 2 |
10 | AWELOUB | BAVE | A12 | 36 | 0 |
11 | NN+ELEEE | SELENE | 8J | 21 | 1 |
12 | HILM+?IC | aLCHIMIE | A1 | 101 | 2 | *
13 | LOUW+ULS | SLOW | N3 | 33 | 0 |
14 | EN+STAAI | NANTAISE | N8 | 70 | 1 | *
15 | DIJUUYO | JOYAU | 12K | 44 | 2 |
16 | LSUU+KAQ | AUQUEL | 15J | 63 | 0 |
17 | OENIREN | NERONIEN | 10G | 60 | 1 | *
Total: 921
Rack 0: KS+ROCT
Rack 1:
Rack 2: DIU+DGEA
Score 0: 296
Score 1: 362
Score 2: 263
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
A a L C H I M I E - - - B A V E

View file

@ -4,46 +4,45 @@ commande> l 2 0
mode partie libre
[?] pour l'aide
commande> a T
Joueur 0: JNNEDEI
Joueur 1: TLAEOWA
Rack 0: JNNEDEI
Rack 1: TLAEOWA
commande> p JID
commande> a T
Joueur 0: EENNMEN
Joueur 1: TLAEOWA
Rack 0: EENN+MEN
Rack 1: TLAEOWA
commande> p aowalt
commande> a T
Joueur 0: EENNMEN
Joueur 1: EEEGAIS
Rack 0: EENN+MEN
Rack 1: E+EEGAIS
commande> p MA
commande> a T
Joueur 0: EENNMEN
Joueur 1: EEEGAIS
Rack 0: EENN+MEN
Rack 1: E+EEGAIS
commande> p MN
commande> a T
Joueur 0: EEENNER
Joueur 1: EEEGAIS
Rack 0: EEENN+ER
Rack 1: E+EEGAIS
commande> p SGEEEAI
commande> a T
Joueur 0: EEENNER
Joueur 1: HAAUAUO
Rack 0: EEENN+ER
Rack 1: HAAUAUO
commande> a p
Eliot 1.5
Game: player 1 out of 2
Game: mode=Free game
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | JNNEDEI | [JID] | - | 0 |
2 | 1 | TLAEOWA | [AOWALT] | - | 0 |
3 | 0 | EENN+MEN | [MN] | - | 0 |
4 | 1 | E+EEGAIS | [SGEEEAI] | - | 0 |
Game type: Free game
Player 0: Human
Player 1: Human
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | JNNEDEI | (-JID) | - | 0 | 0 |
2 | TLAEOWA | (-AOWALT) | - | 0 | 1 |
3 | EENN+MEN | (-MN) | - | 0 | 0 |
4 | E+EEGAIS | (-SGEEEAI) | - | 0 | 1 |
Total: 0
Rack 0: EEENN+ER
Rack 1: HAAUAUO
Score 0: 0
Score 1: 0
commande> q
fin du mode partie libre
commande> q

View file

@ -4,8 +4,8 @@ commande> le 1 1
mode partie libre
[?] pour l'aide
commande> a T
Joueur 0: ETUDALN
Joueur 1: HMIRCES
Rack 0: ETUDALN
Rack 1: HMIRCES
commande> j ADULENT h3
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -25,8 +25,8 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a T
Joueur 0: XRAETEL
Joueur 1: UEQNIKN
Rack 0: XRAETEL
Rack 1: UEQNIKN
commande> j EXULTERA 5f
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -46,8 +46,8 @@ commande> a g
N - - - N I Q U E - - - - - - -
O - - - - - - - - - - - - - - -
commande> a T
Joueur 0: DITTSAE
Joueur 1: KNPRRJE
Rack 0: DITTSAE
Rack 1: KN+PRRJE
commande> j EDITATES F5
commande> a gm
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -67,8 +67,8 @@ commande> a gm
N - # - N I Q U E - * - - - # -
O @ - - + - - - R - - - + - - @
commande> a T
Joueur 0: ERIMASG
Joueur 1: NPVRNOE
Rack 0: ERIMASG
Rack 1: NP+VRNOE
commande> j EGERMAIS 11d
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -88,30 +88,29 @@ commande> a g
N - - - N I Q U E - - - - - - -
O - - - - - - - R - - - - - - -
commande> a S
Joueur 0: 309
Joueur 1: 248
Score 0: 309
Score 1: 248
commande> a p
Eliot 1.5
Game: player 1 out of 2
Game: mode=Free game
Game: variant=explosive
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | ETUDALN | ADULENT | H3 | 70 | *
2 | 1 | HMIRCES | CHARISME | 3F | 88 | *
3 | 0 | XRAETEL | EXULTERA | 5F | 84 | *
4 | 1 | UEQNIKN | NIQUE | N4 | 46 |
5 | 0 | DITTSAE | EDITATES | F5 | 65 | *
6 | 1 | KN+PRRJE | JERKER | 8J | 69 |
7 | 0 | ERIMASG | EGERMAIS | 11D | 90 | *
8 | 1 | NP+VRNOE | PREVOT | 8A | 45 |
Game type: Free game
Player 0: Human
Player 1: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | ETUDALN | ADULENT | H3 | 70 | 0 | *
2 | HMIRCES | CHARISME | 3F | 88 | 1 | *
3 | XRAETEL | EXULTERA | 5F | 84 | 0 | *
4 | UEQNIKN | NIQUE | N4 | 46 | 1 |
5 | DITTSAE | EDITATES | F5 | 65 | 0 | *
6 | KN+PRRJE | JERKER | 8J | 69 | 1 |
7 | ERIMASG | EGERMAIS | 11D | 90 | 0 | *
8 | NP+VRNOE | PREVOT | 8A | 45 | 1 |
Total: 557
Rack 0: LANBDII
Rack 1: NN+ITEGU
Score 0: 309
Score 1: 248
commande> q
fin du mode partie libre
commande> q

View file

@ -4,8 +4,8 @@ commande> lj 1 1
mode partie libre
[?] pour l'aide
commande> a T
Joueur 0: ?AAUGOE
Joueur 1: EP?TFTI
Rack 0: ?AAUGOE
Rack 1: EP?TFTI
commande> p
commande> p
commande> p
@ -32,29 +32,28 @@ commande> a l
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
6 0 1 2 11 1 2 2 6 1 1 5 2 5 5 1 1 3 4 4 5 1 0 1 1 1 2
commande> a p
Eliot 1.5
Game: player 1 out of 2
Game: mode=Free game
Game: variant=joker
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | ?AAUGOE | (PASS) | - | 0 |
2 | 1 | EP?TFTI | FrIPE | H4 | 26 |
3 | 0 | AAEGOU? | (PASS) | - | 0 |
4 | 1 | TT+EB?AN | BATEReNT | 5D | 86 | *
5 | 0 | AAEGOU? | (PASS) | - | 0 |
6 | 1 | RCWV?AB | WeB | 9G | 36 |
7 | 0 | AAEGOU? | (PASS) | - | 0 |
8 | 1 | ACRV+SA? | VAiNCRAS | J2 | 91 | *
9 | 0 | AAEGOU? | (PASS) | - | 0 |
10 | 1 | USOM?DM | MOrDUS | 10C | 34 |
Game type: Free game
Player 0: Human
Player 1: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | ?AAUGOE | (PASS) | - | 0 | 0 |
2 | EP?TFTI | FrIPE | H4 | 26 | 1 |
3 | AAEGOU? | (PASS) | - | 0 | 0 |
4 | TT+EB?AN | BATEReNT | 5D | 86 | 1 | *
5 | AAEGOU? | (PASS) | - | 0 | 0 |
6 | RCWV?AB | WeB | 9G | 36 | 1 |
7 | AAEGOU? | (PASS) | - | 0 | 0 |
8 | ACRV+SA? | VAiNCRAS | J2 | 91 | 1 | *
9 | AAEGOU? | (PASS) | - | 0 | 0 |
10 | USOM?DM | MOrDUS | 10C | 34 | 1 |
Total: 273
Rack 0: AAEGOU?
Rack 1: M+EEOSQ?
Score 0: 0
Score 1: 273
commande> j VExA 2J
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -74,8 +73,8 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a T
Joueur 0: AGOU?HD
Joueur 1: IRLF?DN
Rack 0: AGOU+?HD
Rack 1: IRLF?DN
commande> a l
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
5 0 1 2 8 1 2 2 6 1 1 5 1 5 4 1 0 3 3 4 4 1 0 0 1 1 2
@ -98,42 +97,41 @@ commande> a g
N L I N D O R - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a T
Joueur 0: ADGHUVC
Joueur 1: FUI?ONL
Rack 0: ADGHU+VC
Rack 1: F+UI?ONL
commande> a l
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
5 0 1 1 8 1 2 2 5 1 1 4 1 4 2 1 0 2 3 4 4 1 0 0 1 1 1
commande> p
commande> a p
Eliot 1.5
Game: player 1 out of 2
Game: mode=Free game
Game: variant=joker
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | ?AAUGOE | (PASS) | - | 0 |
2 | 1 | EP?TFTI | FrIPE | H4 | 26 |
3 | 0 | AAEGOU? | (PASS) | - | 0 |
4 | 1 | TT+EB?AN | BATEReNT | 5D | 86 | *
5 | 0 | AAEGOU? | (PASS) | - | 0 |
6 | 1 | RCWV?AB | WeB | 9G | 36 |
7 | 0 | AAEGOU? | (PASS) | - | 0 |
8 | 1 | ACRV+SA? | VAiNCRAS | J2 | 91 | *
9 | 0 | AAEGOU? | (PASS) | - | 0 |
10 | 1 | USOM?DM | MOrDUS | 10C | 34 |
11 | 0 | AAEGOU? | VExA | 2J | 6 |
12 | 1 | M+EEOSQ? | MORESQuE | E8 | 80 | *
13 | 0 | AGOU+?HD | ExO | 15E | 2 |
14 | 1 | IRLF?DN | LINDoR | N1 | 50 |
15 | 0 | ADGHU+VC | (PASS) | - | 0 |
16 | 1 | F+UI?ONL | FLIQUONs | 13B | 86 | *
Game type: Free game
Player 0: Human
Player 1: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | ?AAUGOE | (PASS) | - | 0 | 0 |
2 | EP?TFTI | FrIPE | H4 | 26 | 1 |
3 | AAEGOU? | (PASS) | - | 0 | 0 |
4 | TT+EB?AN | BATEReNT | 5D | 86 | 1 | *
5 | AAEGOU? | (PASS) | - | 0 | 0 |
6 | RCWV?AB | WeB | 9G | 36 | 1 |
7 | AAEGOU? | (PASS) | - | 0 | 0 |
8 | ACRV+SA? | VAiNCRAS | J2 | 91 | 1 | *
9 | AAEGOU? | (PASS) | - | 0 | 0 |
10 | USOM?DM | MOrDUS | 10C | 34 | 1 |
11 | AAEGOU? | VExA | 2J | 6 | 0 |
12 | M+EEOSQ? | MORESQuE | E8 | 80 | 1 | *
13 | AGOU+?HD | ExO | 15E | 2 | 0 |
14 | IRLF?DN | LINDoR | N1 | 50 | 1 |
15 | ADGHU+VC | (PASS) | - | 0 | 0 |
16 | F+UI?ONL | FLIQUONs | 13B | 86 | 1 | *
Total: 497
Rack 0: ACDGHUV
Rack 1: EATLZL?
Score 0: 8
Score 1: 489
commande> a l
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
5 0 1 1 8 0 2 2 4 1 1 3 1 3 1 1 0 2 2 4 3 1 0 0 1 1 1
@ -156,30 +154,29 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 2 out of 2
Game: mode=Free game
Game: variant=joker
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | ?AAUGOE | (PASS) | - | 0 |
2 | 1 | EP?TFTI | FrIPE | H4 | 26 |
3 | 0 | AAEGOU? | (PASS) | - | 0 |
4 | 1 | TT+EB?AN | BATEReNT | 5D | 86 | *
5 | 0 | AAEGOU? | (PASS) | - | 0 |
6 | 1 | RCWV?AB | WeB | 9G | 36 |
7 | 0 | AAEGOU? | (PASS) | - | 0 |
8 | 1 | ACRV+SA? | VAiNCRAS | J2 | 91 | *
9 | 0 | AAEGOU? | (PASS) | - | 0 |
10 | 1 | USOM?DM | MOrDUS | 10C | 34 |
11 | 0 | AAEGOU? | VExA | 2J | 6 |
Game type: Free game
Player 0: Human
Player 1: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | ?AAUGOE | (PASS) | - | 0 | 0 |
2 | EP?TFTI | FrIPE | H4 | 26 | 1 |
3 | AAEGOU? | (PASS) | - | 0 | 0 |
4 | TT+EB?AN | BATEReNT | 5D | 86 | 1 | *
5 | AAEGOU? | (PASS) | - | 0 | 0 |
6 | RCWV?AB | WeB | 9G | 36 | 1 |
7 | AAEGOU? | (PASS) | - | 0 | 0 |
8 | ACRV+SA? | VAiNCRAS | J2 | 91 | 1 | *
9 | AAEGOU? | (PASS) | - | 0 | 0 |
10 | USOM?DM | MOrDUS | 10C | 34 | 1 |
11 | AAEGOU? | VExA | 2J | 6 | 0 |
Total: 279
Rack 0: AGOU+?HD
Rack 1: M+EEOSQ?
Score 0: 6
Score 1: 273
commande> a l
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
5 0 1 2 10 1 2 2 6 1 1 5 2 5 5 1 1 3 4 4 5 1 0 0 1 1 2
@ -202,29 +199,28 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 2
Game: mode=Free game
Game: variant=joker
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | ?AAUGOE | (PASS) | - | 0 |
2 | 1 | EP?TFTI | FrIPE | H4 | 26 |
3 | 0 | AAEGOU? | (PASS) | - | 0 |
4 | 1 | TT+EB?AN | BATEReNT | 5D | 86 | *
5 | 0 | AAEGOU? | (PASS) | - | 0 |
6 | 1 | RCWV?AB | WeB | 9G | 36 |
7 | 0 | AAEGOU? | (PASS) | - | 0 |
8 | 1 | ACRV+SA? | VAiNCRAS | J2 | 91 | *
9 | 0 | AAEGOU? | (PASS) | - | 0 |
10 | 1 | USOM?DM | MOrDUS | 10C | 34 |
Game type: Free game
Player 0: Human
Player 1: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | ?AAUGOE | (PASS) | - | 0 | 0 |
2 | EP?TFTI | FrIPE | H4 | 26 | 1 |
3 | AAEGOU? | (PASS) | - | 0 | 0 |
4 | TT+EB?AN | BATEReNT | 5D | 86 | 1 | *
5 | AAEGOU? | (PASS) | - | 0 | 0 |
6 | RCWV?AB | WeB | 9G | 36 | 1 |
7 | AAEGOU? | (PASS) | - | 0 | 0 |
8 | ACRV+SA? | VAiNCRAS | J2 | 91 | 1 | *
9 | AAEGOU? | (PASS) | - | 0 | 0 |
10 | USOM?DM | MOrDUS | 10C | 34 | 1 |
Total: 273
Rack 0: AAEGOU?
Rack 1: M+EEOSQ?
Score 0: 0
Score 1: 273
commande> a l
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
6 0 1 2 11 1 2 2 6 1 1 5 2 5 5 1 1 3 4 4 5 1 0 1 1 1 2

View file

@ -4,9 +4,9 @@ commande> l 1 2
mode partie libre
[?] pour l'aide
commande> a T
Joueur 0: NONTEEL
Joueur 1: NBZEUAU
Joueur 2: NUDATMG
Rack 0: NONTEEL
Rack 1: NBZEUAU
Rack 2: NUDATMG
commande> j TONNE h4
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -26,24 +26,23 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 3
Game: mode=Free game
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | NONTEEL | TONNE | H4 | 12 |
2 | 1 | NBZEUAU | AUNEZ | 6F | 36 |
3 | 2 | NUDATMG | MATON | 5E | 18 |
Game type: Free game
Player 0: Human
Player 1: Computer
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | NONTEEL | TONNE | H4 | 12 | 0 |
2 | NBZEUAU | AUNEZ | 6F | 36 | 1 |
3 | NUDATMG | MATON | 5E | 18 | 2 |
Total: 66
Rack 0: EL+HI?WE
Rack 1: BNU+FYTE
Rack 2: DGU+IDVA
Score 0: 12
Score 1: 36
Score 2: 18
commande> j WELcHE 3c
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -63,27 +62,26 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 3
Game: mode=Free game
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | NONTEEL | TONNE | H4 | 12 |
2 | 1 | NBZEUAU | AUNEZ | 6F | 36 |
3 | 2 | NUDATMG | MATON | 5E | 18 |
4 | 0 | EL+HI?WE | WELcHE | 3C | 48 |
5 | 1 | BNU+FYTE | BEY | 2H | 43 |
6 | 2 | DGU+IDVA | VAGI | 1I | 25 |
Game type: Free game
Player 0: Human
Player 1: Computer
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | NONTEEL | TONNE | H4 | 12 | 0 |
2 | NBZEUAU | AUNEZ | 6F | 36 | 1 |
3 | NUDATMG | MATON | 5E | 18 | 2 |
4 | EL+HI?WE | WELcHE | 3C | 48 | 0 |
5 | BNU+FYTE | BEY | 2H | 43 | 1 |
6 | DGU+IDVA | VAGI | 1I | 25 | 2 |
Total: 182
Rack 0: I+SSPRNS
Rack 1: FNTU+FIA
Rack 2: DDU+?ERA
Score 0: 60
Score 1: 79
Score 2: 43
commande> h p
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -103,26 +101,25 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 3 out of 3
Game: mode=Free game
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | NONTEEL | TONNE | H4 | 12 |
2 | 1 | NBZEUAU | AUNEZ | 6F | 36 |
3 | 2 | NUDATMG | MATON | 5E | 18 |
4 | 0 | EL+HI?WE | WELcHE | 3C | 48 |
5 | 1 | BNU+FYTE | BEY | 2H | 43 |
Game type: Free game
Player 0: Human
Player 1: Computer
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | NONTEEL | TONNE | H4 | 12 | 0 |
2 | NBZEUAU | AUNEZ | 6F | 36 | 1 |
3 | NUDATMG | MATON | 5E | 18 | 2 |
4 | EL+HI?WE | WELcHE | 3C | 48 | 0 |
5 | BNU+FYTE | BEY | 2H | 43 | 1 |
Total: 157
Rack 0: I+SSPRNS
Rack 1: FNTU+FIA
Rack 2: DGU+IDVA
Score 0: 60
Score 1: 79
Score 2: 18
commande> h p
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -142,48 +139,46 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 2 out of 3
Game: mode=Free game
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | NONTEEL | TONNE | H4 | 12 |
2 | 1 | NBZEUAU | AUNEZ | 6F | 36 |
3 | 2 | NUDATMG | MATON | 5E | 18 |
4 | 0 | EL+HI?WE | WELcHE | 3C | 48 |
Game type: Free game
Player 0: Human
Player 1: Computer
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | NONTEEL | TONNE | H4 | 12 | 0 |
2 | NBZEUAU | AUNEZ | 6F | 36 | 1 |
3 | NUDATMG | MATON | 5E | 18 | 2 |
4 | EL+HI?WE | WELcHE | 3C | 48 | 0 |
Total: 114
Rack 0: I+SSPRNS
Rack 1: BNU+FYTE
Rack 2: DGU+IDVA
Score 0: 60
Score 1: 36
Score 2: 18
commande> h r
commande> a p
Eliot 1.5
Game: player 1 out of 3
Game: mode=Free game
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | NONTEEL | TONNE | H4 | 12 |
2 | 1 | NBZEUAU | AUNEZ | 6F | 36 |
3 | 2 | NUDATMG | MATON | 5E | 18 |
4 | 0 | EL+HI?WE | WELcHE | 3C | 48 |
5 | 1 | BNU+FYTE | BEY | 2H | 43 |
6 | 2 | DGU+IDVA | VAGI | 1I | 25 |
Game type: Free game
Player 0: Human
Player 1: Computer
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | NONTEEL | TONNE | H4 | 12 | 0 |
2 | NBZEUAU | AUNEZ | 6F | 36 | 1 |
3 | NUDATMG | MATON | 5E | 18 | 2 |
4 | EL+HI?WE | WELcHE | 3C | 48 | 0 |
5 | BNU+FYTE | BEY | 2H | 43 | 1 |
6 | DGU+IDVA | VAGI | 1I | 25 | 2 |
Total: 182
Rack 0: I+SSPRNS
Rack 1: FNTU+FIA
Rack 2: DDU+?ERA
Score 0: 60
Score 1: 79
Score 2: 43
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
A - - - - - - - - - - - - - - -
@ -203,21 +198,20 @@ commande> a g
O - - - - - - - - - - - - - - -
commande> h f
commande> a p
Eliot 1.5
Game: player 1 out of 3
Game: mode=Free game
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
Game type: Free game
Player 0: Human
Player 1: Computer
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
Total: 0
Rack 0: NONTEEL
Rack 1: NBZEUAU
Rack 2: NUDATMG
Score 0: 0
Score 1: 0
Score 2: 0
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
A - - - - - - - - - - - - - - -
@ -254,22 +248,21 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 2 out of 3
Game: mode=Free game
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | NONTEEL | TONNE | H4 | 12 |
Game type: Free game
Player 0: Human
Player 1: Computer
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | NONTEEL | TONNE | H4 | 12 | 0 |
Total: 12
Rack 0: EL+HI?WE
Rack 1: NBZEUAU
Rack 2: NUDATMG
Score 0: 12
Score 1: 0
Score 2: 0
commande> h n
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -289,23 +282,22 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 3 out of 3
Game: mode=Free game
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | NONTEEL | TONNE | H4 | 12 |
2 | 1 | NBZEUAU | AUNEZ | 6F | 36 |
Game type: Free game
Player 0: Human
Player 1: Computer
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | NONTEEL | TONNE | H4 | 12 | 0 |
2 | NBZEUAU | AUNEZ | 6F | 36 | 1 |
Total: 48
Rack 0: EL+HI?WE
Rack 1: BNU+FYTE
Rack 2: NUDATMG
Score 0: 12
Score 1: 36
Score 2: 0
commande> h r
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -325,24 +317,23 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 3
Game: mode=Free game
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | NONTEEL | TONNE | H4 | 12 |
2 | 1 | NBZEUAU | AUNEZ | 6F | 36 |
3 | 2 | NUDATMG | MATON | 5E | 18 |
Game type: Free game
Player 0: Human
Player 1: Computer
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | NONTEEL | TONNE | H4 | 12 | 0 |
2 | NBZEUAU | AUNEZ | 6F | 36 | 1 |
3 | NUDATMG | MATON | 5E | 18 | 2 |
Total: 66
Rack 0: EL+HI?WE
Rack 1: BNU+FYTE
Rack 2: DGU+IDVA
Score 0: 12
Score 1: 36
Score 2: 18
commande> h n
commande> j aWELE 3f
commande> a g
@ -363,27 +354,26 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 3
Game: mode=Free game
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | NONTEEL | TONNE | H4 | 12 |
2 | 1 | NBZEUAU | AUNEZ | 6F | 36 |
3 | 2 | NUDATMG | MATON | 5E | 18 |
4 | 0 | EL+HI?WE | aWELE | 3F | 30 |
5 | 1 | BNU+FYTE | BEY | 9G | 34 |
6 | 2 | DGU+IDVA | VAGI | 2J | 29 |
Game type: Free game
Player 0: Human
Player 1: Computer
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | NONTEEL | TONNE | H4 | 12 | 0 |
2 | NBZEUAU | AUNEZ | 6F | 36 | 1 |
3 | NUDATMG | MATON | 5E | 18 | 2 |
4 | EL+HI?WE | aWELE | 3F | 30 | 0 |
5 | BNU+FYTE | BEY | 9G | 34 | 1 |
6 | DGU+IDVA | VAGI | 2J | 29 | 2 |
Total: 159
Rack 0: HI+CEEEP
Rack 1: FNTU+FSR
Rack 2: DDU+OREE
Score 0: 42
Score 1: 70
Score 2: 47
commande> p
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -403,30 +393,29 @@ commande> a g
N - T U R F S - - - - - - - - -
O - - - E - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 3
Game: mode=Free game
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | NONTEEL | TONNE | H4 | 12 |
2 | 1 | NBZEUAU | AUNEZ | 6F | 36 |
3 | 2 | NUDATMG | MATON | 5E | 18 |
4 | 0 | EL+HI?WE | aWELE | 3F | 30 |
5 | 1 | BNU+FYTE | BEY | 9G | 34 |
6 | 2 | DGU+IDVA | VAGI | 2J | 29 |
7 | 0 | HI+CEEEP | (PASS) | - | 0 |
8 | 1 | FNTU+FSR | TURFS | N2 | 38 |
9 | 2 | DDU+OREE | REDORE | 4J | 22 |
Game type: Free game
Player 0: Human
Player 1: Computer
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | NONTEEL | TONNE | H4 | 12 | 0 |
2 | NBZEUAU | AUNEZ | 6F | 36 | 1 |
3 | NUDATMG | MATON | 5E | 18 | 2 |
4 | EL+HI?WE | aWELE | 3F | 30 | 0 |
5 | BNU+FYTE | BEY | 9G | 34 | 1 |
6 | DGU+IDVA | VAGI | 2J | 29 | 2 |
7 | HI+CEEEP | (PASS) | - | 0 | 0 |
8 | FNTU+FSR | TURFS | N2 | 38 | 1 |
9 | DDU+OREE | REDORE | 4J | 22 | 2 |
Total: 219
Rack 0: CEEEHIP
Rack 1: FN+IIGIA
Rack 2: DU+LRIUS
Score 0: 42
Score 1: 108
Score 2: 69
commande> h f
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -446,21 +435,20 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 3
Game: mode=Free game
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
Game type: Free game
Player 0: Human
Player 1: Computer
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
Total: 0
Rack 0: NONTEEL
Rack 1: NBZEUAU
Rack 2: NUDATMG
Score 0: 0
Score 1: 0
Score 2: 0
commande> h n
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -480,22 +468,21 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 2 out of 3
Game: mode=Free game
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | NONTEEL | TONNE | H4 | 12 |
Game type: Free game
Player 0: Human
Player 1: Computer
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | NONTEEL | TONNE | H4 | 12 | 0 |
Total: 12
Rack 0: EL+HI?WE
Rack 1: NBZEUAU
Rack 2: NUDATMG
Score 0: 12
Score 1: 0
Score 2: 0
commande> h l
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -515,30 +502,29 @@ commande> a g
N - T U R F S - - - - - - - - -
O - - - E - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 3
Game: mode=Free game
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | NONTEEL | TONNE | H4 | 12 |
2 | 1 | NBZEUAU | AUNEZ | 6F | 36 |
3 | 2 | NUDATMG | MATON | 5E | 18 |
4 | 0 | EL+HI?WE | aWELE | 3F | 30 |
5 | 1 | BNU+FYTE | BEY | 9G | 34 |
6 | 2 | DGU+IDVA | VAGI | 2J | 29 |
7 | 0 | HI+CEEEP | (PASS) | - | 0 |
8 | 1 | FNTU+FSR | TURFS | N2 | 38 |
9 | 2 | DDU+OREE | REDORE | 4J | 22 |
Game type: Free game
Player 0: Human
Player 1: Computer
Player 2: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | NONTEEL | TONNE | H4 | 12 | 0 |
2 | NBZEUAU | AUNEZ | 6F | 36 | 1 |
3 | NUDATMG | MATON | 5E | 18 | 2 |
4 | EL+HI?WE | aWELE | 3F | 30 | 0 |
5 | BNU+FYTE | BEY | 9G | 34 | 1 |
6 | DGU+IDVA | VAGI | 2J | 29 | 2 |
7 | HI+CEEEP | (PASS) | - | 0 | 0 |
8 | FNTU+FSR | TURFS | N2 | 38 | 1 |
9 | DDU+OREE | REDORE | 4J | 22 | 2 |
Total: 219
Rack 0: CEEEHIP
Rack 1: FN+IIGIA
Rack 2: DU+LRIUS
Score 0: 42
Score 1: 108
Score 2: 69
commande> q
fin du mode partie libre
commande> q

View file

@ -4,8 +4,8 @@ commande> l 1 1
mode partie libre
[?] pour l'aide
commande> a S
Joueur 0: 0
Joueur 1: 0
Score 0: 0
Score 1: 0
commande> p
commande> p
commande> a t
@ -35,69 +35,68 @@ commande> p
commande> p
commande> p
commande> a S
Joueur 0: -11
Joueur 1: 793
Score 0: -11
Score 1: 793
commande> a T
Joueur 0: AGSSTUV
Joueur 1:
Rack 0: AGSSTUV
Rack 1:
commande> a p
Eliot 1.5
Game: player 2 out of 2
Game: mode=Free game
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | SEUTISG | (PASS) | - | 0 |
2 | 1 | LXCORNU | ROUX | H5 | 26 |
3 | 0 | EGISSTU | (PASS) | - | 0 |
4 | 1 | CLN+?BEC | CiNECLUB | 7B | 67 | *
5 | 0 | EGISSTU | [UIET] | - | 0 |
6 | 1 | LLESYEO | LYSEE | J5 | 48 |
7 | 0 | GSS+TAUV | (PASS) | - | 0 |
8 | 1 | LO+AAOGT | GALA | 8A | 26 |
9 | 0 | AGSSTUV | (PASS) | - | 0 |
10 | 1 | OOT+EMTU | EMOTTE | 8J | 24 |
11 | 0 | AGSSTUV | (PASS) | - | 0 |
12 | 1 | OU+AOILU | AUX | 8F | 18 |
13 | 0 | AGSSTUV | (PASS) | - | 0 |
14 | 1 | ILOOU+NF | FOULONNAI | D1 | 82 | *
15 | 0 | AGSSTUV | (PASS) | - | 0 |
16 | 1 | UTEISEE | FETEES | 1D | 27 |
17 | 0 | AGSSTUV | (PASS) | - | 0 |
18 | 1 | IU+IURIO | MURI | K8 | 12 |
19 | 0 | AGSSTUV | (PASS) | - | 0 |
20 | 1 | IIOU+VDS | VISOU | 10B | 31 |
21 | 0 | AGSSTUV | (PASS) | - | 0 |
22 | 1 | DI+IERNE | DENIER | 12G | 22 |
23 | 0 | AGSSTUV | (PASS) | - | 0 |
24 | 1 | I+TBIADK | BATIK | N6 | 42 |
25 | 0 | AGSSTUV | (PASS) | - | 0 |
26 | 1 | DIT+EHEQ | EQUIDE | 3B | 30 |
27 | 0 | AGSSTUV | (PASS) | - | 0 |
28 | 1 | HT+EPARR | TEPHRA | O1 | 49 |
29 | 0 | AGSSTUV | (PASS) | - | 0 |
30 | 1 | R+OE?NSF | rENFORTS | M2 | 85 | *
31 | 0 | AGSSTUV | (PASS) | - | 0 |
32 | 1 | TMEAALP | EMPALAT | 13B | 78 | *
33 | 0 | AGSSTUV | (PASS) | - | 0 |
34 | 1 | ZDMAWER | DAMEZ | M11 | 40 |
35 | 0 | AGSSTUV | (PASS) | - | 0 |
36 | 1 | RW+HINJI | HIE | E5 | 24 |
37 | 0 | AGSSTUV | (PASS) | - | 0 |
38 | 1 | IJNRW+N | JE | B2 | 18 |
39 | 0 | AGSSTUV | (PASS) | - | 0 |
40 | 1 | INNRW | VINER | B10 | 16 |
41 | 0 | AGSSTUV | (PASS) | - | 0 |
42 | 1 | NW | DAW | G12 | 13 |
43 | 0 | AGSSTUV | (PASS) | - | 0 |
44 | 1 | N | EN | 14M | 4 |
Game type: Free game
Player 0: Human
Player 1: Computer
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | SEUTISG | (PASS) | - | 0 | 0 |
2 | LXCORNU | ROUX | H5 | 26 | 1 |
3 | EGISSTU | (PASS) | - | 0 | 0 |
4 | CLN+?BEC | CiNECLUB | 7B | 67 | 1 | *
5 | EGISSTU | (-UIET) | - | 0 | 0 |
6 | LLESYEO | LYSEE | J5 | 48 | 1 |
7 | GSS+TAUV | (PASS) | - | 0 | 0 |
8 | LO+AAOGT | GALA | 8A | 26 | 1 |
9 | AGSSTUV | (PASS) | - | 0 | 0 |
10 | OOT+EMTU | EMOTTE | 8J | 24 | 1 |
11 | AGSSTUV | (PASS) | - | 0 | 0 |
12 | OU+AOILU | AUX | 8F | 18 | 1 |
13 | AGSSTUV | (PASS) | - | 0 | 0 |
14 | ILOOU+NF | FOULONNAI | D1 | 82 | 1 | *
15 | AGSSTUV | (PASS) | - | 0 | 0 |
16 | UTEISEE | FETEES | 1D | 27 | 1 |
17 | AGSSTUV | (PASS) | - | 0 | 0 |
18 | IU+IURIO | MURI | K8 | 12 | 1 |
19 | AGSSTUV | (PASS) | - | 0 | 0 |
20 | IIOU+VDS | VISOU | 10B | 31 | 1 |
21 | AGSSTUV | (PASS) | - | 0 | 0 |
22 | DI+IERNE | DENIER | 12G | 22 | 1 |
23 | AGSSTUV | (PASS) | - | 0 | 0 |
24 | I+TBIADK | BATIK | N6 | 42 | 1 |
25 | AGSSTUV | (PASS) | - | 0 | 0 |
26 | DIT+EHEQ | EQUIDE | 3B | 30 | 1 |
27 | AGSSTUV | (PASS) | - | 0 | 0 |
28 | HT+EPARR | TEPHRA | O1 | 49 | 1 |
29 | AGSSTUV | (PASS) | - | 0 | 0 |
30 | R+OE?NSF | rENFORTS | M2 | 85 | 1 | *
31 | AGSSTUV | (PASS) | - | 0 | 0 |
32 | TMEAALP | EMPALAT | 13B | 78 | 1 | *
33 | AGSSTUV | (PASS) | - | 0 | 0 |
34 | ZDMAWER | DAMEZ | M11 | 40 | 1 |
35 | AGSSTUV | (PASS) | - | 0 | 0 |
36 | RW+HINJI | HIE | E5 | 24 | 1 |
37 | AGSSTUV | (PASS) | - | 0 | 0 |
38 | IJNRW+N | JE | B2 | 18 | 1 |
39 | AGSSTUV | (PASS) | - | 0 | 0 |
40 | INNRW | VINER | B10 | 16 | 1 |
41 | AGSSTUV | (PASS) | - | 0 | 0 |
42 | NW | DAW | G12 | 13 | 1 |
43 | AGSSTUV | (PASS) | - | 0 | 0 |
44 | N | EN | 14M | 4 | 1 |
Total: 782
Rack 0: AGSSTUV
Rack 1:
Score 0: -11
Score 1: 793
commande> q
fin du mode partie libre
commande> q

View file

@ -9,56 +9,53 @@ commande> p
commande> a t
AELMNU?
commande> a p
Eliot 1.5
Game: player 1 out of 1
Game: mode=Free game
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | AMLUNE? | (PASS) | - | 0 |
Game type: Free game
Player 0: Human
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | AMLUNE? | (PASS) | - | 0 | 0 |
Total: 0
Rack 0: AELMNU?
Score 0: 0
commande> p
commande> j MALvENU h4
commande> a t
ESEASTU
commande> a p
Eliot 1.5
Game: player 1 out of 1
Game: mode=Free game
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | AMLUNE? | (PASS) | - | 0 |
2 | 0 | AELMNU? | (PASS) | - | 0 |
3 | 0 | AELMNU? | MALvENU | H4 | 68 | *
Game type: Free game
Player 0: Human
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | AMLUNE? | (PASS) | - | 0 | 0 |
2 | AELMNU? | (PASS) | - | 0 | 0 |
3 | AELMNU? | MALvENU | H4 | 68 | 0 | *
Total: 68
Rack 0: ESEASTU
Score 0: 68
commande> p
commande> j SAUTEES 11H
commande> a p
Eliot 1.5
Game: player 1 out of 1
Game: mode=Free game
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | AMLUNE? | (PASS) | - | 0 |
2 | 0 | AELMNU? | (PASS) | - | 0 |
3 | 0 | AELMNU? | MALvENU | H4 | 68 | *
4 | 0 | ESEASTU | (PASS) | - | 0 |
5 | 0 | AEESSTU | SAUTEES | 11H | 72 | *
Game type: Free game
Player 0: Human
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | AMLUNE? | (PASS) | - | 0 | 0 |
2 | AELMNU? | (PASS) | - | 0 | 0 |
3 | AELMNU? | MALvENU | H4 | 68 | 0 | *
4 | ESEASTU | (PASS) | - | 0 | 0 |
5 | AEESSTU | SAUTEES | 11H | 72 | 0 | *
Total: 140
Rack 0: MIWBRAE
Score 0: 140
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
A - - - - - - - - - - - - - - -

View file

@ -24,38 +24,37 @@ commande> a l
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
commande> a p
Eliot 1.5
Game: player 1 out of 1
Game: mode=Training
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | EUOFMIE | FUMEE | H4 | 26 |
2 | 0 | IO+EOKAN | KIMONO | 6F | 38 |
3 | 0 | AE+EWTIS | WESTIE | L4 | 49 |
4 | 0 | A+EAVSLS | LAVASSE | 10H | 86 | *
5 | 0 | BTUOMEQ | LOQUET | H10 | 63 |
6 | 0 | BM+UNOSI | OMNIBUS | O4 | 94 | *
7 | 0 | IOZXEGP | EXPIEZ | N10 | 52 |
8 | 0 | GO+AETPI | TOPAZE | 15J | 60 |
9 | 0 | GI+AVNCO | VAINCU | 13C | 28 |
10 | 0 | GO+ESRAS | ESSORAGE | 8A | 80 | *
11 | 0 | JEUDIDR | JOUR | K5 | 44 |
12 | 0 | DDEI+ALY | DIALYSE | C3 | 56 |
13 | 0 | D+IHUEEB | HEU | 10B | 32 |
14 | 0 | BDEI+CIL | CIEL | D1 | 25 |
15 | 0 | BDI+RRA? | BRADeRIE | A1 | 86 | *
16 | 0 | EUGTDEA | DUT | M3 | 29 |
17 | 0 | AEEG+LR? | CERcLAGE | 1D | 80 | *
18 | 0 | TFLATNN | JOURNAL | K5 | 30 |
19 | 0 | AFNTT+HM | MATH | D12 | 24 |
20 | 0 | AFNT+NRE | FANON | I3 | 23 |
21 | 0 | ERT | ET | I13 | 18 |
Game type: Training
Player 0: Human
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | EUOFMIE | FUMEE | H4 | 26 | 0 |
2 | IO+EOKAN | KIMONO | 6F | 38 | 0 |
3 | AE+EWTIS | WESTIE | L4 | 49 | 0 |
4 | A+EAVSLS | LAVASSE | 10H | 86 | 0 | *
5 | BTUOMEQ | LOQUET | H10 | 63 | 0 |
6 | BM+UNOSI | OMNIBUS | O4 | 94 | 0 | *
7 | IOZXEGP | EXPIEZ | N10 | 52 | 0 |
8 | GO+AETPI | TOPAZE | 15J | 60 | 0 |
9 | GI+AVNCO | VAINCU | 13C | 28 | 0 |
10 | GO+ESRAS | ESSORAGE | 8A | 80 | 0 | *
11 | JEUDIDR | JOUR | K5 | 44 | 0 |
12 | DDEI+ALY | DIALYSE | C3 | 56 | 0 |
13 | D+IHUEEB | HEU | 10B | 32 | 0 |
14 | BDEI+CIL | CIEL | D1 | 25 | 0 |
15 | BDI+RRA? | BRADeRIE | A1 | 86 | 0 | *
16 | EUGTDEA | DUT | M3 | 29 | 0 |
17 | AEEG+LR? | CERcLAGE | 1D | 80 | 0 | *
18 | TFLATNN | JOURNAL | K5 | 30 | 0 |
19 | AFNTT+HM | MATH | D12 | 24 | 0 |
20 | AFNT+NRE | FANON | I3 | 23 | 0 |
21 | ERT | ET | I13 | 18 | 0 |
Total: 1023
Rack 0: R
Score 0: 1023
commande> q
fin du mode entraînement
commande> q

View file

@ -50,21 +50,20 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 1
Game: mode=Training
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | EA?AEBF | FABAcEE | H4 | 80 | *
2 | 0 | LMUAEYE | AY | I6 | 46 |
3 | 0 | EELMUJE | JUMEL | J2 | 38 |
4 | 0 | EEIGLEH | EGAYEE | 7F | 32 |
Game type: Training
Player 0: Human
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | EA?AEBF | FABAcEE | H4 | 80 | 0 | *
2 | LMUAEYE | AY | I6 | 46 | 0 |
3 | EELMUJE | JUMEL | J2 | 38 | 0 |
4 | EEIGLEH | EGAYEE | 7F | 32 | 0 |
Total: 196
Rack 0: HIL
Score 0: 196
commande> a l
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
6 1 2 3 9 1 1 2 8 0 1 4 2 6 6 2 1 6 6 6 5 2 1 1 0 1 1
@ -94,21 +93,20 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 1
Game: mode=Training
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | EA?AEBF | FABAcEE | H4 | 80 | *
2 | 0 | LMUAEYE | AY | I6 | 46 |
3 | 0 | EELMUJE | JUMEL | J2 | 38 |
4 | 0 | EEIGLEH | EGAYEE | 7F | 32 |
Game type: Training
Player 0: Human
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | EA?AEBF | FABAcEE | H4 | 80 | 0 | *
2 | LMUAEYE | AY | I6 | 46 | 0 |
3 | EELMUJE | JUMEL | J2 | 38 | 0 |
4 | EEIGLEH | EGAYEE | 7F | 32 | 0 |
Total: 196
Rack 0: HIL
Score 0: 196
commande> a l
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
6 1 2 3 9 1 1 2 8 0 1 4 2 6 6 2 1 6 6 6 5 2 1 1 0 1 1

View file

@ -1,26 +0,0 @@
Eliot
WAEROSC ROSACE 22 H 8
W+TSREIN WESTERN 54 13 G
I+RDTVI? DIVeRTIR * 83 8 A
ELMOEAH AH 30 I 8
EELMO+PI DIPLOMEE * 89 A 8
OHUMJUI JOUI 37 12 K
HMU+EAUA HUE 34 14 F
AAMU+UBS SAMBA 57 15 H
UU+NYTEP TYPE 61 O 12
NUU+S?GE SaUGRENU * 82 E 4
EBOILLF BIEF 36 J 7
LLO+TETE TELETYPE 57 O 8
LOT+DGOE GODET 23 D 1
LO+KRIIR LOOK 33 2 C
IIRR+ACQ CINQ 29 10 C
AIRR+TVE VERRAIT * 88 K 2
USAXANZ SAX 51 B 12
ANUZ+MNE RAMEZ 50 4 K
NNU+SALE LAUZES 45 O 1
NN+EAURF FRENE 38 N 2
ANU+NNID ANDINE 20 3 F
NU+OL GNOU 19 1 D
total 1038

View file

@ -1,5 +1,5 @@
c hutte
a g
a P
a p
q
q

View file

@ -20,33 +20,39 @@ commande> a g
M - - N O - - - - M - - V A S E
N - - - U - - - - N - - E - - -
O - - E X I G E R A - - C Z A R
commande> a P
Eliot
commande> a p
Game: player 1 out of 1
Game: mode=Training
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | UTEHJDT | HUTTE | H4 | 24 |
2 | 0 | DJ+NGILE | JUNGLE | 5G | 28 |
3 | 0 | DI+OBURX | DOUX | 4L | 54 |
4 | 0 | BIR+EEGI | EXIGER | O3 | 48 |
5 | 0 | BI+TNE?N | oBTIENNE | 8A | 80 | *
6 | 0 | AMIEOLE | METEO | 6F | 28 |
7 | 0 | AIL+NEID | ENLAIDIT | C1 | 70 | *
8 | 0 | WABFUNO | BOEUF | 1A | 33 |
9 | 0 | ANW+OALU | WON | 3K | 32 |
10 | 0 | AALU+PI? | MANiPULAI | F6 | 69 | *
11 | 0 | ELSUICS | CELSIUS | 15C | 92 | *
12 | 0 | ETFYUSR | FRAYES | 4A | 44 |
13 | 0 | TU+DEMNH | HAUTE | 7E | 31 |
14 | 0 | DMNT+ARA | DAMNA | 9K | 26 |
15 | 0 | RT+SAIVI | SUIVRAIT | 11E | 94 | *
16 | 0 | ACAOVEP | AVEC | 12L | 28 |
17 | 0 | AOP+ARZO | CZAR | O12 | 45 |
18 | 0 | AOOP+REK | POKER | 14H | 42 |
19 | 0 | AO+TSTEM | MIES | 9E | 34 |
20 | 0 | AOTT+LEQ | QAT | J10 | 26 |
21 | 0 | AELOT+RS | VASE | M12 | 31 |
22 | 0 | LORT | FORET | E1 | 16 |
UTEHJDT HUTTE 24 H 4
DJ+NGILE JUNGLE 28 5 G
DI+OBURX DOUX 54 4 L
BIR+EEGI EXIGER 48 O 3
BI+TNE?N oBTIENNE * 80 8 A
AMIEOLE METEO 28 6 F
AIL+NEID ENLAIDIT * 70 C 1
WABFUNO BOEUF 33 1 A
ANW+OALU WON 32 3 K
AALU+PI? MANiPULAI * 69 F 6
ELSUICS CELSIUS * 92 15 C
ETFYUSR FRAYES 44 4 A
TU+DEMNH HAUTE 31 7 E
DMNT+ARA DAMNA 26 9 K
RT+SAIVI SUIVRAIT * 94 11 E
ACAOVEP AVEC 28 12 L
AOP+ARZO CZAR 45 O 12
AOOP+REK POKER 42 14 H
AO+TSTEM MIES 34 9 E
AOTT+LEQ QAT 26 J 10
AELOT+RS VASE 31 M 12
LORT FORET 16 E 1
total 975
Rack 0: L
Score 0: 975
commande> q
fin du mode entraînement
commande> q

View file

@ -1,14 +0,0 @@
c rosace
h p 13
h r
a P
a t
a l
a g
a gd # j1
h r
t NUUS?GE
r
a r
q
q

View file

@ -1,92 +0,0 @@
Using seed: 0
[?] pour l'aide
commande> c rosace
mode entra絜ement
[?] pour l'aide
commande> h p 13
commande> h r
commande> a P
Eliot
WAEROSC ROSACE 22 H 8
W+TSREIN WESTERN 54 13 G
I+RDTVI? DIVeRTIR * 83 8 A
ELMOEAH AH 30 I 8
EELMO+PI DIPLOMEE * 89 A 8
OHUMJUI JOUI 37 12 K
HMU+EAUA HUE 34 14 F
AAMU+UBS SAMBA 57 15 H
UU+NYTEP TYPE 61 O 12
total 467
commande> a t
NUU
commande> a l
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
5 1 1 2 9 2 2 0 4 0 1 4 1 5 3 0 1 3 3 3 4 1 0 1 0 1 1
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
A - - - - - - - D I P L O M E E
B - - - - - - - I - - - - - - -
C - - - - - - - V - - - - - - -
D - - - - - - - e - - - - - - -
E - - - - - - - R - - - - - - -
F - - - - - - - T - - - - - H -
G - - - - - - - I - - - - W U -
H - - - - - - - R O S A C E E S
I - - - - - - - A H - - - S - A
J - - - - - - - - - - - - T - M
K - - - - - - - - - - - J E - B
L - - - - - - - - - - - O R - A
M - - - - - - - - - - - U N - -
N - - - - - - - - - - - I - - -
O - - - - - - - - - - - T Y P E
commande> a gd # j1
Ar [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1]
Br [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][00005040: 1][00200200: 3][00200222: 1][002c4108: 1][00200222: 2][01384100: 1][01384100: 1]
Cr [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1]
Dr [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1]
Er [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000008: 6][ffffffff:-1]
Fr [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:16][00000000:-1][ffffffff:-1]
Gr [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][00000000: 5][00608022: 1][005c795e: 1][00008000: 3][00000000:-1][00000000:-1][00000000: 8]
Hr [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1]
Ir [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][00000000:-1][00200222: 1][02284302: 1][00000222: 3][00000000:-1][040c0020: 6][00000000:-1]
Jr [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00080200:12][00002020: 5][ffffffff:-1][ffffffff:-1][00000000:12][00000000:-1][ffffffff:-1][00000000:-1]
Kr [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][00000000:-1][ffffffff:-1][00000000:-1]
Lr [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][00000000:-1][ffffffff:-1][00000000:-1]
Mr [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][00000000:-1][ffffffff:-1][00080000: 8]
Nr [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][00000000:26][00000000: 3][005c751c: 1]
Or [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1]
-
Ac [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:12][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1]
Bc [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][010d714e: 1][00000000:-1][00005040: 1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1]
Cc [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000: 4][00000000:-1][00280022: 4][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1]
Dc [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][005c751c: 0][00000000:-1][01384100: 0][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1]
Ec [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00008000: 1][00000000:-1][00200222: 1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1]
Fc [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00200020: 1][00000000:-1][00200022: 1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00008022: 4][00000000:-1][00008222: 4]
Gc [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][010d714e: 1][00000000:-1][00005040: 1][ffffffff:-1][ffffffff:-1][00000000:11][00000000:-1][00000000:-1][00080000:11]
Hc [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:10][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1]
Ic [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000004: 5][00000000:-1][00000000:-1][00000000: 5][ffffffff:-1][00608022: 1][00000000:-1][00210800: 2][00000000:-1]
Jc [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00200020: 1][00000000:-1][00008000: 3][00000000:-1]
Kc [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000: 9][00000000:-1][00000000:-1][00000000:12][00000000:-1]
Lc [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00002048: 2][00000000:-1][00000000:-1][00004000: 3][00000000:-1]
Mc [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000144: 2][00000000:-1][00000000:-1][00080220: 2][ffffffff:-1]
Nc [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][010d714e: 1][00000000:-1][00005040: 1][ffffffff:-1][ffffffff:-1]
Oc [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:15][00000000:-1][00000000:-1][00000000:-1][00000000:-1]
commande> h r
commande> t NUUS?GE
commande> r
commande> a r
1: SaUGRENU * 82 E4
2: eNjUGUES * 66 D8
3: GUEUSANt * 66 11C
4: NUaGEUSe * 66 D1
5: ENjUGUeS * 64 D2
6: GUEUSeNt * 64 D3
7: GUeUSENt * 64 D6
8: NUaGeUSE * 64 D4
9: GUeUSENT * 62 F1
10: GUEUSaNT * 60 F1
commande> q
fin du mode entra絜ement
commande> q

View file

@ -116,21 +116,20 @@ commande> a l
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
7 2 2 3 13 2 2 1 7 1 0 5 3 6 6 1 1 6 3 6 5 1 0 1 0 1 0
commande> a p
Eliot 1.5
Game: player 1 out of 1
Game: mode=Training
Game: variant=joker
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | E?ESAVP | PAVEuSE | H2 | 80 | *
2 | 0 | WHISKYS | WHISKEYS | 5C | 126 | *
3 | 0 | NII?NAX | kA | 3G | 1 |
4 | 0 | AIINNX+? | kAS | J3 | 2 |
Game type: Training
Player 0: Human
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | E?ESAVP | PAVEuSE | H2 | 80 | 0 | *
2 | WHISKYS | WHISKEYS | 5C | 126 | 0 | *
3 | NII?NAX | kA | 3G | 1 | 0 |
4 | AIINNX+? | kAS | J3 | 2 | 0 |
Total: 209
Rack 0: IINNX
Score 0: 209
commande> h p
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

View file

@ -36,20 +36,19 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 1
Game: mode=Training
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | SEUTISG | GITES | H4 | 16 |
2 | 0 | SU+XULRO | LUX | I5 | 47 |
3 | 0 | ORSU+SCD | SOURDS | J6 | 30 |
Game type: Training
Player 0: Human
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | SEUTISG | GITES | H4 | 16 | 0 |
2 | SU+XULRO | LUX | I5 | 47 | 0 |
3 | ORSU+SCD | SOURDS | J6 | 30 | 0 |
Total: 93
Rack 0: C
Score 0: 93
commande> h n
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -69,20 +68,19 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 1
Game: mode=Training
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | SEUTISG | GITES | H4 | 16 |
2 | 0 | SU+XULRO | LUX | I5 | 47 |
3 | 0 | ORSU+SCD | SOURDS | J6 | 30 |
Game type: Training
Player 0: Human
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | SEUTISG | GITES | H4 | 16 | 0 |
2 | SU+XULRO | LUX | I5 | 47 | 0 |
3 | ORSU+SCD | SOURDS | J6 | 30 | 0 |
Total: 93
Rack 0: C
Score 0: 93
commande> h p
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -102,19 +100,18 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 1
Game: mode=Training
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | SEUTISG | GITES | H4 | 16 |
2 | 0 | SU+XULRO | LUX | I5 | 47 |
Game type: Training
Player 0: Human
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | SEUTISG | GITES | H4 | 16 | 0 |
2 | SU+XULRO | LUX | I5 | 47 | 0 |
Total: 63
Rack 0: ORSU
Score 0: 63
commande> h p
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -134,18 +131,17 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 1
Game: mode=Training
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | SEUTISG | GITES | H4 | 16 |
Game type: Training
Player 0: Human
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | SEUTISG | GITES | H4 | 16 | 0 |
Total: 16
Rack 0: SU
Score 0: 16
commande> h p
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -165,17 +161,16 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 1
Game: mode=Training
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
Game type: Training
Player 0: Human
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
Total: 0
Rack 0:
Score 0: 0
commande> h l
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -195,20 +190,19 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 1
Game: mode=Training
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | SEUTISG | GITES | H4 | 16 |
2 | 0 | SU+XULRO | LUX | I5 | 47 |
3 | 0 | ORSU+SCD | SOURDS | J6 | 30 |
Game type: Training
Player 0: Human
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | SEUTISG | GITES | H4 | 16 | 0 |
2 | SU+XULRO | LUX | I5 | 47 | 0 |
3 | ORSU+SCD | SOURDS | J6 | 30 | 0 |
Total: 93
Rack 0: C
Score 0: 93
commande> +
commande> a t
C?BETNL
@ -237,20 +231,19 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 1
Game: mode=Training
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | SEUTISG | GITES | H4 | 16 |
2 | 0 | SU+XULRO | LUX | I5 | 47 |
3 | 0 | ORSU+SCD | SOURDS | J6 | 30 |
Game type: Training
Player 0: Human
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | SEUTISG | GITES | H4 | 16 | 0 |
2 | SU+XULRO | LUX | I5 | 47 | 0 |
3 | ORSU+SCD | SOURDS | J6 | 30 | 0 |
Total: 93
Rack 0: C
Score 0: 93
commande> +
Cannot add a command to an old turn
commande> h f
@ -272,17 +265,16 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 1
Game: mode=Training
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
Game type: Training
Player 0: Human
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
Total: 0
Rack 0:
Score 0: 0
commande> h n
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -302,18 +294,17 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 1
Game: mode=Training
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | SEUTISG | GITES | H4 | 16 |
Game type: Training
Player 0: Human
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | SEUTISG | GITES | H4 | 16 | 0 |
Total: 16
Rack 0: SU
Score 0: 16
commande> h n
commande> a g
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@ -333,19 +324,18 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 1
Game: mode=Training
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | SEUTISG | GITES | H4 | 16 |
2 | 0 | SU+XULRO | LUX | I5 | 47 |
Game type: Training
Player 0: Human
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | SEUTISG | GITES | H4 | 16 | 0 |
2 | SU+XULRO | LUX | I5 | 47 | 0 |
Total: 63
Rack 0: ORSU
Score 0: 63
commande> *
Cannot add a command to an old turn
commande> +
@ -376,20 +366,19 @@ commande> a g
N - - - - - - - - - - - - - - -
O - - - - - - - - - - - - - - -
commande> a p
Eliot 1.5
Game: player 1 out of 1
Game: mode=Training
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | SEUTISG | GITES | H4 | 16 |
2 | 0 | SU+XULRO | LUX | I5 | 47 |
3 | 0 | HELLO | OHE | J7 | 18 |
Game type: Training
Player 0: Human
N | RACK | SOLUTION | REF | PTS | P | BONUS
===|==========|=================|=====|=====|===|======
1 | SEUTISG | GITES | H4 | 16 | 0 |
2 | SU+XULRO | LUX | I5 | 47 | 0 |
3 | HELLO | OHE | J7 | 18 | 0 |
Total: 81
Rack 0: LL
Score 0: 81
commande> q
fin du mode entraînement
commande> q

View file

@ -19,7 +19,7 @@ t UU+NYTEP
j TYPE O12
a gd # r1
t NUU+S?GE
a P
a p
a t
a l
a g

View file

@ -54,20 +54,26 @@ commande> a gd # r1
Nc [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][010d714e: 1][00000000:-1][00005040: 1][ffffffff:-1][ffffffff:-1]
Oc [ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:15][00000000:-1][00000000:-1][00000000:-1][00000000:-1]
commande> t NUU+S?GE
commande> a P
Eliot
commande> a p
Game: player 1 out of 1
Game: mode=Training
Game: variant=unknown
Game: history:
N | P | RACK | SOLUTION | REF | PTS | BONUS
===|===|==========|================|=====|=====|======
1 | 0 | WAEROSC | ROSACE | H8 | 22 |
2 | 0 | W+TSREIN | WESTERN | 13G | 54 |
3 | 0 | I+RDTVI? | DIVeRTIR | 8A | 83 | *
4 | 0 | ELMOEAH | AH | I8 | 30 |
5 | 0 | EELMO+PI | DIPLOMEE | A8 | 89 | *
6 | 0 | OHUMJUI | JOUI | 12K | 37 |
7 | 0 | HMU+EAUA | HUE | 14F | 34 |
8 | 0 | AAMU+UBS | SAMBA | 15H | 57 |
9 | 0 | UU+NYTEP | TYPE | O12 | 61 |
WAEROSC ROSACE 22 H 8
W+TSREIN WESTERN 54 13 G
I+RDTVI? DIVeRTIR * 83 8 A
ELMOEAH AH 30 I 8
EELMO+PI DIPLOMEE * 89 A 8
OHUMJUI JOUI 37 12 K
HMU+EAUA HUE 34 14 F
AAMU+UBS SAMBA 57 15 H
UU+NYTEP TYPE 61 O 12
total 467
Rack 0: NUU+S?GE
Score 0: 467
commande> a t
NUUS?GE
commande> a l

Some files were not shown because too many files have changed in this diff Show more