ポーカーでのカードを配る動作について

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

ポーカーでのカードを配る動作について

#1

投稿記事 by サンタクロース » 14年前

こんばんわ、ただ今ポーカーを制作しているのですが、分からないところがでてきたので投稿しました

下に示したコードはプログラムの一部です
・プレイヤーはPlayer、山札はDeckという構造体で表しました
・moveCard()は一枚のカードを移動させる関数です。龍神録さんのサイトを参考にしました。返り値の1は、カードが移動し終わったことを表します
・deal()は一枚のカードを山札からプレイヤーの手元まで移動させる関数です
  
そこで私がしたいことというのが、一枚のカードを配り終わったら、次のカードを配り始めるという動作を表現するには,逆にいうと1枚を配り終わるまでほかのカードを配らせないようにしたいのですが、どうすればいいでしょうか。
ちなみにdeal関数はそのことが分からないため記述できる部分だけを記述しました。


最初はfor文をつかうのかなと考えてみたのですが、それではfor文を抜けるまで描画
関数が呼ばれないので、結果として瞬間移動したように見えてしまいます

また、このトランプの移動に限らず、「〇〇し終わったら次の〇〇を実行したい」といった表現をしたい場合、逆に言えば「〇〇し終わるまで次の〇〇を実行しない」の場合、一般的にどのようなアルゴリズムで記述すればよいのでしょうか。

コード:


//トランプ
typedef struct{

	int x;
	int y;
	int suits;//スーツ
	int number;//数
	int faceflag;//表かどうか 1:表 0:裏
	//int img;
	int flag;//存在するかどうかのフラグ
	int moveFlag;

}Trump_t;

//プレイヤー
typedef struct{

	Trump_t Trump[MAX_HAND];
	Name_t Name;
	Chip_t Chip;

}Player_t;

//山札
typedef struct{

	int targetCard;
	Trump_t trump[MAX_TRUMP];

}Deck_t;

int moveCard(int player ,int hand, int t ,int delection){

	    if(moveCount == 0){
			moveCount = 1;

			range_x = trump_X[player][hand] - DECK_X;
            range_y = trump_Y[player][hand] - DECK_Y;
		
		    //捨てる時には速度と加速度の向きを反転
		    if(delection == 1){
		    	range_x *= -1;
		        range_y *= -1;
		    }

        	v0_x = (float)(2 * range_x) / t;
         	v0_y = (float)(2 * range_y) / t;

         	a_x =  (float)2 * range_x / (t * t);
    	    a_y =  (float)2 * range_y / (t * t);

			

		}
 
		else{

    	    go_x = v0_x * moveCount - 0.5 * a_x * moveCount * moveCount;
			go_y = v0_y * moveCount - 0.5 * a_y * moveCount * moveCount;

	    //移動中であれば
	    if(moveCount <= t){
		    if(delection == 0){
			    Player[player].Trump[hand].x = DECK_X + go_x;
    	        Player[player].Trump[hand].y = DECK_Y + go_y;
			}
			else{
			    Player[player].Trump[hand].x = trump_X[player][hand] + go_x;
    	        Player[player].Trump[hand].y = trump_Y[player][hand] + go_y;
			}
		
    	}
	    else{ 
	    	moveCount = 0;
			return 1;
		}
		moveCount++;
	}
	return 0;
}

int deal(int player, int hand){

	
	Player[player].Trump[hand].suits  = Deck.trump[Deck.targetCard].suits;
	Player[player].Trump[hand].number = Deck.trump[Deck.targetCard].number;
	Player[player].Trump[hand].flag = 1;
	Deck.trump[Deck.targetCard].flag = 0;
    Deck.targetCard++;

	moveCard(player , hand , 100, 0);

	return 0;

}



non
記事: 1097
登録日時: 15年前

Re: ポーカーでのカードを配る動作について

#2

投稿記事 by non » 14年前

状態遷移といいます。
non

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ポーカーでのカードを配る動作について

#3

投稿記事 by softya(ソフト屋) » 14年前

ある状態から別の状態に移ることを状態遷移と言います。

たとえば、
(1)カードを1枚配る。配り終わったら(2)へ。配っている間は(1)を継続。タイミングはフレーム数カウントなど。
(2)次に配るカードを決める。状態(1)へ。配るカードがなけれな状態(3)へ。
(3)待ちへ。
と言った状態遷移がある感じでしょうか。
(1)(2)(3)は状態変数で管理して、タイミングなどはフレーム数をカウントします。

どの処理もループもなにせもずWinMainのメインループに戻るようにします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

サンタクロース

Re: ポーカーでのカードを配る動作について

#4

投稿記事 by サンタクロース » 14年前

すみません、フォーラムルールに従っていなかったため、以下に追加します

1. 自分は今何がしたくて
deal()という関数を使って一枚のカードが移動し終わったら次のカードを移動させるという動作を実現したい

2.どう取り組んで

上記のソースコードに書ける分だけは記述しました

3. どのようなエラーやトラブルで困っていて

>エラーというよりは、アルゴリズムの考え方で詰まっています

4. 自分は何が解らないのか、知りたいのか

>一枚のカードが移動し終わったら次のカードを移動させるという動作を実現したい。
もっと一般化して、〇〇し終えたら次の〇〇を行うという動作のアルゴリズムは
どのように記述されるか

5. 今のCの知識はどの程度なのか
サイトを少し参考にしてテトリスを作りました

ふりかけ

Re: ポーカーでのカードを配る動作について

#5

投稿記事 by ふりかけ » 14年前

moveCard関数がグラフィックでのカード移動
deal関数が内部データにおけるカード移動
ということでいいのかな?ちょっとわかりにくかった

ソースも読みやすかったし、返り値も設定してるしほとんどできているように思うのですが
返り値が0のときはdeal関数は飛ばす、1のときはdeal関数を呼び出す
という風にメインループに入れちゃえばいいのでは
moveCard関数に渡すデータはどこかに保存しておくことになります。

それくらいわかってるよ!だったらごめんなさい

サンタクロース

Re: ポーカーでのカードを配る動作について

#6

投稿記事 by サンタクロース » 14年前

nonさん、softya さん、ふりかけさん、御回答ありがとうございました。
おかげさまで思った通りの動作が実現できました。
時間によって状態を遷移するというのは、様々な場面で使えそうです。
ただ便利な反面気を付けないとgoto文の様になる可能性もあるので、取扱いに気を付けなければいけませんね。

サンタクロース

Re: ポーカーでのカードを配る動作について

#7

投稿記事 by サンタクロース » 14年前

nonさん、softya さん、ふりかけさん、御回答ありがとうございました。
おかげさまで思った通りの動作が実現できました。
時間によって状態を遷移するというのは、様々な場面で使えそうです。
ただ便利な反面気を付けないとgoto文の様になる可能性もあるので、取扱いに気を付けなければいけませんね。

閉鎖

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