Ejemplo n.º 1
0
/*!
 * @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;
}
Ejemplo n.º 2
0
int main() {
	char cmdline[MAXLINE];
	
	control_block();
	shellpid = getpgrp();
	forepid = 0;
	printf("tcgetsid: %d\ngetsid=%d\ntcgetpgrp=%d\nmyshell pgrp=%d\n", 
		tcgetsid(STDIN_FILENO), getsid(getpid()), tcgetpgrp(STDIN_FILENO), getpgrp());
	
	if (signal(SIGCHLD, SIG_IGN) == SIG_ERR) {
		printf("signal error\n");
		exit(-1);
	}
	initjobs();
	while (1) {	
		printf("myshell> ");
		Fgets(cmdline, MAXLINE, stdin);
		if (feof(stdin))
			exit(0);
		eval(cmdline);
	}
}