juegos

Juegos de terminal de Pancho: Catan (TUI, GUI, web, servidor, PicoCalc), ajedrez, calculadora y minijuegos
git clone https://git.lu3dhn.xyz/juegos.git
Log | Files | Refs

main.c (5257B)


      1 /* main.c - ajedrez: punto de entrada y linea de comandos. */
      2 #include <stdio.h>
      3 #include <stdlib.h>
      4 #include <string.h>
      5 #include <unistd.h>
      6 #include "app.h"
      7 
      8 static void usage(void)
      9 {
     10     printf("uso: ajedrez [modo] [opciones]\n\n"
     11            "modos:\n"
     12            "  (nada)                     menu\n"
     13            "  ai                         contra la maquina\n"
     14            "  hotseat                    dos jugadores en la misma compu\n"
     15            "  watch                      maquina contra maquina\n"
     16            "  puzzle                     puzzles\n"
     17            "  resume                     retomar la ultima partida\n"
     18            "  pgn ARCHIVO                visor de PGN\n"
     19            "  import [ARCHIVO]           importar una partida (PGN o FEN) y seguirla\n"
     20            "  fen \"FEN\"                  jugar desde una posicion (dos jugadores)\n"
     21            "  online [servidor[:puerto]]  mis partidas en el servidor (puerto 7374)\n"
     22            "  host [puerto]              crear partida en red local\n"
     23            "  join COMPU [puerto]        unirse a una partida en red local\n\n"
     24            "opciones: --gui  --layout wide|compact  --scale N  --lang es|en\n\n"
     25            "herramientas:\n"
     26            "  --selftest [--deep]        pruebas del nucleo\n"
     27            "  --sim N [nivel]            N partidas motor contra motor verificando invariantes\n"
     28            "  --perft PROF [FEN]         perft por jugada\n"
     29            "  --bench                    velocidad del motor\n"
     30            "  --uci                      el motor como motor UCI (opcion Level 0..4)\n\n"
     31            "Stockfish (opcional, nivel extra y analisis): $CHESS_STOCKFISH, engine/stockfish o el PATH\n");
     32 }
     33 
     34 int main(int argc, char **argv)
     35 {
     36     if (argc >= 2 && !strcmp(argv[1], "--selftest")) return app_selftest(argc >= 3 && !strcmp(argv[2], "--deep"));
     37     if (argc >= 3 && !strcmp(argv[1], "--sim")) return app_sim(atoi(argv[2]), 12345, argc >= 4 ? atoi(argv[3]) : 1);
     38     if (argc >= 3 && !strcmp(argv[1], "--perft"))
     39         return app_perft(argc >= 4 ? argv[3] : "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", atoi(argv[2]));
     40     if (argc >= 2 && !strcmp(argv[1], "--bench")) return app_bench();
     41     if (argc >= 2 && !strcmp(argv[1], "--uci")) return app_uci();
     42     if (argc >= 2 && (!strcmp(argv[1], "--help") || !strcmp(argv[1], "-h"))) { usage(); return 0; }
     43 
     44     Settings st;
     45     settings_load(&st);
     46     g_lang = st.lang;
     47     bool gui = false;
     48     const char *mode = 0, *arg = 0, *extra = 0;
     49     for (int i = 1; i < argc; i++) {
     50         const char *a = argv[i];
     51         if (!strcmp(a, "--gui")) gui = true;
     52         else if (!strcmp(a, "--layout") && i + 1 < argc) st.layout = !strcmp(argv[++i], "compact") ? LAYOUT_COMPACT : LAYOUT_WIDE;
     53         else if (!strcmp(a, "--scale") && i + 1 < argc) st.scale = atoi(argv[++i]);
     54         else if (!strcmp(a, "--lang") && i + 1 < argc) { g_lang = !strcmp(argv[++i], "en"); st.lang = g_lang; }
     55         else if (!mode) mode = a;
     56         else if (!arg) arg = a;
     57         else if (!extra) extra = a;
     58         else { usage(); return 1; }
     59     }
     60     if (!gui) st.layout = LAYOUT_WIDE;
     61     /* cargar el archivo antes de abrir la pantalla, para poder avisar el error */
     62     char *text = 0;
     63     if (mode && (!strcmp(mode, "pgn") || (!strcmp(mode, "import") && arg))) {
     64         if (!arg || !(text = read_file(arg, 0))) { fprintf(stderr, "ajedrez: no se puede leer %s\n", arg ? arg : "(falta el archivo)"); return 1; }
     65     }
     66     Pos fenpos;
     67     if (mode && !strcmp(mode, "fen") && (!arg || !pos_from_fen(&fenpos, arg))) { fprintf(stderr, "ajedrez: FEN invalido\n"); return 1; }
     68     Frontend *fe = gui ? gui_open(st.layout, st.scale) : tui_open();
     69     if (!fe) { fprintf(stderr, "ajedrez: no se pudo abrir la pantalla\n"); return 1; }
     70     if (!mode) app_menu(fe, &st);
     71     else if (!strcmp(mode, "ai")) app_new_game(fe, &st, MODE_AI, 0);
     72     else if (!strcmp(mode, "hotseat")) app_new_game(fe, &st, MODE_HOTSEAT, 0);
     73     else if (!strcmp(mode, "watch")) app_new_game(fe, &st, MODE_WATCH, 0);
     74     else if (!strcmp(mode, "puzzle")) app_puzzles(fe, &st);
     75     else if (!strcmp(mode, "import")) app_import(fe, &st, text);
     76     else if (!strcmp(mode, "fen")) app_new_game(fe, &st, MODE_HOTSEAT, &fenpos);
     77     else if (!strcmp(mode, "online")) online_menu(fe, &st, arg);
     78     else if (!strcmp(mode, "host")) lan_host(fe, &st, arg ? atoi(arg) : 0);
     79     else if (!strcmp(mode, "join") && arg) {
     80         char host[128];
     81         int port;
     82         if (parse_hostport(arg, host, sizeof host, &port)) lan_join(fe, &st, host, extra ? atoi(extra) : port);
     83     }
     84     else if (!strcmp(mode, "resume")) {
     85         char last[600], err[128];
     86         static Session s;
     87         if (latest_save(last, sizeof last) && sess_resume(&s, last, err, sizeof err)) { app_play(fe, &s, &st); sess_close(&s); }
     88     } else if (!strcmp(mode, "pgn")) {
     89         char err[128];
     90         if (!app_viewer(fe, &st, text, err, sizeof err)) { fe->close(fe); fprintf(stderr, "ajedrez: %s\n", err); free(text); return 1; }
     91     } else { fe->close(fe); usage(); return 1; }
     92     fe->close(fe);
     93     free(text);
     94     if (access(last_pgn_path(), F_OK) == 0)
     95         printf("%s %s\n", g_lang ? "Last game (PGN):" : "Ăšltima partida (PGN):", last_pgn_path());
     96     return 0;
     97 }