ソリティアをプログラムについて

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

ソリティアをプログラムについて

#1

投稿記事 by yamate » 10年前

ソリティアを色々なサイトを参考にしながら作っているのですが、
どのように場を管理すれば良いかわからなく詰まっております。

カードをシャッフルした後に配置したいのですが、
どのような設計にすればやりやすそうでしょうか。

わからないのは場用の配列を用意しても、
どれが先頭のカード化をどのように管理すればよいのか
全く思い浮かばなくて・・・。
また山札も減っていくのに配列で果たして管理できるのか、
またvectorなどで管理する場合も設計の仕方がわからなくて。。。

こんなざっくりとした質問になってしまってすみません。
アドバイスを頂くことは難しいでしょうか。

アバター
Tatu
記事: 445
登録日時: 14年前
住所: 北海道

Re: ソリティアをプログラムについて

#2

投稿記事 by Tatu » 10年前

とりあえず、ソリティアを作ってみましたが
http://dixq.net/forum/blog.php?u=525&b=5273

私は番号(0~51でマークと数値の両方を表す、-1ならば存在しないことを表す)と裏表を示すカード構造体を作り、
山札、めくった山札、場札、組札それぞれをカード構造体の配列で管理するようにしました。

ゲームで裏表の情報が必要なのは場札のみですが
他のカードまでカード構造体で管理しているのは
カード構造体用の描画関数だけで描画できるようにするためです。

先頭のカードについては
場札は各列で-1ではない最後のカードが先頭のカードであるとみなし、
それ以外については先頭のカードを記憶する変数を使いました。
(使わなくても場札と同様の考えでできるでしょう)

他に、選択しているカードがどれかわかるような変数、勝利したかのフラグを使用しています。


より良い設計があるかどうかについてはわかりません。

yamate

Re: ソリティアをプログラムについて

#3

投稿記事 by yamate » 10年前

Tatu様

こんなざっくりと質問なのにexeを作って頂けありがとうございます。
Cocos2d-x、C++でコーディングをしてみてるのですが、上手く行きません。
vectorなどをリサイズしたりしてるのですが、頭の中でロジックが整理しきれてなくて・・・。

CARDという構造体で管理しており、それをシャッフル→各種場所に配置という形で行っております。

【下記に追加しております】
std::vector<CARD> FieldSet;
std::vector< vector<CARD> > FieldBa;
std::vector<CARD> FieldYama;

コード:


#define CARD_WIDTH 200
#define CARD_HEIGHT 300
#define CARD_MAX (13*4)
#define CARD_SCALE 0.5f
#define CARD_YAMAHUDA 24
#define CARD_BA 7

/******************************************************************************
 * 概要   | メニュークラス
 * 詳細   | 当たり判定用
 ******************************************************************************/

class MENU{
public:
    float Px, Py;
    int Width, Height;
    float SizeX, SizeY;
    cocos2d::Sprite* tex;
    bool TouchCheck( int x, int y );
    bool TouchCheck( void );
    void Init( int px, int py, int width, int height, float sx, float sy );
    void InitSprite( cocos2d::Layer *layer, int x, int y, const std::string& filename, int sx, int sy, int cx, int cy, float scaleX, float scaleY, bool flag );
    void SetPostion( int x, int y, float scaleX, float scaleY );
};

bool MENU::TouchCheck( int x, int y ){
    
    int sx = ( this->Width * this->SizeX ) / 2;
    int sy = ( this->Height * this->SizeY ) / 2;
    
    if(x < this->Px+sx && x > this->Px-sx &&
       y < this->Py+sy && y > this->Py-sy ){
        return true;
    }else{
        return false;
    }
    
}

bool MENU::TouchCheck( void ){
    return MENU::TouchCheck( TouchData::X, TouchData::Y );
}

void MENU::Init( int px, int py, int width, int height, float sx, float sy ){
    this->Px = px;
    this->Py = py;
    this->Width = width;
    this->Height = height;
    this->SizeX = sx;
    this->SizeY = sy;
}

void MENU::InitSprite( cocos2d::Layer *layer, int x, int y, const std::string& filename, int sx, int sy, int cx, int cy, float scaleX, float scaleY, bool flag ){
    this->Init( x, y, cx, cy, scaleX, scaleY );
    this->tex = DrawUtil::LoadImage( layer, x, y, filename, sx, sy, cx, cy, flag );
    this->tex->setScale( scaleX, scaleY );
}

