7.○×ゲームを作ってみよう

7-2. プログラミング

◇プログラミング

前回のフロー(というか中途半端なPAD図)を元にプログラミングしてみます。

#include<stdio.h>
main()
{
    int err;
    char c,
    line1[9]="    789\n",
    line2[9]="    456\n",
    line3[9]="    123\n";
    printf("○×ゲーム\n");
    printf("%s%s%s\n",line1,line2,line3);

  while(1){
    while(1){
      err=0;
      printf("○先手:数字キーで指定");
      scanf("%c%*[^\n]",&c);getchar();

      switch(c){
        case '1': if(line3[0]==' ')line3[0]='o';else err=1;break;
        case '2': if(line3[1]==' ')line3[1]='o';else err=1;break;
        case '3': if(line3[2]==' ')line3[2]='o';else err=1;break;
        case '4': if(line2[0]==' ')line2[0]='o';else err=1;break;
        case '5': if(line2[1]==' ')line2[1]='o';else err=1;break;
        case '6': if(line2[2]==' ')line2[2]='o';else err=1;break;
        case '7': if(line1[0]==' ')line1[0]='o';else err=1;break;
        case '8': if(line1[1]==' ')line1[1]='o';else err=1;break;
        case '9': if(line1[2]==' ')line1[2]='o';else err=1;break;
        default : err=1;
      }
      if(err==1)printf("もう一度入力してください");
      else break;
    }
    printf("%s%s%s\n",line1,line2,line3);

    if(line3[0]=='o'&&line3[1]=='o'&&line3[2]=='o' ||
       line2[0]=='o'&&line2[1]=='o'&&line2[2]=='o' ||
       line1[0]=='o'&&line1[1]=='o'&&line1[2]=='o' ||
       line3[0]=='o'&&line2[0]=='o'&&line1[0]=='o' ||
       line3[1]=='o'&&line2[1]=='o'&&line1[1]=='o' ||
       line3[2]=='o'&&line2[2]=='o'&&line1[2]=='o' ||
       line3[0]=='o'&&line2[1]=='o'&&line1[2]=='o' ||
       line3[2]=='o'&&line2[1]=='o'&&line1[0]=='o'){
       printf("○ 先手の勝ち\n");return 0;}

    while(1){
      err=0;
      printf("×後手:数字キーで指定");
      scanf("%c%*[^\n]",&c);getchar();

      switch(c){
        case '1': if(line3[0]==' ')line3[0]='x';else err=1;break;
        case '2': if(line3[1]==' ')line3[1]='x';else err=1;break;
        case '3': if(line3[2]==' ')line3[2]='x';else err=1;break;
        case '4': if(line2[0]==' ')line2[0]='x';else err=1;break;
        case '5': if(line2[1]==' ')line2[1]='x';else err=1;break;
        case '6': if(line2[2]==' ')line2[2]='x';else err=1;break;
        case '7': if(line1[0]==' ')line1[0]='x';else err=1;break;
        case '8': if(line1[1]==' ')line1[1]='x';else err=1;break;
        case '9': if(line1[2]==' ')line1[2]='x';else err=1;break;
        default : err=1;
      }
      if(err==1)printf("もう一度入力してください");
      else break;
    }
    printf("%s%s%s\n",line1,line2,line3);

    if(line3[0]=='x'&&line3[1]=='x'&&line3[2]=='x' ||
       line2[0]=='x'&&line2[1]=='x'&&line2[2]=='x' ||
       line1[0]=='x'&&line1[1]=='x'&&line1[2]=='x' ||
       line3[0]=='x'&&line2[0]=='x'&&line1[0]=='x' ||
       line3[1]=='x'&&line2[1]=='x'&&line1[1]=='x' ||
       line3[2]=='x'&&line2[2]=='x'&&line1[2]=='x' ||
       line3[0]=='x'&&line2[1]=='x'&&line1[2]=='x' ||
       line3[2]=='x'&&line2[1]=='x'&&line1[0]=='x'){
       printf("× 後手の勝ち\n");return 0;}
  }
}

[LSI-C86用]

