static void process_line(const char *line) { char input[MAX_LINE_SIZE + 1], output[MAX_LINE_SIZE + 1], protocol[MAX_PROTOCOL_SIZE + 1], path[MAX_PATH_SIZE + 1]; ssize_t size; if (strlen(line) > MAX_LINE_SIZE) { fprintf(stderr, "line too long\n"); goto out; } strcpy(input, line); while (1) { if (read_protocol(input, protocol, sizeof(protocol)) == -1) { fprintf(stderr, "cannot read protocol\n"); goto out; } strcpy(path, "nb"); strcpy(path + 2, protocol); size = redirect(path, input, strlen(input), output, sizeof(output)); if (size == -1) { fputs(input, stdout); break; } else { output[size] = '\0'; strcpy(input, output); } } out: return; }
/*! * @brief ゲームのメインループ * @param [in] sock 送信先ソケットのディスクリプタ */ int play_tetris(int sock) { static const uchar FLAG = GAMEOVER; /* ゲームオーバ時に送信する値 */ uint cnt = 1; /* カウンタ */ time_t base_time = time(NULL); /* ゲーム開始時刻を記憶 */ initialize(sock); /* 初期化 */ while (!gameover) { /* ゲームオーバーになるまでゲーム続行 */ static uchar enemy_field[STAGE_HEIGHT][STAGE_WIDTH]; /* 相手のフィールドデータを格納する2次元配列 */ time_t game_time; /* ゲームを開始してから、何秒経過したかを保持する */ /* キー入力があればそれに応じて操作 */ control_block(); /* 32回ループをしたら、ブロックを1マス落とす */ if ((cnt = (cnt + 1) % 32) == 0) { drop_block(); } write(sock, field, sizeof(field)); /* 自分のフィールドデータを送信 */ write(sock, &score, sizeof(score)); /* 自分のスコアを送信 */ read(sock, enemy_field, sizeof(enemy_field)); /* 相手のフィールドデータを受信 */ read(sock, &enemy_score, sizeof(enemy_score)); /* 相手のスコアを受信 */ show_field(enemy_field, ENEMY_FIELD_X); /* 相手のフィールドを描画する */ if (read_protocol(enemy_field[0][0])) { /* 特別な値を受信していないかチェックする */ sleep(1); return EXIT_SUCCESS; /* ゲーム終了 */ } print_score(ENEMY_SCORE_X, ENEMY_SCORE_Y, enemy_score); /* 相手のスコアを描画 */ if ((game_time = GAME_TIME - (time(NULL) - base_time)) == 0) { timeup(sock); sleep(1); return EXIT_SUCCESS; /* ゲーム終了 */ } print_time(game_time); /* ゲーム時間を表示する */ usleep(20000); /* 20000マイクロ秒停止する(この間、CPUに負荷をかけない) */ } write(sock, &FLAG, sizeof(FLAG)); /* 自分がゲームオーバになったことを相手に知らせる */ clear(); mvprintw(RESULT_STR_Y, RESULT_STR_X, "You lose!"); refresh(); sleep(2); endwin(); /* curses終了 */ puts("\nYou lose!"); sleep(1); return EXIT_SUCCESS; }