void MENU::SetPostion( int x, int y, float scaleX, float scaleY ){
    this->Init( x, y, this->Width, this->Height, scaleX, scaleY );
    this->tex->setPosition( x, y );
}

class TRUMP{
public:
    
    enum CARD_TYPE{
        CARD_SPADE,
        CARD_HEART,
        CARD_CLUB,
        CARD_DIAMOND,
    };
    
    // カード情報
    typedef struct{
        int Number;
        CARD_TYPE Type;
        bool OpenFlag;
        Point PosInit;
        MENU Btn;
    }CARD;
    
    // 変数
    Layer *layer;
    CARD Card[CARD_MAX];
    MENU btnYama;
    
    std::vector<CARD> FieldSet;
    std::vector< vector<CARD> > FieldBa;
    std::vector<CARD> FieldYama;
    
    CARD selected_card;
    
    bool MoveFlag;
    int MoveI, MoveNum, MoveZorder;
    int CardCount[CARD_BA];
    int YamaCount;
    
    //int YamaCount;
    //CARD Yama[CARD_YAMAHUDA];
    //CARD Ba[7][];
    
    // 関数
    void Init( Layer* layer );
    void Loop();
    //void SetTexture( int x, int y, TEX_CELL mode );
    void Shuffle();
    
};

void TRUMP::Init( Layer* layer ){
    
    // レイヤー情報を保存
    this->layer = layer;
    this->MoveFlag = false;
    this->MoveI = 0;
    this->MoveNum = 0;
    this->MoveZorder = 0;
    this->YamaCount = 0;
    
    // カードの初期化
    for(int i=0; i<CARD_MAX; i++){
        this->Card[i].Number = i % ( CARD_MAX/4 );
        this->Card[i].Type = (CARD_TYPE)(i / ( CARD_MAX/4 ));
        this->Card[i].OpenFlag = false;
        int px = WIN_W/2;
        int py = pH(WIN_H/2);
        this->Card[i].PosInit = Point( px, py );
        this->Card[i].Btn.InitSprite( this->layer, px, py, "object_trump.png", this->Card[i].Number*CARD_WIDTH, this->Card[i].Type*CARD_HEIGHT, CARD_WIDTH, CARD_HEIGHT, CARD_SCALE, CARD_SCALE, true );
    }
    
    this->Shuffle();
    
    /* 配列のサイズをセット */
    
    // 山札にカードをセット
    for(int i=0; i<CARD_YAMAHUDA; i++){
        int num = i;
        this->Card[num].Btn.Px = 100;
        this->Card[num].Btn.Py = pH(200);
    }
    
    // フィールドの初期化
    this->FieldYama.resize(CARD_YAMAHUDA);
    this->FieldBa.resize(CARD_BA);
    for( int i=0; i<this->FieldBa.size(); i++ ){
        this->FieldBa[i].resize(i+1);
    }
    
    // セット用の初期化
    this->FieldSet.resize(CARD_DIAMOND+1);
    //for(int i=0; i<this->FieldSet.size(); i++){
    //    this->FieldSet[i].resize(13);
    //}
    
    /* カードをセット */
    
    // 山札の初期化
    int cnt = 0;
    for(int i=0; i<this->FieldYama.size(); i++){
        this->FieldYama[i] = this->Card[cnt];
        cnt++;
    }
    
    // 場の初期化
    for( int i=0; i<this->FieldBa.size(); i++ ){
        for( int j=0; j<this->FieldBa[i].size(); j++ ){
            this->FieldBa[i][j] = this->Card[cnt];
            this->CardCount[i] = j;
            cnt++;
        }
    }
    
    /* ポジションをセット */
    for(int i=0; i<this->FieldYama.size(); i++){
        int px = 80;
        int py = pH(100);
        this->FieldYama[i].Btn.tex->setZOrder( i + 100 );
        this->FieldYama[i].PosInit = Point( px, py );
        this->FieldYama[i].Btn.SetPostion( px, py, this->FieldYama[i].Btn.SizeX, this->FieldYama[i].Btn.SizeY );
        
    }
    
    // 山札用のボタンを初期化
    this->btnYama.Init( this->FieldYama[0].Btn.Px, this->FieldYama[0].Btn.Py, this->FieldYama[0].Btn.Width, this->FieldYama[0].Btn.Height, this->FieldYama[0].Btn.SizeX, this->FieldYama[0].Btn.SizeY );
    
    // 場を初期化
    for( int i=0; i<this->FieldBa.size(); i++ ){
        for( int j=0; j<this->FieldBa[i].size(); j++ ){
            int px = ( i * 80 ) + 80;
            int py = pH( j*50 - 500 );
            this->FieldBa[i][j].Btn.tex->setZOrder( i*10+j );
            this->FieldBa[i][j].PosInit = Point( px, py );
            this->FieldBa[i][j].Btn.SetPostion( px, py, this->FieldBa[i][j].Btn.SizeX, this->FieldBa[i][j].Btn.SizeY );
        }
    }
    
    // おく場所
    for(int i=0; i<this->FieldSet.size(); i++){
        int px = ( i * 110 ) + 270;
        int py = pH( 200 );
        this->FieldSet[i].Number = -1;
        this->FieldSet[i].Btn.InitSprite( this->layer, px, py, "object_trump.png", 0*CARD_WIDTH, 5*CARD_HEIGHT, CARD_WIDTH, CARD_HEIGHT, CARD_SCALE, CARD_SCALE, true );
        this->FieldSet[i].PosInit = Point( px, py );
        this->FieldSet[i].Btn.tex->setZOrder( 0 );
        //for(int j=0; j<this->FieldSet[i].size(); j++){
        //}
    }
    
}

