• 締切済み

C言語で三目並べをするプログラムの作成

C言語で三目並べ(いわゆる○×)をするプログラムを作成したいのですがうまくいきません;; どなたか教えてください。よろしくお願いします。 条件 ・コンピュータの手はランダムに決定するものとする(空いているところに打つ) ・盤面を表現する配列は3×3の二次元配列とし、グローバルに宣言する ・以下のような関数を作成すること:盤の表示、○×を打つ、3つ並んだかチェック ・他にも必要に応じて関数を宣言すること ヒント集 ・マスの状態は空:0 ○:1 ×:2など数値で定義するとよい。 ・char stone[3][3]={"-","○","×"};などと宣言しておくと便利? ・9マスしかないので、9マス打ち切ったら終了→このとき勝敗が決まっていなければ引き分け ・ループの考え方は2通りできる  1.先手後手がセットで1ループ、9マス目に先手が打ったらbreak 2.先手、後手それぞれ1ループ,nマス目は、n%2=0なら先手、n%2=1な  ら後手 ・三目並んだかのチェックは工夫のしどころ  ・手盤の人の石だけチェックする  ・打ったところの縦横は必ずチェック、斜めはどうする? ・作っていく順  ・石の入力+盤面表示、コンピュータの手番、3つ並んだかチェック、勝敗表示  ・石の入力+盤面表示、3つ並んだかチェック、勝敗表示、コンピュータの手番

みんなの回答

  • TKOZ
  • ベストアンサー率66% (2/3)
回答No.3

#include<stdio.h> #include<stdlib.h> #include<windows.h> #define NONE 0 #define MARU 1 #define BATU 2 #define MY 0 #define COM 1 int tbl[3][3]={NONE}; int CheckJudge(int Col) { if(tbl[0][0]==Col && tbl[1][0]==Col && tbl[2][0]==Col) return 1; if(tbl[0][1]==Col && tbl[1][1]==Col && tbl[2][1]==Col) return 1; if(tbl[0][2]==Col && tbl[1][2]==Col && tbl[2][2]==Col) return 1; if(tbl[0][0]==Col && tbl[0][1]==Col && tbl[0][2]==Col) return 1; if(tbl[1][0]==Col && tbl[1][1]==Col && tbl[1][2]==Col) return 1; if(tbl[2][0]==Col && tbl[2][1]==Col && tbl[2][2]==Col) return 1; if(tbl[0][0]==Col && tbl[1][1]==Col && tbl[2][2]==Col) return 1; if(tbl[2][0]==Col && tbl[1][1]==Col && tbl[0][2]==Col) return 1; return 0; } void DrawCell(void) { int i,j; printf(" 0 1 2\n"); for(i=0;i<3;i++) { printf(" %d",i); for(j=0;j<3;j++) { switch(tbl[j][i]) { case MARU: printf("○"); break; case BATU: printf("×"); break; case NONE: printf("□"); break; } } printf("\n"); } } int CheckPut(int x,int y) { if(tbl[x][y]==0) return 1; else return 0; } int AIOfCOM(void) { int rx,ry; printf("コンピュータの番です。\n"); Sleep((rand()%2+1)*1000);//ランダム秒待つ do{ rx=rand()%3; ry=rand()%3; }while(CheckPut(rx,ry)==0); tbl[rx][ry]=BATU; printf("コンピュータは(%d,%d)に打ちました。\n",rx,ry); } int ChangeJunban(int *junban) { *junban^=1; } int main(void) { int tex,tey; int junban=0; srand(time(NULL)); int cnt=0; while(1) { DrawCell(); if(junban==MY) if(CheckJudge(MARU)==1) { printf("プレイヤーの勝ちです。\n"); break; } else if(CheckJudge(BATU)==1) { printf("コンピュータの勝ちです。\n"); break; } switch(junban) { case MY: do{ printf("プレイヤーの番です。\nx,yの規則で入力してください。\n"); scanf("%d,%d",&tex,&tey); }while(CheckPut(tex,tey)==0); tbl[tex][tey]=MARU; break; case COM: AIOfCOM(); break; } ChangeJunban(&junban); cnt++; if(cnt>8) { printf("引き分けです。\n"); break; } Sleep(3000); //3秒待つ system("cls"); } return 0; }