#include<stdio.h>
main()
{
    int err;
    char c,
    line1[9]="    789\n",
    line2[9]="    456\n",
    line3[9]="    123\n";
    printf("○×ゲーム\n");
    printf("%s%s%s\n",line1,line2,line3);

  while(1){
    while(1){
      err=0;
      printf("○先手:数字キーで指定");
      scanf("%c%*[^\n]",&c);getchar();

      switch(c){
        case '1': if(line3[0]==' ')line3[0]='o';else err=1;break;
        case '2': if(line3[1]==' ')line3[1]='o';else err=1;break;
        case '3': if(line3[2]==' ')line3[2]='o';else err=1;break;
        case '4': if(line2[0]==' ')line2[0]='o';else err=1;break;
        case '5': if(line2[1]==' ')line2[1]='o';else err=1;break;
        case '6': if(line2[2]==' ')line2[2]='o';else err=1;break;
        case '7': if(line1[0]==' ')line1[0]='o';else err=1;break;
        case '8': if(line1[1]==' ')line1[1]='o';else err=1;break;
        case '9': if(line1[2]==' ')line1[2]='o';else err=1;break;
        default : err=1;
      }
      if(err==1)printf("もう一度入力してください");
      else break;
    }
    printf("%s%s%s\n",line1,line2,line3);

    if(line3[0]=='o'&&line3[1]=='o'&&line3[2]=='o' ||
       line2[0]=='o'&&line2[1]=='o'&&line2[2]=='o' ||
       line1[0]=='o'&&line1[1]=='o'&&line1[2]=='o' ||
       line3[0]=='o'&&line2[0]=='o'&&line1[0]=='o'){
       printf("○ 先手の勝ち\n");return 0;}
    else if(
       line3[1]=='o'&&line2[1]=='o'&&line1[1]=='o' ||
       line3[2]=='o'&&line2[2]=='o'&&line1[2]=='o' ||
       line3[0]=='o'&&line2[1]=='o'&&line1[2]=='o' ||
       line3[2]=='o'&&line2[1]=='o'&&line1[0]=='o'){
       printf("○ 先手の勝ち\n");return 0;}

    while(1){
      err=0;
      printf("×後手:数字キーで指定");
      scanf("%c%*[^\n]",&c);getchar();

      switch(c){
        case '1': if(line3[0]==' ')line3[0]='x';else err=1;break;
        case '2': if(line3[1]==' ')line3[1]='x';else err=1;break;
        case '3': if(line3[2]==' ')line3[2]='x';else err=1;break;
        case '4': if(line2[0]==' ')line2[0]='x';else err=1;break;
        case '5': if(line2[1]==' ')line2[1]='x';else err=1;break;
        case '6': if(line2[2]==' ')line2[2]='x';else err=1;break;
        case '7': if(line1[0]==' ')line1[0]='x';else err=1;break;
        case '8': if(line1[1]==' ')line1[1]='x';else err=1;break;
        case '9': if(line1[2]==' ')line1[2]='x';else err=1;break;
        default : err=1;
      }
      if(err==1)printf("もう一度入力してください");
      else break;
    }
    printf("%s%s%s\n",line1,line2,line3);

    if(line3[0]=='x'&&line3[1]=='x'&&line3[2]=='x' ||
       line2[0]=='x'&&line2[1]=='x'&&line2[2]=='x' ||
       line1[0]=='x'&&line1[1]=='x'&&line1[2]=='x' ||
       line3[0]=='x'&&line2[0]=='x'&&line1[0]=='x'){
       printf("× 後手の勝ち\n");return 0;}
    else if(
       line3[1]=='x'&&line2[1]=='x'&&line1[1]=='x' ||
       line3[2]=='x'&&line2[2]=='x'&&line1[2]=='x' ||
       line3[0]=='x'&&line2[1]=='x'&&line1[2]=='x' ||
       line3[2]=='x'&&line2[1]=='x'&&line1[0]=='x'){
       printf("× 後手の勝ち\n");return 0;}
  }
}
/* プログラムの終了 */

前回のフローそのままで書いたの、引き分けの時の処理をしていません。

◇解説

前回のコードを1つ1つ解説していきます。

ご注意:
このプログラムはLSI-Cではコンパイルできませんので、LSI-Cをお使いの方はこのプログラムに修正を加えるか上記のプログラムをご使用ください。