void TRUMP::Shuffle(){
    
    int i, rnd;
    CARD temp;
    
    for( i=0; i<CARD_MAX; i++ ){
        
        rnd = rand() % CARD_MAX;
        temp = this->Card[i];
        this->Card[i] = this->Card[rnd];
        this->Card[rnd] = temp;
    }
}

void TRUMP::Loop(){
    
    // 山札をタッチしたか
    if( TouchData::Trg ){
        if( this->btnYama.TouchCheck() ){
            int i = this->YamaCount;
            this->FieldYama[i].Btn.Px = this->FieldYama[i].PosInit.x + 110;
            this->FieldYama[i].Btn.Py = this->FieldYama[i].PosInit.y;
            this->FieldYama[i].Btn.SetPostion( this->FieldYama[i].Btn.Px, this->FieldYama[i].Btn.Py, this->FieldYama[i].Btn.SizeX, this->FieldYama[i].Btn.SizeY );
            this->YamaCount++;
            
            // 最後まで行ったら初期化
            if( this->YamaCount >= CARD_YAMAHUDA ){
                this->YamaCount = 0;
                for(int ii=0; ii<CARD_YAMAHUDA; ii++){
                    this->FieldYama[ii].Btn.Px = this->FieldYama[ii].PosInit.x;
                    this->FieldYama[ii].Btn.Py = this->FieldYama[ii].PosInit.y;
                    this->FieldYama[ii].Btn.SetPostion( this->FieldYama[ii].Btn.Px, this->FieldYama[ii].Btn.Py, this->FieldYama[ii].Btn.SizeX, this->FieldYama[ii].Btn.SizeY );
                }
            }
        }
    }
    
    if( TouchData::Flag ){
        //this->YamaCount++;
        //if( this->YamaCount >= CARD_YAMAHUDA ) this->YamaCount = 0;
    }
    
    // タッチしてなければ
    if( !TouchData::Trg && TouchData::Flag && TouchData::Pul ){
        this->MoveFlag = false;
        this->MoveI = 0;
        this->MoveNum = 0;
        this->MoveZorder = 0;
    }
    
    // 移動するオブジェクトを決める
    if( !this->MoveFlag ){
        if( TouchData::Trg || TouchData::Flag ){
            
            // 場所
            for( int i=0; i<this->FieldBa.size(); i++ ){
                int num = this->CardCount[i];
                if( this->FieldBa[i][num].Btn.TouchCheck() ){
                    this->selected_card = this->FieldBa[i][num];
                    this->MoveFlag = true;
                    break;
                }
            }
 
            // 山札
            int num = this->YamaCount;
            if( this->FieldYama[num].Btn.TouchCheck() ){
                this->selected_card = this->FieldYama[num];
                this->MoveFlag = true;
            }
            
            log( "type %d %d", this->selected_card.Number, this->selected_card.Type );
            
        }
    }
    
    
    if( this->MoveFlag ){
        this->selected_card.Btn.Px = TouchData::X;
        this->selected_card.Btn.Py = TouchData::Y;
        this->selected_card.Btn.SetPostion( this->selected_card.Btn.Px, this->selected_card.Btn.Py, this->selected_card.Btn.SizeX, this->selected_card.Btn.SizeY );
    }
    
    if( TouchData::Pul ){
        
        this->MoveFlag = false;
        
        for( int i=0; i<this->FieldBa.size(); i++ ){
            int num = this->CardCount[i];
            if( MyFunction::HitSprite( this->FieldBa[i][num].Btn.tex, this->selected_card.Btn.tex ) ){
                //log( "push %d", i );
                //log( "size %d", this->FieldBa[i].size() );
                this->FieldBa[i].push_back( this->selected_card );
                //log( "size %d", this->FieldBa[i].size() );
                
                //MoveTo *move = MoveTo::create( 1.0f, this->FieldBa[i][j].PosInit );
                //this->FieldBa[i+1].Btn.tex.runAction(move);
                this->selected_card.Number = -1;
                
                for( int j=0; j<this->FieldBa.size(); j++ ){
                    //this->FiledBa[j].Number = 0;
                    //this->FiledBa[j].Number = 0;
                }

                //this->selected_card
                
                break;
            }
        }
        
        int type = this->selected_card.Type;
        if( MyFunction::HitSprite( this->selected_card.Btn.tex, this->FieldSet[type].Btn.tex ) ){
            
            if( this->FieldSet[type].Number+1 == this->selected_card.Number ){
                this->selected_card.PosInit = this->FieldSet[type].Btn.tex->getPosition();
            }
        
        }
            /*
            // ナンバー+1なら配置
            if( this->FieldSet[type].Number+1 == this->FieldBa[i][num].Number ){
                this->FieldSet[type].Number = this->FieldBa[i][num].Number;
                this->FieldBa[i][num].PosInit = this->FieldSet[type].Btn.tex->getPosition();
                this->CardCount[i]--;
                this->FieldSet[type] = this->FieldBa[i][num];
                //this->FieldBa[i].pop_back();
                //this->FieldBa[i].resize(i+1);
                
            }
             */
    }
 
}
   

