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
腐ったプログラマであるおいらがが練習がてらに作ってみた
トランプ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
基本ですが (スコア:1)
CARD_NUM_MAXとかの名前つきにしてあげる
方向でいかがでしょうか?
あとは、トランプ=遊ぶモノということで、
難易度調整のための設定が欲しい
とかはナシでいいんですよね?
上手くいきました (スコア:1)
再度 define でやってみたら上手くいきました。
これで数値の変更が楽になりますね、136とかにしたら麻雀
用になる(w
まあ、トランプというよりはランダムでユニークな数値をいか
にしてだすかをやりたかったので、難易度調整とかは特に考え
ていません。
ランダムにカードをゲトするクラスですね? (スコア:1)
後半になればなるほど未使用カードにヒットする確率が低くなるので、初期化の部分でカードをシャッフルして、カードを取る時は頭から順番にゲットすれば時間がかからないかもです。
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] ) ;
}
}
すらど宴会SNS開放中 [e-meet.jp]
確かにその通りですね (スコア:1)
方が安全でもありますね。
何年も開発やってないんで頭ボケボケだす(w
Re:ランダムにカードをゲトするクラスですね? (スコア:1)
for(ii=0; ii<CARD_NUM; ii++){
card1 = (rand()% CARD_NUM);
temp = deck[ii];
deck[ii] = deck[card1];
deck[card1] = temp;
}
で十分じゃなかったでしたっけ?
というより、card1,card2とも乱数で取ってしまうと、100回ぐらいじゃ交換されないカードが出る可能性が高いという話があった記憶が。
written by こうふう
Re:ランダムにカードをゲトするクラスですね? (スコア:1)
ちょいと目から鱗です(笑)
毎回シードを変えたら1度も入れ替わらないカードの
位置も変わるだろうからまぁいいかと割といい加減
に考えておりました。 今度はこれ使わせてもらいます(^^
すらど宴会SNS開放中 [e-meet.jp]
while(1)文がちょっと嫌かも (スコア:1)
ちょっと嫌かも。
あとコンストラクタがあっても良いかも。
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;
}
};
これが本当の C++ ですね (スコア:1)
private のところで初期化するというのが可能であれば
とりあえず回避できるのかな、後で試してみよう。
実のところ、ソースの方は全くついていけません。vector
ちゅうのが分からないと、理解できなさそうだなというの
はわかりました、調べねば。
あと、私のソースが c ライクな c++ だということはよく
わかりました(w