/* ブログ用 神経衰弱 */ #include #include #include #include #include /* 構造体定義 */ struct Card{ char *face, *suit; int found; }; typedef struct Card Card; /* プロトタイプ宣言 */ void initCardDeck(Card *deck); /*カード52枚に番号と種類を付ける */ void shuffleCardDeck(Card *deck); /* デッキをシャッフルする */ void printstatus(Card *deck); /* 神経衰弱の今の状態を表示する。 */ int printcard(Card *deck, int y, int x); /* めくったカードの中身を表示する。 */ int checkcard(Card *deck, int first, int second, int point); /* 捲ったカードが同じか判断する。 */ int checkdeck(Card *deck); /* 全て発見されたかを確認する。 */ /* ************************************************************************** */ int main(){ int i, want, y1, x1, y2, x2, first, second, a_point=0, b_point=0, count=1, judge; /* トランプの用意 */ Card deck[53]; /* Card型の箱を52個用意 */ initCardDeck(deck); /* トランプのデッキを制作する。初期化。 */ sleep(1); shuffleCardDeck(deck); /* デッキをシャッフルする */ sleep(1); printf("こちらがシャッフルされたトランプです。ご確認下さい。\n"); sleep(1); for(i=1; i<=52; i++){ printf("%sの%s\n", deck[i].suit, deck[i].face); } sleep(1); /* ゲーム開始 */ printf("\n\nそれでは神経衰弱を開始します。\n"); printf("【注意】4行13列を越える選択をすると、エラーと判断して終了します。\n"); sleep(2); printstatus(deck); /* デッキの状態を表示する */ sleep(1); while(1){ printf("\n=====================================\n"); printf("************ %dターン目 ************\n", count); printf("=====================================\n"); printf("Aさん:%dポイント\tBさん:%dポイント\n\n", a_point, b_point); /* 1人目のターン */ printf("==============\n"); printf("Aさんの番です。\n"); printf("==============\n\n"); printf("[1回目] めくりたいカードをn行m列で選択して下さい。(例:2 3)\n"); scanf("%d%d", &y1, &x1); first = printcard(deck, y1, x1); printf("\n[2回目] めくりたいカードをn行m列で選択して下さい。(例:2 3)\n"); scanf("%d%d", &y2, &x2); second = printcard(deck, y2, x2); sleep(1); printstatus(deck); a_point = checkcard(deck, first, second, a_point); /* 捲ったカードが同じなら得点 */ sleep(1); if(checkdeck(deck) == 52) /* 全て発見されていたら終了する */ break; /* 2人目のターン */ printf("\n==============\n"); printf("Bさんの番です。\n"); printf("==============\n\n"); printf("[1回目] めくりたいカードをn行m列で選択して下さい。(例:2 3)\n"); scanf("%d%d", &y1, &x1); first = printcard(deck, y1, x1); printf("\n[2回目] めくりたいカードをn行m列で選択して下さい。(例:2 3)\n"); scanf("%d%d", &y2, &x2); second = printcard(deck, y2, x2); sleep(1); printstatus(deck); b_point = checkcard(deck, first, second, b_point); /* 捲ったカードが同じなら得点 */ sleep(1); if(checkdeck(deck) == 52) /* 全て発見されていたら終了する */ break; count++; } printf("\n勝負がつきました。\n"); sleep(1); printf("Aさんのポイントは%d点\n", a_point); printf("Bさんのポイントは%d点\n", b_point); sleep(1); judge = a_point - b_point; /* 判定 */ if(judge > 0){ printf("よって、Aさんの勝ちです。\n"); } else if(judge < 0){ printf("よって、Bさんの勝ちです。\n"); } else printf("よって、同点です。\n"); sleep(1); printf("お疲れ様でした。ゲームを終了します。\n"); return 0; } /* **************************************************************** */ /* デッキを制作する関数 */ void initCardDeck(Card *deck){ char *face[13] = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"}; char *suit[4] = {"スペード", "ハート", "クラブ", "ダイヤ"}; int i,t,num=0; /* 配列faceとsuitを利用し、配列deckを初期化する。 */ /* スペードで13枚,ハートで13枚,クラブで13枚,ダイヤで13枚 */ for(i=0; i<4; i++){ for(t=0; t<13; t++){ deck[num+1].suit = suit[i]; deck[num+1].face = face[t]; deck[num+1].found = 0; num++; } } printf("トランプを制作しました。\n"); } /* ***************************************************************** */ /* デッキをシャッフルする関数 */ void shuffleCardDeck(Card *deck){ /* デッキをシャッフルする関数 */ long randNum1,randNum2; int i; Card temp; srandom(time(NULL)); /* time()で取得した時刻を乱数の種として設定 */ for(i=1; i<=50; i++){ /* 50回入れ換える */ randNum1 = random()%52+1; /* 1〜52までの数をランダムで出す。 */ randNum2 = random()%52+1; /* 上に同じ */ temp = deck[randNum1]; deck[randNum1] = deck[randNum2]; deck[randNum2] = temp; } printf("トランプをシャッフルしました。\n"); } /* ******************************************************************** */ /* 神経衰弱で使っているカードの状態を表示する関数 */ void printstatus(Card *deck){ int i; printf("\n\n\n===現在のトランプの様子。(□=未発見, ●=発見済, ▲=1度捲ったカード)===\n"); printf("12345678910111213\n"); for(i=1; i<=52; i++){ if(deck[i].found == 0){ printf("□"); /* 身発見 */ } else if(deck[i].found == 1){ printf("●"); /* 発見済 */ } else if(deck[i].found == 2){ printf("▲"); /* 一度捲ったカード */ } if(i%13 == 0) /* 13枚毎に改行して表示する。 */ printf("\n"); } printf("\n"); } /* *********************************************************************** */ /* めくったカードの中身を表示する関数。 */ int printcard(Card *deck,int y, int x){ int s,t,total,ytemp,xtemp; if(y>4 || x>13){ printf("残念ながら参照できません。\n ゲームを終了します。\n"); sleep(1); exit(0); } else{ ytemp = y; xtemp = x; s = y - 1; s = s * 13; t = x; total = s + t; printf("_/_/_/_/_/_/_/_/_/_/\n"); printf("%dの%dは\n%sの%sです。\n", ytemp, xtemp, deck[total].suit, deck[total].face); printf("_/_/_/_/_/_/_/_/_/_/\n"); deck[total].found = 2; return total; } } /* ************************************************************************ */ /* 捲ったカードが同じ番号かどうかを判断する。 */ int checkcard(Card *deck, int first, int second, int point){ int temp; temp = point; if(deck[first].face == deck[second].face){ deck[first].found = 1; deck[second].found = 1; printf("カードの番号が同じでした。やったね。\n"); temp++; /* 点数加算 */ sleep(1); printf("ポイントは%d点になりました。\n", temp); sleep(1); printstatus(deck); return temp; } else { printf("カードは同じではありませんでした\n"); return temp; } } /* ************************************************************************* */ /* 全てのカードが捲られたか確認する */ int checkdeck(Card *deck){ int judge=0, i; for(i=1; i<=52; i++){ if(deck[i].found == 1){ judge++; } } return judge; /* 発見済のカードの枚数を返す */ }