アバター
Tatu
記事: 445
登録日時: 14年前
住所: 北海道

Re: ソリティアをプログラムについて

#4

投稿記事 by Tatu » 10年前

>ソリティアを色々なサイトを参考にしながら
どのサイトを参考にしたのかを書くと
これからソリティアを作ろうとしている人の役に立つかもしれません。

>カードをシャッフルした後に配置したい
それはできているのでしょうか?

>場用の配列を用意してもどれが先頭のカード化をどのように管理すればよいのか
vectorのサイズを調べれば先頭のカードはわかるのではないでしょうか。

>山札も減っていくのに配列で果たして管理できるのか
配列で管理可能でしょう。

>頭の中でロジックが整理しきれてなくて…、
紙か何かに書いて整理しましょう。

コードが投稿されていますがどの部分が問題だと考えているのでしょうか?

yamate

Re: ソリティアをプログラムについて

#5

投稿記事 by yamate » 10年前

回答を頂いていたのに返信が遅くなりすみませんでした。

------------------------------------------------------------

>ソリティアを色々なサイトを参考にしながら
どのサイトを参考にしたのかを書くと
これからソリティアを作ろうとしている人の役に立つかもしれません。

→色々なサイトを見ておりましてこれを持ってきてるとかではないです!
言語が違うのですが下記などで御座います。
http://www40.atwiki.jp/spellbound/pages/1498.html

>カードをシャッフルした後に配置したい
それはできているのでしょうか?
→こちらまでが問題なくできております。

>場用の配列を用意してもどれが先頭のカード化をどのように管理すればよいのか
vectorのサイズを調べれば先頭のカードはわかるのではないでしょうか。
→様々なベクターを使ってしまっているので、何が何かわからなくなってしまいまして・・・。

紙などにも勿論、記載してみてるのですが、それをコードにするのが出来ておりません。
何とかしてもう少しプログラムをかけるようになりたいです!

------------------------------------------------------------

わからない点と致しましては、大きな部分で2点御座います。

■1点目
7箇所の場の2枚以上を選択した時の処理

■2点目
Cocos2d-xで開発をしており、各種vectorからspriteの位置を割り出しているのですが、
どのspriteをどうやって管理すればよいかこんがらがってしまいます(汗)

そもそもとして私の中で、クロンダイクのロジックの流れを、細かく追えてないのが原因だと思います・・・。
ざっくりとした内容にも関わらずお付き合い頂いてくださりありがとう御座います。
現状のソースを添付させて頂きます。

(MENUクラスは独自のもので、スプライトの格納と、
TouchCheck用の関数で触っているかを管理するものとなります。)

コード:

