パスワードを忘れた? アカウント作成
668326 journal

kurokumaの日記: c++ 8

日記 by kurokuma
晒してみよう

腐ったプログラマであるおいらがが練習がてらに作ってみた
トランプPG。

駄目なところはどんどん突っ込んで良し(w

#include<time.h>

class cla_card{
private:
        int ln_use[54];
        int ln_use_num;

public:
        void finit_card(){
                int ln_cnt;

                srand(time(NULL));

                ln_use_num = 0;

                for (ln_cnt = 0; ln_cnt < 54; ++ln_cnt){
                        ln_use[ln_cnt] = 0;
                }
        }

        int fget_card(){
                int ln_get_card;

                if (ln_use_num >= 54){
                        return -1;
                }

                while (1){
                        ln_get_card = rand() % 54;

                        if (ln_use[ln_get_card] != 0){
                                continue;
                        }

                        ln_use[ln_get_card] = 1;

                        break;
                }

                ++ln_use_num;

                return ln_get_card;
        }
};

追記:ちなみに環境は w2000 + cygwin
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by dartei_harry (6792) on 2003年07月31日 17時28分 (#369720) 日記
    54という固定の数値はdefine切って
    CARD_NUM_MAXとかの名前つきにしてあげる
    方向でいかがでしょうか?

    あとは、トランプ=遊ぶモノということで、
    難易度調整のための設定が欲しい
    とかはナシでいいんですよね?
    • 最初 define が上手くいかなくて直切りしてたんですが、今
      再度 define でやってみたら上手くいきました。
      これで数値の変更が楽になりますね、136とかにしたら麻雀
      用になる(w

      まあ、トランプというよりはランダムでユニークな数値をいか
      にしてだすかをやりたかったので、難易度調整とかは特に考え
      ていません。
      親コメント
  • 激しく解析能力足りないので間違えてたらごめんなさい。

    後半になればなるほど未使用カードにヒットする確率が低くなるので、初期化の部分でカードをシャッフルして、カードを取る時は頭から順番にゲットすれば時間がかからないかもです。

    C++はやった事ないので数年ぶりにCで記述(^^;
    凄まじく汎用性無いけどID。

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

    #define CARD_NUM (54)

    unsigned char deck[CARD_NUM] ;

    int main() {

      int ii ;
      unsigned char card1, card2, temp ;

      /* 初期化(適当) */
      srand( 50 ) ;

      /* カード初期化 */
      for( ii=0; ii<CARD_NUM; ii++ ) {
        deck[ii] = ii ;
      }

      /* シャッフル */
      for( ii=0; ii<100; ii++ ) {
        card1 = ( rand() % CARD_NUM ) ;
        card2 = ( rand() % CARD_NUM ) ;
        temp = deck[card1] ;
        deck[card1] = deck[card2] ;
        deck[card2] = temp ;
      }

      /* 取り出し */
      for( ii=0; ii<CARD_NUM; ii++ ) {
        printf( "%d\n", deck[ii] ) ;
      }

    }
  • カードの数が少なくなると、運が悪いと何回もループしそうなのが
    ちょっと嫌かも。
    あとコンストラクタがあっても良いかも。
    ln_use_numが不定値なので、こいつが運悪く-1以下で初期化されて、
    finit_card()を呼び出さずにfget_card()が呼ばれると、
    ln_use[]のありえない要素を参照しようとしてお亡くなり
    になる可能性があります。
    自分しか使わないんなら別に良いことですが。

    ってなんかエラソーなこと書くだけじゃ感じ悪いんで、
    清水の舞台から飛び降りるつもりで私もソースを晒してみます。
    存分に突っ込んで。とえいっ
    (一応VC6で動きました)

    #include <vector>
    #include <time.h>

    using namespace std;

    class tramp
    {
        vector<int> _cards;
    public:
        tramp()
        {
            init();
        }

        void init()
        {
            vector<int> src_cards;
            int pop_index;
            _cards.clear();

            for( int i=1; i < 54; i++ ){
                src_cards.push_back( i );
            }

            srand( time(NULL) );

            while( src_cards.size() > 0 ){
                pop_index = ( src_cards.size() == 1 )? 0: rand() % src_cards.size();
                _cards.push_back( src_cards[pop_index] );
                src_cards.erase( src_cards.begin() + pop_index );
            }
        }

        int get_card()
        {
            if( _cards.size() <= 0 ){ return -1; }

            int card = *_cards.begin();
            _cards.erase( _cards.begin() );
            return card;
        }
    };
    • 確かに ln_use_num で問題が起きる可能性がありますね。
      private のところで初期化するというのが可能であれば
      とりあえず回避できるのかな、後で試してみよう。

      実のところ、ソースの方は全くついていけません。vector
      ちゅうのが分からないと、理解できなさそうだなというの
      はわかりました、調べねば。

      あと、私のソースが c ライクな c++ だということはよく
      わかりました(w
      親コメント
typodupeerror

ナニゲにアレゲなのは、ナニゲなアレゲ -- アレゲ研究家

読み込み中...