[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Eliot-dev] Changes to eliot/utils/eliottxt.cpp [antoine-1]
From: |
eliot-dev |
Subject: |
[Eliot-dev] Changes to eliot/utils/eliottxt.cpp [antoine-1] |
Date: |
Sun, 23 Oct 2005 13:16:41 -0400 |
Index: eliot/utils/eliottxt.cpp
diff -u /dev/null eliot/utils/eliottxt.cpp:1.7.2.1
--- /dev/null Sun Oct 23 17:16:41 2005
+++ eliot/utils/eliottxt.cpp Sun Oct 23 17:16:24 2005
@@ -0,0 +1,878 @@
+/*****************************************************************************
+ * Copyright (C) 2005 Eliot
+ * Authors: Antoine Fraboulet <address@hidden>
+ * Olivier Teuliere <address@hidden>
+ *
+ * $Id: eliottxt.cpp,v 1.7.2.1 2005/10/23 17:16:24 afrab Exp $
+ *
+ * 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 <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+#include <string.h>
+#include <ctype.h>
+#include <fstream>
+#include <readline/readline.h>
+#include <readline/history.h>
+
+#include "dic.h"
+#include "dic_search.h"
+#include "game_io.h"
+#include "game_factory.h"
+#include "training.h"
+#include "duplicate.h"
+#include "freegame.h"
+
+using namespace std;
+
+/* A static variable for holding the line. */
+static char *line_read = NULL;
+
+/**
+ * Read a string, and return a pointer to it.
+ * Returns NULL on EOF.
+ */
+char *rl_gets()
+{
+ // If the buffer has already been allocated, return the memory to the free
+ // pool
+ if (line_read)
+ {
+ free(line_read);
+ line_read = NULL;
+ }
+
+ // Get a line from the user
+ line_read = readline("commande> ");
+
+ // If the line has any text in it, save it on the history
+ if (line_read && *line_read)
+ add_history(line_read);
+
+ return line_read;
+}
+
+
+char *
+next_token_alpha(char *cmd, const char *delim)
+{
+ int i;
+ char *token = strtok(cmd, delim);
+ if (token == NULL)
+ return NULL;
+ for (i = 0; token[i] && isalpha(token[i]); i++)
+ ;
+ token[i] = '\0';
+ return token;
+}
+
+
+char *
+next_token_alphanum(char *cmd, const char *delim)
+{
+ int i;
+ char *token = strtok(cmd, delim);
+ if (token == NULL)
+ return NULL;
+ for (i = 0; token[i] && isalnum(token[i]); i++)
+ ;
+ token[i] = '\0';
+ return token;
+}
+
+
+char *
+next_token_alphaplusjoker(char *cmd, const char *delim)
+{
+ int i;
+ char *token = strtok(cmd, delim);
+ if (token == NULL)
+ return NULL;
+ for (i = 0; token[i] && (isalpha(token[i]) ||
+ token[i] == '?' ||
+ token[i] == '+');
+ i++)
+ ;
+ token[i] = '\0';
+ return token;
+}
+
+
+char *
+next_token_digit(char *cmd, const char *delim)
+{
+ int i;
+ char *token = strtok(cmd, delim);
+ if (token == NULL)
+ return NULL;
+ for (i = 0; token[i] && (isdigit(token[i]) || token[i] == '-'); i++)
+ ;
+ token[i] = '\0';
+ return token;
+}
+
+
+char *
+next_token_cross(char *cmd, const char *delim)
+{
+ int i;
+ char *token = strtok(cmd, delim);
+ if (token == NULL)
+ return NULL;
+ for (i = 0; token[i] &&
+ (isalpha(token[i]) || token[i] == '.');
+ i++)
+ ;
+ token[i] = '\0';
+ return token;
+}
+
+
+char *
+next_token_filename(char *cmd, const char *delim)
+{
+ int i;
+ char *token = strtok(cmd, delim);
+ if (token == NULL)
+ return NULL;
+ for (i = 0; token[i] && (isalnum(token[i]) ||
+ token[i] == '.' ||
+ token[i] == '_'); i++)
+ ;
+ token[i] = '\0';
+ return token;
+}
+
+
+void
+eliottxt_get_cross(const Dictionary &iDic, char* cros)
+{
+ int i;
+ // (Dictionary dic, char* regx, char wordlist[RES_REGX_MAX][DIC_WORD_MAX])
+ char wordlist[RES_CROS_MAX][DIC_WORD_MAX];
+ Dic_search_Cros(iDic, cros, wordlist);
+ for (i = 0; i<RES_CROS_MAX && wordlist[i][0]; i++)
+ {
+ printf(" %s\n", wordlist[i]);
+ }
+}
+
+
+void
+help_training()
+{
+ printf(" ? : aide -- cette page\n");
+ printf(" a [g|l|p|r|t] : afficher :\n");
+ printf(" g -- grille\n");
+ printf(" gj -- grille + jokers\n");
+ printf(" gm -- grille + valeur des cases\n");
+ printf(" gn -- grille + valeur des cases (variante)\n");
+ printf(" l -- lettres non jouées\n");
+ printf(" p -- partie\n");
+ printf(" r -- recherche\n");
+ printf(" s -- score\n");
+ printf(" S -- score de tous les joueurs\n");
+ printf(" t -- tirage\n");
+ printf(" d [] : vérifier le mot []\n");
+ printf(" * : tirage aléatoire\n");
+ printf(" + : tirage aléatoire ajouts\n");
+ printf(" t [] : changer le tirage\n");
+ printf(" j [] {} : jouer le mot [] aux coordonnées {}\n");
+ printf(" n [] : jouer le résultat numéro []\n");
+ printf(" s [] : sauver la partie en cours dans le fichier []\n");
+ printf(" c [] : charger la partie du fichier []\n");
+ printf(" q : quitter le mode entraînement\n");
+}
+
+
+void
+help_freegame()
+{
+ printf(" ? : aide -- cette page\n");
+ printf(" a [g|l|p|s|t] : afficher :\n");
+ printf(" g -- grille\n");
+ printf(" gj -- grille + jokers\n");
+ printf(" gm -- grille + valeur des cases\n");
+ printf(" gn -- grille + valeur des cases (variante)\n");
+ printf(" j -- joueur courant\n");
+ printf(" l -- lettres non jouées\n");
+ printf(" p -- partie\n");
+ printf(" s -- score\n");
+ printf(" S -- score de tous les joueurs\n");
+ printf(" t -- tirage\n");
+ printf(" T -- tirage de tous les joueurs\n");
+ printf(" d [] : vérifier le mot []\n");
+ printf(" j [] {} : jouer le mot [] aux coordonnées {}\n");
+ printf(" p [] : passer son tour en changeant les lettres []\n");
+ printf(" s [] : sauver la partie en cours dans le fichier []\n");
+ printf(" c [] : charger la partie du fichier []\n");
+ printf(" q : quitter le mode partie libre\n");
+}
+
+
+void
+help_duplicate()
+{
+ printf(" ? : aide -- cette page\n");
+ printf(" a [g|l|p|s|t] : afficher :\n");
+ printf(" g -- grille\n");
+ printf(" gj -- grille + jokers\n");
+ printf(" gm -- grille + valeur des cases\n");
+ printf(" gn -- grille + valeur des cases (variante)\n");
+ printf(" j -- joueur courant\n");
+ printf(" l -- lettres non jouées\n");
+ printf(" p -- partie\n");
+ printf(" s -- score\n");
+ printf(" S -- score de tous les joueurs\n");
+ printf(" t -- tirage\n");
+ printf(" d [] : vérifier le mot []\n");
+ printf(" j [] {} : jouer le mot [] aux coordonnées {}\n");
+ printf(" n [] : passer au joueur n°[]\n");
+ printf(" s [] : sauver la partie en cours dans le fichier []\n");
+ printf(" c [] : charger la partie du fichier []\n");
+ printf(" q : quitter le mode duplicate\n");
+}
+
+
+void
+help()
+{
+ printf(" ? : aide -- cette page\n");
+ printf(" e : démarrer le mode entraînement\n");
+ printf(" d [] {} : démarrer une partie duplicate avec\n");
+ printf(" [] joueurs humains et {} joueurs IA\n");
+ printf(" l [] {} : démarrer une partie libre avec\n");
+ printf(" [] joueurs humains et {} joueurs IA\n");
+ printf(" D : raccourci pour d 1 1\n");
+ printf(" L : raccourci pour l 1 1\n");
+ printf(" q : quitter\n");
+}
+
+
+void
+display_data(const Game &iGame, const char *delim)
+{
+ char *token;
+
+ token = next_token_alpha(NULL, delim);
+ if (token == NULL)
+ {
+ cout << "commande incomplète\n";
+ return;
+ }
+ switch (token[0])
+ {
+ case 'g':
+ switch (token[1])
+ {
+ case '\0':
+ GameIO::printBoard(cout, iGame);
+ break;
+ case 'j':
+ GameIO::printBoardJoker(cout, iGame);
+ break;
+ case 'm':
+ GameIO::printBoardMultipliers(cout, iGame);
+ break;
+ case 'n':
+ GameIO::printBoardMultipliers2(cout, iGame);
+ break;
+ default:
+ printf("commande inconnue\n");
+ break;
+ }
+ break;
+ case 'j':
+ cout << "Joueur " << iGame.getCurrentPlayerNum() << endl;
+ break;
+ case 'l':
+ GameIO::printNonPlayed(cout, iGame);
+ break;
+ case 'p':
+ iGame.save(cout);
+ break;
+ case 'r':
+ token = next_token_digit(NULL, delim);
+ if (token == NULL)
+ GameIO::printSearchResults(cout,
+ static_cast<const Training&>(iGame),
+ 10);
+ else
+ GameIO::printSearchResults(cout,
+ static_cast<const Training&>(iGame),
+ atoi(token));
+ break;
+ case 's':
+ GameIO::printPoints(cout, iGame);
+ break;
+ case 'S':
+ GameIO::printAllPoints(cout, iGame);
+ break;
+ case 't':
+ GameIO::printPlayedRack(cout, iGame, iGame.getHistory().getSize());
+ break;
+ case 'T':
+ GameIO::printAllRacks(cout, iGame);
+ break;
+ default:
+ cout << "commande inconnue\n";
+ break;
+ }
+}
+
+
+void
+loop_training(Training &iGame)
+{
+ char *token;
+ char *commande = NULL;
+ char delim[] = " \t";
+ int quit = 0;
+
+ cout << "mode entraînement\n";
+ cout << "[?] pour l'aide\n";
+ while (quit == 0)
+ {
+ commande = rl_gets();
+ token = strtok(commande, delim);
+ if (token)
+ {
+ switch (token[0])
+ {
+ case '?':
+ help_training();
+ break;
+ case 'a':
+ display_data(iGame, delim);
+ break;
+ case 'd':
+ token = next_token_alpha(NULL, delim);
+ if (token == NULL)
+ help_training();
+ else
+ {
+ if (Dic_search_word(iGame.getDic(), token))
+ printf("le mot -%s- existe\n", token);
+ else
+ printf("le mot -%s- n'existe pas\n", token);
+ }
+ break;
+ case 'j':
+ token = next_token_alpha(NULL, delim);
+ if (token == NULL)
+ help_training();
+ else
+ {
+ int res;
+ char *coord = next_token_alphanum(NULL, delim);
+ if (coord == NULL)
+ {
+ help_training();
+ break;
+ }
+#if 0
+ if ((res = iGame.play(0, std::string(coord),
std::string(token))) != 0)
+ {
+ fprintf(stderr, "Mot incorrect ou mal placé
(%i)\n",
+ res);
+ break;
+ }
+#endif
+ }
+ break;
+ case 'n':
+ token = next_token_digit(NULL, delim);
+ if (token == NULL)
+ help_training();
+ else
+ {
+ int n = atoi(token);
+ if (n <= 0)
+ iGame.back(n == 0 ? 1 : -n);
+ else
+ {
+ if (iGame.playResult(--n))
+ printf("mauvais argument\n");
+ }
+ }
+ break;
+ case 'r':
+ iGame.search();
+ break;
+ case 't':
+#if 0
+ token = next_token_alphaplusjoker(NULL, delim);
+ if (token == NULL)
+ help_training();
+ else
+ if (iGame.setRackManual(0, false, token))
+ printf("le sac ne contient pas assez de
lettres\n");
+#endif
+ break;
+ case 'x':
+ token = next_token_cross(NULL, delim);
+ if (token == NULL)
+ help_training();
+ else
+ eliottxt_get_cross(iGame.getDic(), token);
+ break;
+ case '*':
+
//iGame.getPlayer(0).getCurrentRack().set(PlayedRack::RACK_ALL);
+ break;
+ case '+':
+
//iGame.getPlayer(0).getCurrentRack().set(PlayedRack::RACK_NEW);
+ break;
+ case 's':
+ token = next_token_filename(NULL, delim);
+ if (token != NULL)
+ {
+ ofstream fout(token);
+ if (fout.rdstate() == ios::failbit)
+ {
+ printf("impossible d'ouvrir %s\n", token);
+ break;
+ }
+ iGame.save(fout);
+ fout.close();
+ }
+ break;
+ case 'q':
+ quit = 1;
+ break;
+ default:
+ printf("commande inconnue\n");
+ break;
+ }
+ }
+ }
+ printf("fin du mode entraînement\n");
+}
+
+
+void
+loop_freegame(FreeGame &iGame)
+{
+ char *token;
+ char *commande = NULL;
+ char delim[] = " \t";
+ int quit = 0;
+
+ printf("mode partie libre\n");
+ printf("[?] pour l'aide\n");
+ while (quit == 0)
+ {
+ commande = rl_gets();
+ token = strtok(commande, delim);
+ if (token)
+ {
+ switch (token[0])
+ {
+ case '?':
+ help_freegame();
+ break;
+ case 'a':
+ display_data(iGame, delim);
+ break;
+ case 'd':
+ token = next_token_alpha(NULL, delim);
+ if (token == NULL)
+ help_freegame();
+ else
+ {
+ if (Dic_search_word(iGame.getDic(), token))
+ printf("le mot -%s- existe\n", token);
+ else
+ printf("le mot -%s- n'existe pas\n", token);
+ }
+ break;
+ case 'j':
+ token = next_token_alpha(NULL, delim);
+ if (token == NULL)
+ help_freegame();
+ else
+ {
+ int res;
+ char *coord = next_token_alphanum(NULL, delim);
+ if (coord == NULL)
+ {
+ help_freegame();
+ break;
+ }
+#if 0
+ if ((res = iGame.play(0, std::string(coord),
std::string(token))) != 0)
+ {
+ fprintf(stderr, "Mot incorrect ou mal placé
(%i)\n",
+ res);
+ break;
+ }
+#endif
+ }
+ break;
+ case 'p':
+ token = next_token_alpha(NULL, delim);
+ /* You can pass your turn without changing any letter */
+ if (token == NULL)
+ token = "";
+
+#if 0
+ if (iGame.pass(token, iGame.currPlayer()) != 0)
+ break;
+#endif
+ break;
+ case 's':
+ token = next_token_filename(NULL, delim);
+ if (token != NULL)
+ {
+ ofstream fout(token);
+ if (fout.rdstate() == ios::failbit)
+ {
+ printf("impossible d'ouvrir %s\n", token);
+ break;
+ }
+ iGame.save(fout);
+ fout.close();
+ }
+ break;
+ case 'q':
+ quit = 1;
+ break;
+ default:
+ printf("commande inconnue\n");
+ break;
+ }
+ }
+ }
+ printf("fin du mode partie libre\n");
+}
+
+
+void
+loop_duplicate(Duplicate &iGame)
+{
+ char *token;
+ char *commande = NULL;
+ char delim[] = " \t";
+ int quit = 0;
+
+ printf("mode duplicate\n");
+ printf("[?] pour l'aide\n");
+ while (quit == 0)
+ {
+ commande = rl_gets();
+ token = strtok(commande, delim);
+ if (token)
+ {
+ switch (token[0])
+ {
+ case '?':
+ help_duplicate();
+ break;
+ case 'a':
+ display_data(iGame, delim);
+ break;
+ case 'd':
+ token = next_token_alpha(NULL, delim);
+ if (token == NULL)
+ help_duplicate();
+ else
+ {
+ if (Dic_search_word(iGame.getDic(), token))
+ printf("le mot -%s- existe\n", token);
+ else
+ printf("le mot -%s- n'existe pas\n", token);
+ }
+ break;
+ case 'j':
+ token = next_token_alpha(NULL, delim);
+ if (token == NULL)
+ help_duplicate();
+ else
+ {
+ int res;
+ char *coord = next_token_alphanum(NULL, delim);
+ if (coord == NULL)
+ {
+ help_duplicate();
+ break;
+ }
+#if 0
+ if ((res = iGame.play(0, std::string(coord),
std::string(token))) != 0)
+ {
+ fprintf(stderr, "Mot incorrect ou mal placé
(%i)\n",
+ res);
+ break;
+ }
+#endif
+ }
+ break;
+ case 'n':
+ token = next_token_digit(NULL, delim);
+ if (token == NULL)
+ help_duplicate();
+ else
+ {
+#if 0
+ int res = iGame.setPlayer(atoi(token));
+ if (res == 1)
+ fprintf(stderr, "Numéro de joueur invalide\n");
+ else if (res == 2)
+ fprintf(stderr, "Impossible de choisir un joueur
non humain\n");
+#endif
+ }
+ break;
+ case 's':
+ token = next_token_filename(NULL, delim);
+ if (token != NULL)
+ {
+ ofstream fout(token);
+ if (fout.rdstate() == ios::failbit)
+ {
+ printf("impossible d'ouvrir %s\n", token);
+ break;
+ }
+ iGame.save(fout);
+ fout.close();
+ }
+ break;
+ case 'q':
+ quit = 1;
+ break;
+ default:
+ printf("commande inconnue\n");
+ break;
+ }
+ }
+ }
+ printf("fin du mode duplicate\n");
+}
+
+
+void
+main_loop(const Dictionary &iDic)
+{
+ char *token;
+ char *commande = NULL;
+ char delim[] = " \t";
+ int quit = 0;
+
+ printf("[?] pour l'aide\n");
+ while (quit == 0)
+ {
+ commande = rl_gets();
+ token = strtok(commande, delim);
+ if (token)
+ {
+ switch (token[0])
+ {
+ case '?':
+ help();
+ break;
+ case 'c':
+ token = next_token_filename(NULL, delim);
+ if (token == NULL)
+ {}
+ else
+ {
+ FILE* fin;
+ fprintf(stderr, "chargement de -%s-\n", token);
+ if ((fin = fopen(token, "r")) == NULL)
+ {
+ printf("impossible d'ouvrir %s\n", token);
+ break;
+ }
+ Game *game = Game::load(fin, iDic);
+ fclose(fin);
+ if (game == NULL)
+ {
+ fprintf(stderr, "erreur pendant le chargement\n");
+ }
+ else
+ {
+ if (game->getMode() == Game::kTRAINING)
+ loop_training((Training&)*game);
+ else if (game->getMode() == Game::kFREEGAME)
+ loop_freegame((FreeGame&)*game);
+ else
+ loop_duplicate((Duplicate&)*game);
+ }
+ }
+ break;
+ case 'e':
+ {
+ // New training game
+ Training *game =
GameFactory::Instance()->createTraining(iDic);
+ game->start();
+ loop_training(*game);
+ GameFactory::Instance()->releaseGame(*game);
+ break;
+ }
+ case 'd':
+ {
+ int i;
+ // New duplicate game
+ token = next_token_digit(NULL, delim);
+ if (token == NULL)
+ {
+ help();
+ break;
+ }
+#if 0
+ Duplicate *game =
GameFactory::Instance()->createDuplicate(iDic);
+ for (i = 0; i < atoi(token); i++)
+ game->addHumanPlayer();
+ token = next_token_digit(NULL, delim);
+ if (token == NULL)
+ {
+ help();
+ break;
+ }
+ for (i = 0; i < atoi(token); i++)
+ game->addAIPlayer();
+ game->start();
+ loop_duplicate(*game);
+ GameFactory::Instance()->releaseGame(*game);
+#endif
+ break;
+ }
+ case 'l':
+ {
+ int i;
+ // New free game
+ token = next_token_digit(NULL, delim);
+ if (token == NULL)
+ {
+ help();
+ break;
+ }
+#if 0
+ FreeGame *game =
GameFactory::Instance()->createFreeGame(iDic);
+ for (i = 0; i < atoi(token); i++)
+ game->addHumanPlayer();
+ token = next_token_digit(NULL, delim);
+ if (token == NULL)
+ {
+ help();
+ break;
+ }
+ for (i = 0; i < atoi(token); i++)
+ game->addAIPlayer();
+ game->start();
+ loop_freegame(*game);
+ GameFactory::Instance()->releaseGame(*game);
+#endif
+ break;
+ }
+ case 'D':
+ {
+ // New duplicate game
+#if 0
+ Duplicate *game =
GameFactory::Instance()->createDuplicate(iDic);
+ game->addHumanPlayer();
+ game->addAIPlayer();
+ game->start();
+ loop_duplicate(*game);
+ GameFactory::Instance()->releaseGame(*game);
+#endif
+ break;
+ }
+ case 'L':
+ {
+ // New free game
+#if 0
+ FreeGame *game =
GameFactory::Instance()->createFreeGame(iDic);
+ game->addHumanPlayer();
+ game->addAIPlayer();
+ game->start();
+ loop_freegame(*game);
+ GameFactory::Instance()->releaseGame(*game);
+#endif
+ break;
+ }
+ case 'q':
+ quit = 1;
+ break;
+ default:
+ printf("commande inconnue\n");
+ break;
+ }
+ }
+ }
+}
+
+
+int
+main(int argc, char *argv[])
+{
+ char dic_path[100];
+
+ Dictionary dic = NULL;
+
+ if (argc != 2 && argc != 3)
+ {
+ fprintf(stdout, "Usage: eliot /chemin/vers/ods4.dawg [random_seed]\n");
+ exit(1);
+ }
+ else
+ strcpy(dic_path, argv[1]);
+
+ switch (Dic_load(&dic, dic_path))
+ {
+ case 0:
+ /* Normal case */
+ break;
+ case 1:
+ printf("chargement: problème d'ouverture de %s\n", argv[1]);
+ exit(1);
+ break;
+ case 2:
+ printf("chargement: mauvais en-tete de dictionnaire\n");
+ exit(2);
+ break;
+ case 3:
+ printf("chargement: problème 3 d'allocation mémoire\n");
+ exit(3);
+ break;
+ case 4:
+ printf("chargement: problème 4 d'alocation mémoire\n");
+ exit(4);
+ break;
+ case 5:
+ printf("chargement: problème de lecture des arcs du
dictionnaire\n");
+ exit(5);
+ break;
+ default:
+ printf("chargement: problème non-repertorié\n");
+ exit(6);
+ break;
+ }
+
+ if (argc == 3)
+ srand(atoi(argv[2]));
+ else
+ srand(time(NULL));
+
+ main_loop(dic);
+ GameFactory::Destroy();
+
+ Dic_destroy(dic);
+
+ // Free the readline static variable
+ if (line_read)
+ free(line_read);
+
+ return 0;
+}
- [Eliot-dev] Changes to eliot/utils/eliottxt.cpp [antoine-1],
eliot-dev <=