#define CARD_WIDTH 200
#define CARD_HEIGHT 300
#define CARD_MAX (13*4)
#define CARD_SCALE 0.5f
#define CARD_YAMAHUDA 24
#define CARD_BA 7

class TRUMP{
public:
    
    enum CARD_TYPE{
        CARD_SPADE,
        CARD_HEART,
        CARD_CLUB,
        CARD_DIAMOND,
    };
    
    // カード情報
    typedef struct{
        CARD_TYPE Type;
        int Number;
        bool OpenFlag;
        Point PosInit;
    }CARD;

    // 変数
    Layer *layer;
    CARD Card[CARD_MAX];
    MENU CardBtn[CARD_MAX];
    MENU btnYama;
    
    std::vector<CARD> FieldSet;
    std::vector< vector<CARD> > FieldBa;
    std::vector<CARD> FieldYama;
    CARD SelectedCard;
    
    // 関数
    void Init( Layer* layer );
    void Loop();
    void Draw();
    void Shuffle();
    int ReturnIndexCard( CARD_TYPE type, int number );
    Point ReturnPointFiledBa( int i, int j );
};

void TRUMP::Init( Layer* layer ){
    
    // レイヤー情報を保存
    this->layer = layer;
    
    // カードの初期化
    for(int i=0; i<CARD_MAX; i++){
        this->Card[i].Number = i % ( CARD_MAX/4 );
        this->Card[i].Type = (CARD_TYPE)(i / ( CARD_MAX/4 ));
        this->Card[i].OpenFlag = false;
        int px = WIN_W/2;
        int py = pH(WIN_H/2);
        this->Card[i].PosInit = Point( px, py );
        this->CardBtn[i].InitSprite( this->layer, px, py, "object_trump.png", this->Card[i].Number*CARD_WIDTH, this->Card[i].Type*CARD_HEIGHT, CARD_WIDTH, CARD_HEIGHT, CARD_SCALE, CARD_SCALE, true );
    }
    
    this->Shuffle();

    // フィールドの初期化
    this->FieldYama.resize(CARD_YAMAHUDA);
    this->FieldBa.resize(CARD_BA);
    for( int i=0; i<this->FieldBa.size(); i++ ){
        this->FieldBa[i].resize(i+1);
    }
    
    // セット用の初期化
    this->FieldSet.resize(CARD_DIAMOND+1);
    
    /* カードをセット */
    
    // 山札の初期化
    int cnt = 0;
    for(int i=0; i<this->FieldYama.size(); i++){
        this->FieldYama[i] = this->Card[cnt];
        cnt++;
    }
    
    // 場の初期化
    for( int i=0; i<this->FieldBa.size(); i++ ){
        for( int j=0; j<this->FieldBa[i].size(); j++ ){
            this->FieldBa[i][j] = this->Card[cnt];
            cnt++;
        }
    }
    
    /* ポジションをセット */
    for(int i=0; i<this->FieldYama.size(); i++){
        int px = 80;
        int py = pH(100);
        this->FieldYama[i].PosInit = Point( px, py );
    }
    
    // 場を初期化
    for( int i=0; i<this->FieldBa.size(); i++ ){
        for( int j=0; j<this->FieldBa[i].size(); j++ ){
            Point pos = this->ReturnPointFiledBa( i, j );
            //this->FieldBa[i][j].Btn.tex->setZOrder( i*10+j );
            this->FieldBa[i][j].PosInit = Point( pos );
            //this->FieldBa[i][j].Btn.SetPostion( px, py, this->FieldBa[i][j].Btn.SizeX, this->FieldBa[i][j].Btn.SizeY );
        }
    }
    
    // おく場所
    for(int i=0; i<this->FieldSet.size(); i++){
        int px = ( i * 110 ) + 270;
        int py = pH( 200 );
        this->FieldSet[i].Number = -1;
        this->FieldSet[i].PosInit = Point( px, py );
    }
    
    // 選択中のカード
    this->SelectedCard.Number = -1;

}

void TRUMP::Shuffle(){
    
    int i, rnd;
    CARD temp;
    
    for( i=0; i<CARD_MAX; i++ ){
        
        rnd = rand() % CARD_MAX;
        temp = this->Card[i];
        this->Card[i] = this->Card[rnd];
        this->Card[rnd] = temp;
    }
}

