ばばぬき プログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
マホ

ばばぬき プログラム

#1

投稿記事 by マホ » 15年前

下は、ばばぬきのプログラムなんですが…
これに・人数の変更・場を盛り上げるメッセージ(会話、独り言?)を追加したいです。
どうすればいいのかまったくわからないので教えてほしいです。
お願いします!!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

char card_name[5][9]={{"◆"},{"■"},{"△"},{"▽"},{"×"}};

void swap(int card[/url], int i){//cardのi番目と乱数番目のカードを入れ替える
int r,k;
r=rand()%53; //ランダムな数を作る
k=card; //現在のi番目のカード情報を保存
card = card[[/url];//r番目のカード情報をi番目のカード情報に入れる
card[[/url]=k; //i番目のカード情報をr番目のカード情報に入れる
}

void show_card_detail(int p){//pのカードの情報を表示
printf("%s",card_name[p/13]);//マーク表示
if(p!=52) //ババじゃなかったら
printf("%-2d",p%13+1); //数も表示
else
printf(" ");
}

void drop_card(int p[/url]){ //同じ組のカードを捨てる
int i,j;
for(i=0;i<28;i++){ //1人の最大カード枚数
if(p==-1 || p==52)continue; //カードが無いかババなら
for(j=i+1;j<28;j++){ //次のカードから最後までチェック
if(p[j]==-1 || p[j]==52)continue;//カードが無いかババなら
if(p%13==p[j]%13){ //数が揃ったら
show_card_detail(p) , printf("と");
show_card_detail(p[j]) , printf("を捨てた\n");
p=-1; //捨てる
p[j]=-1; //捨てる
break;
}
}
}
}

void show_card(int p[2][28]){ //手持ちのカードを見せる
printf("\n");
for(int j=0;j<2;j++){
printf("プレイヤー%dの手札\n",j+1);
for(int i=0;i<28;i++){ //1人の最大カード枚数
if(p[j]==-1)continue; //カードが無いなら
show_card_detail(p[j]) , printf(" ");
}
printf("\n");
}
}

void get_card(int player[2][28], int j){ //相手のカードから一枚引く
int i,r;
while(1){
r=rand()%28; //相手のカードからランダムに
if(player[(j+1)%2][[/url]==-1)continue;//引くはずのカードが無ければ
else break; //あればbreak;
}
/*この(j+1)%2がポイント。次の相手を+1として表し、%によってループしている*/
for(i=0;i<28;i++){//自分の空いているカード情報に格納する
if(player[j]==-1){
player[j][i] = player[(j+1)%2][[/url]; //相手から引いたカードを自分のカードに
player[(j+1)%2][[/url] = -1; //引かれた相手のカードは無しに
printf("\nプレイヤー%dはプレイヤー%dから",j+1,(j+1)%2+1);
show_card_detail(player[j][i]) , printf("を引いた。\n");
break;
}
}
}

int check_card(int p[28]){//手札にまだカードがあるか。あるなら0、無いなら-1が返る
int i;
for(i=0;i<28;i++)
if(p[i]!=-1)
return 0;
return -1;
}

int main(void){
int i,j,card[53],player[2][28];
char s;

srand((unsigned)time(NULL));

memset(player[0],-1,sizeof(int)*28);//カード情報の初期化
memset(player[1],-1,sizeof(int)*28);//カード情報の初期化

for(i=0;i<53;i++)
card[i]=i; //53種類のカード情報を入れる
for(i=0;i<53;i++)
swap(card,i); //シャッフルする
for(i=0;i<53;i++)
player[i%2][i/2]=card[i];//配る
for(j=0;j<2;j++)
drop_card(player[j]); //同じ組を捨てる

printf("\n\n*****ゲームスタート*****\n\n");

show_card(player); //カード情報を見せる
while(1){ //ゲームが終わるまでループ
for(j=0;j<2;j++){ //2人分ループ
get_card(player, j); //相手からカードを引く
drop_card(player[j]);//合ったカードを捨てる
if(check_card(player[j])==-1)//終わったら抜ける
goto ex;
show_card(player); //カードを見せる
scanf("%c",&s); //待機
}
}

ex:
printf("\nゲーム終了\nプレイヤー%dの勝ち\n\n",j+1);

return 0;
}

通りすがり

Re:ばばぬき プログラム

#2

投稿記事 by 通りすがり » 15年前

まず、これは自分で作ったプログラムですか?
それとも課題などで配布されたものですか?

ぜらーちん

Re:ばばぬき プログラム

#3

投稿記事 by ぜらーちん » 15年前

会話に関しては

ペアが出来た後に、残り枚数をチェックして、
残り枚数が3枚とかになったら、適当な台詞を入れるとかはどうですか?

人数追加に関してはここまで作成しているのであれば、
プレイヤーの二次元配列を変更して、配るときも割る数を人数分に変更したらよいのではないでしょうか?

ぜらーちん

Re:ばばぬき プログラム

#4

投稿記事 by ぜらーちん » 15年前

書き忘れましたが、
プログラムを詳しく見てないので分かりませんが、配るときや処理も変わるでしょうし(多分

goto文は出来るだけ使わないほうがいいですよ
最も、絶対に使うなではなくて必要に応じては使ってもいいとは思いますが
まずは使わない方向で作成したほうがいいと思います。

というよりもこのプログラムならbreakでいいんじゃないかな・・?

シエル

Re:ばばぬき プログラム

#5

投稿記事 by シエル » 15年前

この程度のコードを作れたのであれば、ある程度のコードは書けるでしょう。
一度自分が考えたコードを提示してみてください。
まさか、課題じゃないですよね?

閉鎖

“C言語何でも質問掲示板” へ戻る