2015年 07月 12日
C言語でじゃんけん |
最近、組むプログラムのレベルが下がっている気がします。
でも、このプログラムだってどこかで使うかもしれない!! と思ったので、自分の勉強のつもりで組んでみました。
実際、私は #define をあまり使ったことなかったので、見やすいプログラムを組む練習にはなったと思います。(コメントのつけ方も少し変えてみました)
さて、このプログラムの流れですが、
・手の入力
・勝ち負けあいこの判定
・勝ち負けを出力
となっており、比較的簡単に作成できると思われます。
また、勝ち負けの判定はお互いの出した手の数字を足して考えました。
このプログラムでは、
・グー ・・・ 0
・チョキ・・・ 1
・パー ・・・ 2
と定義されているので、お互いの出す 手の全てのパターン は、(0,1),(0,2),(1,2)になります。(順不同、あいこは除く)
そしてこのパターンの数字二つを足した結果は、
・1 = (0 + 1) ・・・ グー の勝ち
・2 = (0 + 2)・・・ パー の勝ち
・3 = (1 + 2) ・・・ チョキの勝ち
となりますね。
ですので、この勝ちパターンをまた定義することで簡単に勝ち負けを判定することができます。(グーが勝ちの時、自分がグーを出してれば勝ち、出していなければ負けですから)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//じゃんけんの手を定義
#define gu 0
#define tyoki 1
#define pa 2
//勝ち負けパターンを定義
#define gu_win 1
#define pa_win 2
#define tyoki_win 3
//プロトタイプ宣言
void input_hand(int *P_hand,int *E_hand);
void check_hand(int *P_hand,int *E_hand,int *flag);
void judge_game (int win_flag);
void main(){
int Player_hand,Enemy_hand; //手を格納する変数
int flag=0; //勝ち負けあいこ判定フラグ
srand((unsigned int)time(NULL)); //乱数の種に時間を設定
printf("じゃんけんゲーム\n");
//あいこじゃなくなるまでループ
while(1){
input_hand(&Player_hand,&Enemy_hand); //手を入力
check_hand(&Player_hand,&Enemy_hand,&flag); //勝ち負け判断
if(flag >= 0) break; //あいこじゃなければループから抜ける
}
judge_game (flag); //勝ち負けを表示
}
// ----------------------------------
// input_hand : お互いの手を入力する
//
// *P_handにプレイヤーの入力を格納する
// *E_handにコンピュータの手を格納し、
// 表示する。
// ----------------------------------
void input_hand(int *P_hand,int *E_hand){
int scanf_flag; //scanfの入力チェック用
//プレイヤーの手を入力
printf("手を選択(0:グー 1:チョキ 2:パー)\n:");
//入力チェック
while(1){
scanf_flag=scanf("%d",P_hand);
if(scanf_flag != 1 || *P_hand < 0 || *P_hand > 2){
if(scanf_flag != 1) scanf("%*s");
printf("入力された値が正しくありません、もう一度入力してください。\n:");
continue;
}
break;
}
//コンピュータの手を入力
*E_hand=rand()%3;
switch(*E_hand){
case gu:
printf("相手:グー\n");
break;
case tyoki:
printf("相手:チョキ\n");
break;
case pa:
printf("相手:パー\n");
break;
}
}
// ----------------------------------------------
// check_hand : 手を比較し、勝ち負けあいこを判断
// *P_handと*E_handが同じ値なら、あいこ
// *P_handと*E_handを足して、
// ・1ならグーが勝つ
// ・2ならパーが勝つ
// ・3ならチョキが勝つ
// プレイヤーがこの手を出していたら勝ち
// ----------------------------------------------
void check_hand(int *P_hand,int *E_hand,int *flag){
int tmp_flag; //一時フラグ
*flag=0; //フラグ初期化
//手を比較
tmp_flag= *P_hand + *E_hand;
//あいこならスキップ
if(*P_hand != *E_hand){
if(*P_hand == gu && tmp_flag == gu_win) *flag = 1;
if(*P_hand == tyoki && tmp_flag == tyoki_win) *flag = 1;
if(*P_hand == pa && tmp_flag == pa_win) *flag = 1;
}else{
*flag = -1;
printf("あいこです、もう一度入力してください\n:");
}
}
// ---------------------------------------
// judg_game : プレイヤーの勝ち負けを表示
// win_flagが1なら勝ち
// win_flagが0なら負け
// ---------------------------------------
void judge_game(int win_flag){
//勝ち負けを表示
if(win_flag == 1) printf("あなたの勝ち\n");
else printf("あなたの負け\n");
}
もう少し暇になったら、今卒業制作でやっている PHPによるSNS のソースなんかも上げてみたいと思ってます。
※7/28に画像を追加しました。
by ice_arr
| 2015-07-12 21:36
| プログラミング