void TRUMP::Loop(){
    
    // タッチしてなければ
    if( TouchData::Trg ){
        
        if( this->SelectedCard.Number == -1 ){
        
            // 場所
            for( int i=0; i<this->FieldBa.size(); i++ ){
                int num = this->FieldBa[i].size()-1;
                int index = this->ReturnIndexCard( this->FieldBa[i][num].Type, this->FieldBa[i][num].Number );
                if( this->CardBtn[index].TouchCheck() ){
                    this->SelectedCard = this->FieldBa[i][num];
                    break;
                }
            }
            

        // 選択中なら解除
        }else{
            this->SelectedCard.Number = -1;
        }
    }
    
    if( this->SelectedCard.Number != -1 ){
        this->SelectedCard.PosInit.x = TouchData::X;
        this->SelectedCard.PosInit.y = TouchData::Y;
        //this->SelectedCard.PosInit..SetPostion( this->PosInit..Btn.Px, this->selected_card.Btn.Py, this->selected_card.Btn.SizeX, this->selected_card.Btn.SizeY );
    }
    
    if( TouchData::Pul ){
        
        //this->MoveFlag = false;
        //MoveTo *move = MoveTo::create( 1.0f, this->FieldBa[i][j].PosInit );
        //this->FieldBa[i+1].Btn.tex.runAction(move);

    }

}

void TRUMP::Draw(){
    
    // 場の制御
    for( int i=0; i<this->FieldBa.size(); i++ ){
        for( int j=0; j<this->FieldBa[i].size(); j++ ){
            
            int index = this->ReturnIndexCard( this->FieldBa[i][j].Type, this->FieldBa[i][j].Number );

            int number = this->FieldBa[i][j].Number;
            int type = this->FieldBa[i][j].Type;
            if( false ){
                number = 0;
                type = 4;
            }
            
            Point pos = this->ReturnPointFiledBa( i, j );
            this->CardBtn[index].tex->setPosition( pos );
            
            //DrawUtil::SetTexture( this->CardBtn[index].tex, number*CARD_WIDTH, type*CARD_HEIGHT );
            
        }
    }

    // 山札の制御
    for(int i=0; i<this->FieldYama.size(); i++){
        int index = this->ReturnIndexCard( this->FieldYama[i].Type, this->FieldYama[i].Number );
        int number = this->FieldYama[i].Number;
        int type = this->FieldYama[i].Type;
        if( false ){
            number = 0;
            type = 4;
        }
        this->CardBtn[index].tex->setPosition( this->FieldYama[i].PosInit );
    }
    
    if( this->SelectedCard.Number != -1 ){
        int index = this->ReturnIndexCard( this->SelectedCard.Type, this->SelectedCard.Number );
        int number = this->SelectedCard.Number;
        int type = this->SelectedCard.Type;
        if( false ){
            number = 0;
            type = 4;
        }
        this->CardBtn[index].tex->setPosition( this->SelectedCard.PosInit );
    }
    
    /*
    for(int i=0; i<CARD_MAX; i++){
        
        int number = 0;
        int type = 0;
        if( false ){
            number = 0;
            type = 4;
        }

        DrawUtil::SetTexture( this->CardBtn[i].tex, number*CARD_WIDTH, type*CARD_HEIGHT );
        //this->CardBtn[i].InitSprite( this->layer, px, py, "object_trump.png", this->Card[i].Number*CARD_WIDTH, this->Card[i].Type*CARD_HEIGHT, CARD_WIDTH, CARD_HEIGHT, CARD_SCALE, CARD_SCALE, true );
    }
     */
    

}

int TRUMP::ReturnIndexCard( CARD_TYPE type, int number ){
    return (int)type*13 + number;
}

Point TRUMP::ReturnPointFiledBa( int i, int j ){
    Point pos;
    pos.x = ( i * 80 ) + 80;
    pos.y = pH( j*50 - 500 );
    return pos;
}


アバター
Tatu
記事: 445
登録日時: 14年前
住所: 北海道

Re: ソリティアをプログラムについて

#6

投稿記事 by Tatu » 10年前

1点目については
選択したカードを示すSelectedCardを配列にし、複数選択できるようにしてみてはどうでしょうか。

2点目については
カードを選択した時に場に元々あったカードと選択したカードで
同じカードが2枚表示されてしまうということですか?


カード選択時にどこのカードを選択したのかを記憶する。
選択した場所(場札など)の配列から選択したカードの配列にカードの情報を移す。
選択した場所の配列からは選択されたカードの情報を消す。
どこに移動するかを決定したら移動先の配列に選択したカードの情報を移す。
選択したカードの情報を消す。

というようにしてはどうでしょうか。

閉鎖

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