回答No.2

なにがうまくいかないのでしょうか? 質問が読み取れません。 「C言語で」 だけでは環境が読み取れません。 Windowsアプリなのか、コンソールアプリなのか、 コンパイラは何なのか 実行環境は何なのか etc. ちなみに、問題の丸投げやってくださいってのは回答が付きませんので。 タダで全部やるって人はそうはいません。

回答No.1

>うまくいきません;; 何がうまくいかないのか一切提示がありません。 ソースの提示と「うまくいかない」内容を説明してください。 (3行目からは課題の設問の丸写しだけのようですし)

関連するQ&A

  • 3目並べのプログラムについての質問です

    以下のようにプログラムをつくりました #include <stdio.h> #include <stdlib.h> #include <time.h> void cleanSquare(void); void hand(char); void hand_CPU(char); void printSquare(void); void judge(void); void three(char, char, char); char square[3][3]; int nokori = 9; int main( void ) { cleanSquare(); printSquare(); while(1) { printf("Your turn.\n"); printf("Input (x,y) :"); hand('o'); printf("CPU chose (x,y):"); hand_CPU('x'); } } void cleanSquare(void) { int x, y; for(x = 0; x < 3; x++) { for(y = 0; y < 3; y++ ) { square[x][y] = ' '; } } } void hand(char mark) { int h, v; scanf("%1d%1d", &h, &v); while(square[h][v] != ' ' ) { printf("%1d-%1dは埋まっています。再入力(横縦):", h, v); scanf("%1d%1d", &h, &v); } square[h][v] = mark; nokori--; printSquare(); judge(); if(!nokori) { printf("引き分け\n"); exit(1); } } void hand_CPU(char mark) { int h, v; srand(time(NULL)); //scanf("%1d%1d", &h, &v); h = rand() % 3; v = rand() % 3; printf("(%d,%d)\n", h, v); while(square[h][v] != ' ' ) { printf("%1d-%1dは埋まっています。再入力(横縦):", h, v); scanf("%1d%1d", &h, &v); } square[h][v] = mark; nokori--; printSquare(); judge(); if(!nokori) { printf("Tie \n"); exit(1); } } void printSquare(void) { int cnt; printf("\n 0 1 2\n"); printf(" -------------\n"); for(cnt = 0; cnt < 3; cnt++) { printf("%1d| %c | %c | %c |\n", cnt, square[0][cnt], square[1][cnt], square[2][cnt]); printf(" -------------\n"); } } void judge(void) { int x, y; for(y = 0; y < 3; y++) { three(square[0][y], square[1][y], square[2][y]); for(x = 0; x < 3; x++) { three(square[x][0], square[x][1], square[x][2]); three(square[0][0], square[1][1], square[2][2]); three(square[2][0], square[1][1], square[0][2]); } } } void three(char a, char b, char c) { if(a == ' ') { return; } if(a == b && b == c) { if(a == 'o') { printf("Win! \n"); } else { printf("Lose. \n"); } exit(1); } return; } 以前、学校の課題としてでたものを復習していたのですが、わからない部分がでてきました。 このプログラムを次のように改造したいのですが、どのように改造すればいいのかわかりません 1.ゲーム全体を関数化する main関数でこの関数を呼び出すと何回もゲームができるようにする int game(int n)と宣言しようと考えています 2.マス目の大きさを関数game()が引数として受け取ったnを、n×nのマス目でゲームができるようにする nは、ゲームごとにmain関数で入力 10×10までの大きさ 3.自分の番の時に、座標を入力する時に負の値が入力されたら、ゲームを終了させる 4.勝敗の記録と表示 例えば、引き分けを0、勝ちを1、負けを2、途中終了を-1 を戻り値として返すようにして、途中終了以外の場合はゲームの成績を 勝ち:3、負け:2、引き分け:0のように表示する 5.ゲーム終了後に続けるか、やめるかの選択 文字を一文字入力して、'y'なら1を返し、'n'なら0を返す それ以外の文字だったら、再入力させるという処理を関数化する int newgame(void)として宣言しようと考えています また、この関数の戻り値が0の場合プログラムの終了、1なら新しいゲームの開始 です。長くて申し訳ないですm(_ _)m よろしくお願いしますm(_ _)m

  • [C言語]三目並べ

    三目並べのプログラムで、以下のようなコンピュータの思考ルーチンを作っている所なのですが、 /* 後手で先手に初めに真ん中に置かれたら角に置く */ /* 後手で先手に初めに角に置かれたら真ん中に置く */ この二つがうまくいかないようで困っています。どこか間違っているのでしょうか? void com( char te ) { int total,kado,aite,a,tate,yoko,ok = 0; /* 0 = 空 te = 1(○) → aite = 2(×) 1 = ○ te = 2(×) → aite = 1(○) 2 = × */ /* 勝てる場所を探す */ for ( tate = 0; tate < 3; tate++ ) { /* 横一列 */ if( brd[tate][0] == 0 && brd[tate][1] == te && brd[tate][2] == te ) { brd[tate][0] = te; return; } if( brd[tate][0] == te && brd[tate][1] == 0 && brd[tate][2] == te ) { brd[tate][1] = te; return; } if( brd[tate][0] == te && brd[tate][1] == te && brd[tate][2] == 0 ) { brd[tate][2] = te; return; } } for ( yoko = 0; yoko < 3; yoko++ ) { /* 縦一列 */ if( brd[0][yoko] == 0 && brd[1][yoko] == te && brd[2][yoko] == te ) { brd[0][yoko] = te; return; } if( brd[0][yoko] == te && brd[1][yoko] == 0 && brd[2][yoko] == te ) { brd[1][yoko] = te; return; } if( brd[0][yoko] == te && brd[1][yoko] == te && brd[2][yoko] == 0 ) { brd[2][yoko] = te; return; } } if( brd[0][0] == 0 && brd[1][1] == te && brd[2][2] == te ) { /* 斜め1 */ brd[0][0] = te; return; } if( brd[0][0] == te && brd[1][1] == 0 && brd[2][2] == te ) { brd[1][1] = te; return; } if( brd[0][0] == te && brd[1][1] == te && brd[2][2] == 0 ) { brd[2][2] = te; return; } if( brd[0][2] == 0 && brd[1][1] == te && brd[2][0] == te) { /* 斜め2 */ brd[0][2] = te; return; } if( brd[0][2] == te && brd[1][1] == 0 && brd[2][0] == te) { brd[1][1] = te; return; } if( brd[0][2] == te && brd[1][1] == te && brd[2][0] == 0) { brd[2][0] = te; return; } /* 相手の勝ちを阻止する */ aite = te % 2 + 1; for ( tate = 0; tate < 3; tate++ ) { /* 横一列 */ if( brd[tate][0] == 0 && brd[tate][1] == aite && brd[tate][2] == aite){ brd[tate][0] = te; return; } if( brd[tate][0] == aite && brd[tate][1] == 0 && brd[tate][2] == aite){ brd[tate][1] = te; return; } if( brd[tate][0] == aite && brd[tate][1] == aite && brd[tate][2] == 0){ brd[tate][2] = te; return; } } for ( yoko = 0; yoko < 3; yoko++ ) { /* 縦一列 */ if( brd[0][yoko] == 0 && brd[1][yoko] == aite && brd[2][yoko] == aite){ brd[0][yoko] = te; return; } if( brd[0][yoko] == aite && brd[1][yoko] == 0 && brd[2][yoko] == aite){ brd[1][yoko] = te; return; } if( brd[0][yoko] == aite && brd[1][yoko] == aite && brd[2][yoko] == 0){ brd[2][yoko] = te; return; } } if( brd[0][0] == 0 && brd[1][1] == aite && brd[2][2] == aite){ /* 斜め1 */ brd[0][0] = te; return; } if( brd[0][0] == aite && brd[1][1] == 0 && brd[2][2] == aite ) { brd[1][1] = te; return; } if( brd[0][0] == aite && brd[1][1] == aite && brd[2][2] == 0 ) { brd[2][2] = te; return; } if( brd[0][2] == 0 && brd[1][1] == aite && brd[2][0] == aite){ /* 斜め2 */ brd[0][2] = te; return; } if( brd[0][2] == aite && brd[1][1] == 0 && brd[2][0] == aite) { brd[1][1] = te; return; } if( brd[0][2] == aite && brd[1][1] == aite && brd[2][0] == 0) { brd[2][0] = te; return; } /* 後手で先手に初めに角に置かれたら真ん中に置く */ if ( te == 2 ) { for ( a = 0; a < 9; a++ ) { total += brd[a/3][a%3]; } kado = brd[0][0] + brd[0][2] + brd[2][0] + brd[2][2]; if ( total == 1 && kado ==1){ brd[1][1] = te; return; } } /* 後手で先手に初めに真ん中に置かれたら角に置く */ if ( te == 2 ) { for ( a = 0; a < 9; a++ ) { total += brd[a/3][a%3]; } if ( total == 1 && brd[1][1] == aite){ brd[0][0] = te; return; } } /* ランダム */ srandomdev(); do { a = random() % 9; tate = a/3; yoko = a%3; if ( brd[tate][yoko] == 0 ) { ok = 1; } } while ( ok == 0 ); /* 盤面に書き込み */ brd[tate][yoko] = te; }

  • c言語マップ探査ゲーム プログラミング

    学校の課題で、5×5のマス目を移動するマップ探査ゲームというものをプログラミングします。 プログラミングは超初心者なので簡単な命令で、できれば軽く解説してもらえると嬉しいです。 プレイヤーは移動方向を選択し、それぞれのマス目で通過か探査を選びます。 探査を選ぶとランダムで2~9のgoldを手に入れ獲得goldはメッセージで知らされます。 マップの表し方は 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 未探査のマスを0、プレイヤーを1、探査済のマスを獲得gold2~9で表します。 左上をスタートとし右下をゴールとします。 その他の条件として 1、スタート地点は探査は行えず、ゴール地点は必ず探査を行うようにします。 2、マス目から外れたところには、行けないようにします。(現在地を変化させない) 3、適当な位置に所持goldが半分もしくは、全額失うマス目を二ヶ所作ります。半額は少数切り上げ   で、goldを失ったこととその数をメッセージで知らせ、マップには-1と表示します。 4、マップ上ではプレイヤーを優先して表示します。 5、マスは自由に移動可能だが、探査済のマスは再探査できない。 6、ゴール地点を探査した時点でゲーム終了となり、43~47gold入手してる場合は"You wins!"それ以外は、"You lost!"と表示しゲームを終了する。 例として #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int movex = 0, movey = 0, gold = 0, getm; int direction, scanp; srand(time(NULL)); while (1) { printf("Input, where you going ? (Up:1, Down:2, Left:3, Right:4): "); scanf("%d", &direction); switch (direction) { case 1: movey--; break; case 2: movey++; break; case 3: movex--; break; case 4: movex++; break; } printf("Input, Check or Through ? (Check:1, Through:0) : "); scanf("%d", &scanp); if(scanp == 1 ) { getm = rand() % 8 + 2; printf("You get %d gold.\n", getm); gold = gold + getm; } } exit(0); } が与えられています。 これを参考に作ってもらえるとありがたいです。

  • VC++.netにおけるPictureBox内の画像の透過処理について。

    現在VisualC++で囲碁対局ソフトを作成しています。 盤面イメージをPictureBoxに貼り付け、さらにそのPictureBoxの上に石を貼り付けるための小さいPictureBoxを升目の数だけ配置したのですが、そうすると下の盤面画像が見えなくなってしまいました。 そこで、石画像に背景色の透過処理を施したいのですが、うまくいきません。石の画像のうちの背景色の部分を透過させ、その部分には下の盤面画像が表示されるような方法を知っている方がいましたら、是非、お教えください。

  • C言語の問題でわからないところがあります

    先ほども似たような内容で質問させて頂いたのですが、もう一度質問させてください。 最近C言語を勉強し始めたのですが、わからないところがあります。 二つの整数値を読み込んで、小さい方の数以上で大きい方の数以下の整数を全て加えた値を表示するプログラムを作成するものなのですが、うまくいかなく困っています。 他の書き方でやれば普通にいけると思うのですが、これだとできない理由がわからないと、もやもやしてしまうので・・・・ プログラムは以下の通りです #include <stdio.h> int main(void) { int n1,n2,n3,n4; puts("二つの整数を入力してください"); printf("整数1:"); scanf("%d",&n1); printf("整数2:"); scanf("%d",&n2); n3=(n1>n2) ? n2 : n1; n4=(n1>n2) ? n1 : n2; printf("%d以上%d以下の全整数の和は", n3,n4); int num=n3; /* numの最初の値は小さい方の値 */ int wa=0; /* n3が小さい方の数、n4は大きい方の数 */ do{ if (n1>n2) { wa=n4+num; /* 大きいほうの数(num)にsub(小さい方の数+0,2,3,4・・・)を足していく */ num=num+1;/* ここを通るたびにsubに+1 */ printf("%d",wa);} else { wa=n4+num; num=num+1; printf("%d",wa);} }while(num<n4); /* num<n4を満たさない=numが大きいほうの数よりも大きくなったらループを終了 */ printf ("です\n"); /* ですっす */ return 0; } これで大きい方に37、小さいほうに28と入力すると656667686970717273ととても大きな数値になってしまいます。 ループが間違っているのでしょうか? whileは whileの後の()の中身の条件を満たしているとにループする、と認識しているので、numが大きい方の数値より大きくなったとき、ループを終了するようにしているつもりです。 ここがどこか間違っているのでしょうか・・・? それから、初期化というのもいまいち理解していないのですが、intで宣言するときに、中に数値を格納しておく、という物だと思っています。 宣言の後にprintf("%d",num);などで確認すると、代入できているようなので、これは間違っていないと思うのですが・・・・、 間違っているところがざっとみて解りましたら、回答頂けるとありがたいです。 C言語を始めたばかりなので、できれば簡単に説明して頂けるとありがたいです。

  • C言語について

    C言語のじゃんけんゲームを作成したいのですが、 仕様は 1.利用者とコンピュータによる対戦形式とします。 2.利用者がキーボードから入力した手(グー・チョキ・パー)と、擬似乱数を用いて生成したコンピュータの手を比較し、利用者の勝ち・あいこ・負けの結果を表示しなさい。 3.利用者の入力が不正の場合には再度入力を促すなど、適切な処理をしなさい。 4.これまでの累積勝利数・引き分け数・敗北数をそれぞれ、user_win・user_draw・user_loseの3つの変数(int型)に格納しなさい。 5.連勝中の場合は「5連勝中!」などと表示させるようにしなさい。 6.あいこである限りは自動的にじゃんけんを反復しなさい。 7.勝敗がついた場合、利用者にまだ継続するか質問した上で、じゃんけんを反復させなさい。 8.じゃんけんを終了した場合、これまでの通算成績として、累積勝利数・引き分け数・敗北数のほか、勝利=累積勝利数÷(累積勝利数+累積敗北数)×100、および、最大勝利数を計算して表示しなさい。 という仕様のじゃんけんゲームを作成したいのですが、下記に書いているまでしかできません。誰か教えていただけないでしょうか。分からなくて困っています。 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(){ int a,c; srand(time(NULL)); c = rand()%3+1; printf("手を入力してください [1:グー 2:チョキ 3:パー] "); scanf("%d",&a); if(a==1 && c==1) printf("あなたはグーで、私もグーでした。アイコです。\n"); else if(a==1 && c==2) printf("あなたはグーで、私はチョキでした。あなたの勝ちです。\n"); else if(a==1 && c==3) printf("あなたはグーで、私はパーでした。あなたの負けです。\n"); else if(a==2 && c==1) printf("あなたはチョキで、私はグーでした。あなたの負けです。\n"); else if(a==2 && c==2) printf("あなたはチョキで、私もチョキでした。アイコです。\n"); else if(a==2 && c==3) printf("あなたはチョキで、私はパーでした。あなたの勝ちです。\n"); else if(a==3 && c==1) printf("あなたはパーで、私はグーでした。あなたの勝ちです。\n"); else if(a==3 && c==2) printf("あなたはパーで、私はチョキでした。あなたの負けです。\n"); else if(a==3 && c==3) printf("あなたはパーで、私もパーでした。アイコです。\n"); else printf("正しい手を入れてください。\n"); return 0; }

  • C++ scanfで止まらない

    いつもお世話になっております。 最近C++を勉強し始めたばかりで、初心者丸出しの質問になってしまうと思うのですがひとつよろしくお願いします。 本を見ながらじゃんけんゲームを作っていて、サンプルとは別に自分で考えて作ってみたのですが、scanfの挙動がどうも思い通りにいきません。 以下がソースです。 int testJanken() {     int player=0;     int computer;     printf("【じゃんけんゲーム】\n");     printf("じゃんけん・・・(グー:1 チョキ:2 パー:3 終了:9)>");     scanf("%d",&player);    //入力受付     while(player!=9)     {         if(0<player&&player<=3)         {             printf("\nあなたは:");             showTe(player);                          srand(time(NULL));             computer=rand()%3+1;             printf("コンピューターは:");             showTe(computer);             showShouhai(player,computer);         }         else         {             printf("\n----------1~3,または9の値を入れてください!---------\n");         }         printf("\nじゃんけん・・・(グー:1 チョキ:2 パー:3 終了:0)>");         player=0;         scanf("%d",&player);    //入力受付     }     printf("\nバイバイー!!");     return 0; } //勝敗決定表示 int showShouhai(int player, int computer) {     if(player==computer)     {         printf("あいこ!\n");         return 0;     }     else if((player+1==computer)||(player-2==computer))     {         printf("あなたの勝ち!\n");         return 1;     }     else     {         printf("コンピューターの勝ち・・・\n");         return 2;     } } //入力値からグーチョキパーを文字列で表示させる int showTe(int su) {     switch(su)     {         case 1:             printf("グー!\n");             break;         case 2:             printf("チョキ!\n");             break;         case 3:             printf("パー!\n");             break;         default:             printf("???\n");             break;     }     return 0; } 【実現したい仕様はこちら】 1)じゃんけんの手(1,2,3のどれか)を入れれば通常通りじゃんけんが行われ、結果が表示される。 2)9が入力されたら終了 3)1,2,3,9以外が入力されたらメッセージの表示 この3がうまくいきません。 制御できないのは文字を入力した場合なのですが、例えばaと入力するとそれ以降永久ループとなり抜け出せなくなってしまいます・・・ ネットであちこち原因を調べてみたのですが、探し方が悪いのか解決策がわかりません・・・ 今後の勉強のためにも原因と解決策を詳しく教えて頂けると嬉しいです。 よろしくお願いします。

  • ガンマ変換 C言語でプログラムの作成

    次式のように、原画像の任意の階調値fから、点線の矢印のようにして交換後の階調値gを決める。このような階調値の変換を表す配列 unsigned char trans[256];を用いて画像の濃度補正を行うプログラム作成せよとあるのですが、どのような計算式を用いて任意の変換の プログラムを作成してよいかわかりません。 同、問題でガンマ変換のプログラムは作成したのですが、 詳しい方で添付画像のようなプログラムを作成できる方がいましたらよろしくお願いします。 ESPライブラリを使用していますので、添付ファイルにソースとヘッダファイルと図を添付しています   プログラムの開始: sを押す         終了: xを押す --------------------------------------------------------------*/ #include <stdio.h> #include <stdlib.h> #include "mypgmesp.h" /* ESP関係の関数が定義されているヘッダファイル */ #define FINAL_LEVEL 64 //最終的な表現階調数// // 関数のプロトタイプ宣言 void gamma_histgram(void); /*************************************************************************    このプログラムを実行したとき、はじめに実行される処理を書く *************************************************************************/ void ESP_Ready(void) { ESP_Open_Window(); } /*************************************************************************    このプログラムが終了したとき、実行される処理を書く *************************************************************************/ void ESP_Finish(void) { } /*************************************************************************    startボタンが押されたときに、実行される処理を書く *************************************************************************/ void ESP_Main(void) { int ret; /* 準備 */ ESP_Prepare(); /* 画像データを image1 に読み込んで表示する */ ret = ESP_load_image_data(); if(ret){ ESP_StartMenu(); return; } /////////////////////////////////////////////////// // 以下に関数や命令を記述する gamma_histgram(); // ここまで /////////////////////////////////////////////////// /* image2 を保存し表示する */ ESP_save_image_data(); /* メッセージの表示 */ ESP_StartMenu( ); } ////////////////////////////////////////////////// // 以下の関数内にプログラムを追加する /////////////////////////////////////////////////// void gamma_histgram(void) { int i, x, y,g; /* ループ変数 */ long int target_value;//変換後の頻度の目標値// double gam = 2.0,j; unsigned char trans[256]; ESP_Printf("ガンマ補正を行う\n"); for (i = 0; i < 256; i ++){ j=i; g=255*pow(j/255.0,1.0/gam); if(g>255) { trans[i]=255; } else if (g<0) { trans[i]=0; } else { trans[i]=(unsigned char)g; } x_size2=x_size1; y_size2=y_size1; for ( y = 0; y < y_size2; y ++ ) { for ( x = 0; x < x_size2; x ++ ) image2[y][x] = trans[image1[y][x]]; } } }

  • C言語のポインタにの動作について

       以下のコードで、DelHalfSpc() において引数 str は str++ でカウントされ、ループを抜けた時点では文字列の末尾を指しているはずですが、なぜ呼び出し側の main()の char str[] には正しい値が入るのでしょうか? char *DelHalfSpc(char *str) {   //char *dmy = str; → char * という型の変数 dmy の宣言   char *dmy, *Res;   Res = dmy = str; // Res は常に先頭アドレスを指す   while (*str != '\0') {     if ( *str != ' ' ) {       *dmy = *str;       dmy++;     }     str++;   }   //ループを抜けたこの時点で str は文字列の末尾を指しているはず   *dmy = '\0';   return Res;   //ここを return str とするとヌル文字列を返す } int main(void) {   char str[] = " 1 23 4 5";   printf("空白削除前:\"%s\"\n", str);   printf("空白削除後:\"%s\"\n", DelHalfSpc(str));   printf("str も変化:\"%s\"\n", str); //なぜ正しい結果が表示されるのか?   return 0; } 【結果】 ----------------------- 空白削除前:" 1 23 4 5" 空白削除後:"12345" str も変化:"12345"

  • C言語 じゃんけんゲーム 急いでいます

    じゃんけんゲームを作成しましたが 以下のプログラムに ・コンピュータ(CP)の手を記録し一つ前と同じ手を出さずにランダムで手を出す (例:前回CPがパーなら、今回CPはチョキかグーをだす) ・あいこの場合次のじゃんけんで同じ手を再び出す (例:今回CPもプレイヤーもグーの場合は次のじゃんけんでCPはグーを出す) という2つを追加したいのですが恐縮ですが 私ならこう、という模範解答をお願いします… #include <stdio.h> int main() { int i,n; int player; int computer; //勝敗数変数 int p_kati, p_make,p_draw; int q_kati=0, q_make=0,q_draw=0; //繰り返し条件 do { //変数の初期化 p_kati=0; p_make=0; p_draw = 0; //タイトル printf("あなたが出した手は・・・\n"); //乱数の初期化 srand(time(NULL)); //最低5回繰り返す for(i=1; i<=5; i++){ //コンピュータの手 computer = rand() %3; //プレイヤーの手を表記 printf("(グー: 0 チョキ: 1 パー: 2)→ "); do{ scanf("%d", &player); //プレイヤーの手 if(player<0 || 2<player){ //0、1、2以外を入力すると printf("もう一度入力してください");//これを表示 } }while(player<0 || 2<player);//0、1、2を入力で下記を実行 //勝ち負けの判定 if(player==0 && computer==0){ printf("playerも私もグーでした…引き分けです\n"); p_draw++; } else if(player==0 && computer==1){ printf("playerはグーで、私はチョキです…あなたの勝利です\n"); p_kati++; } else if(player==0 && computer==2){ printf("playerはグーで、私はパーです…あなたの負けです\n"); p_make++; } else if(player==1 && computer==0){ printf("playerはチョキで、私はグーです…あなたの負けです\n"); p_make++; (全パターン長いので省略) else if(player==2 && computer==2){ printf("playerも私もパーでした…引き分けです\n"); p_draw++; } } //結果表示 printf("%d 勝 %d 敗 %d 引き分けでした。\n",p_kati,p_make,p_draw); printf("このまま続けますか?続ける場合は何か数字を入力し、続けない場合は -1 を入力してください > "); scanf("%d", &n); //トータル点数を計算 q_kati += p_kati; q_make += p_make; q_draw += p_draw; //n(入力された数字)が-1以外なら続ける }while(n != -1); printf("トータルで %d 勝 %d 敗 %d 引き分けでした。\n",q_kati,q_make,q_draw); return 0; }

専門家に質問してみよう