#include<stdio.h>                     /* もちろん必要 */
main()                                /* メイン関数 */
{
    int err;                          /* エラー用の変数 */
    char c,                           /* キー入力用 */
    line1[9]="    789\n",             /* 画面出力する文字列 */
    line2[9]="    456\n",
    line3[9]="    123\n";
    printf("○×ゲーム\n");           /* タイトル */
    printf("%s%s%s\n",line1,line2,line3); /* ここで画面出力 */

  while(1){     /* 全体のループ */
    while(1){   /* 先手のループ */
      err=0;    /* 正常値 */
      printf("○先手:数字キーで指定");
      scanf("%c%*[^\n]",&c);getchar(); /* キー入力とバッファ処理 */

      switch(c){

/*  ここで1~9以外のキーを押した時と、キーを押した場所がすでに○×
 * が入っている時、何もせずエラーをセットする。(err=1)
 * エラーでない時は先手のループから抜け出る。
 */
        case '1': if(line3[0]==' ')line3[0]='o';else err=1;break;
        case '2': if(line3[1]==' ')line3[1]='o';else err=1;break;
        case '3': if(line3[2]==' ')line3[2]='o';else err=1;break;
        case '4': if(line2[0]==' ')line2[0]='o';else err=1;break;
        case '5': if(line2[1]==' ')line2[1]='o';else err=1;break;
        case '6': if(line2[2]==' ')line2[2]='o';else err=1;break;
        case '7': if(line1[0]==' ')line1[0]='o';else err=1;break;
        case '8': if(line1[1]==' ')line1[1]='o';else err=1;break;
        case '9': if(line1[2]==' ')line1[2]='o';else err=1;break;
        default : err=1;
      }
      if(err==1)printf("もう一度入力してください");
      else break;
    } /* 先手のループの終端 */
    printf("%s%s%s\n",line1,line2,line3); /* 画面出力 */

/* 勝敗の判定 */

    if(line3[0]=='o'&&line3[1]=='o'&&line3[2]=='o' ||
       line2[0]=='o'&&line2[1]=='o'&&line2[2]=='o' ||
       line1[0]=='o'&&line1[1]=='o'&&line1[2]=='o' ||
       line3[0]=='o'&&line2[0]=='o'&&line1[0]=='o' ||
       line3[1]=='o'&&line2[1]=='o'&&line1[1]=='o' ||
       line3[2]=='o'&&line2[2]=='o'&&line1[2]=='o' ||
       line3[0]=='o'&&line2[1]=='o'&&line1[2]=='o' ||

       line3[2]=='o'&&line2[1]=='o'&&line1[0]=='o'){
       printf("○ 先手の勝ち\n");return 0;}

/* ここからは後手のループ */

    while(1){
      err=0;
      printf("×後手:数字キーで指定");
      scanf("%c%*[^\n]",&c);getchar();

      switch(c){
        case '1': if(line3[0]==' ')line3[0]='x';else err=1;break;
        case '2': if(line3[1]==' ')line3[1]='x';else err=1;break;
        case '3': if(line3[2]==' ')line3[2]='x';else err=1;break;
        case '4': if(line2[0]==' ')line2[0]='x';else err=1;break;
        case '5': if(line2[1]==' ')line2[1]='x';else err=1;break;
        case '6': if(line2[2]==' ')line2[2]='x';else err=1;break;
        case '7': if(line1[0]==' ')line1[0]='x';else err=1;break;
        case '8': if(line1[1]==' ')line1[1]='x';else err=1;break;
        case '9': if(line1[2]==' ')line1[2]='x';else err=1;break;
        default : err=1;
      }
      if(err==1)printf("もう一度入力してください");
      else break;
    }
/* 後手のループの終端 */
    printf("%s%s%s\n",line1,line2,line3);

    if(line3[0]=='x'&&line3[1]=='x'&&line3[2]=='x' ||
       line2[0]=='x'&&line2[1]=='x'&&line2[2]=='x' ||
       line1[0]=='x'&&line1[1]=='x'&&line1[2]=='x' ||
       line3[0]=='x'&&line2[0]=='x'&&line1[0]=='x' ||
       line3[1]=='x'&&line2[1]=='x'&&line1[1]=='x' ||
       line3[2]=='x'&&line2[2]=='x'&&line1[2]=='x' ||
       line3[0]=='x'&&line2[1]=='x'&&line1[2]=='x' ||
       line3[2]=='x'&&line2[1]=='x'&&line1[0]=='x'){
       printf("× 後手の勝ち\n");return 0;}
  } /* ここが全体のループの終端 */
}

/* プログラムの終了 */

ざっとこんな感じです。このままコンパイルできるようにコメント形式にして見ました。