迷路作成用のスタック


迷路作成の際の最後に、しらみつぶしで残りの領域を探索します。 そのためにスタックを使用すると便利です。 参考までに、私の作ったスタックプログラムを置いておきます。 特徴としては、同時に最大4つの整数をプッシュ、ポップする事と、先頭のいくつかのデータをランダムに取り出せる事です。 利用は自由です。

使い方

C++のMyStackというクラスになっています。以下のメソッドというか関数を使えます。

ヘッダファイル

//
// 迷路プログラム用
// スタック処理クラス、ヘッダファイル
// 2005/9/24 ISHIDA SO
//

#ifndef MYSTACKH
#define MYSTACKH

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

#define MYSTACKDATASIZE 1000
extern int DummyVariable;
class MyStack {
private:
    class MyStackMemory {    // 実際にデータを保存する内部クラス。
        public:
        int mem[MYSTACKDATASIZE][4];
        MyStackMemory *next;
    public:
        MyStackMemory() { next = NULL; };
        ~MyStackMemory() { if(next) delete next; };
    };
    MyStackMemory *data;
    int NumberOfRecords;
public:
    __fastcall MyStack() { data = NULL; NumberOfRecords = 0; };
    __fastcall ~MyStack() { if(data) delete data; };
    void Clear(void) { NumberOfRecords = 0; };
    void Push(int d1, int d2=0, int d3=0, int d4=0);
    bool Pop(int &d1, int &d2=DummyVariable, int &d3=DummyVariable, int &d4=DummyVariable);
    bool PopRandom(int num, int &d1, int &d2=DummyVariable, int &d3=DummyVariable, int &d4=DummyVariable);
    int Numbers(void) { return NumberOfRecords;};
};
#endif

本体ファイル

//
// 迷路プログラム用
// スタック処理クラス、プログラム
// 2005/9/24 ISHIDA SO
//

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

int DummyVariable;

void MyStack::Push(int d1, int d2, int d3, int d4)
{
    MyStackMemory **p = &data;
    int l = NumberOfRecords;
    while(1) {
        if( *p == NULL) {
            *p = new MyStackMemory();
            if(*p == NULL) OutOfMemoryError();
        }
        if(l < MYSTACKDATASIZE) break;
        p = &((*p)->next);
        l -= MYSTACKDATASIZE;
    }
    (*p)->mem[l][0] = d1;
    (*p)->mem[l][1] = d2;
    (*p)->mem[l][2] = d3;
    (*p)->mem[l][3] = d4;
    NumberOfRecords++;
}
bool MyStack::Pop(int &d1, int &d2, int &d3, int &d4)
{
    MyStackMemory **p = &data;
    int l = NumberOfRecords-1;
    if(l < 0) return false;
    while(1) {
        if(l < MYSTACKDATASIZE) break;
        p = &((*p)->next);
        l -= MYSTACKDATASIZE;
    }
    d1 = (*p)->mem[l][0];
    d2 = (*p)->mem[l][1];
    d3 = (*p)->mem[l][2];
    d4 = (*p)->mem[l][3];
    NumberOfRecords--;
    return true;
}
bool MyStack::PopRandom(int num, int &d1, int &d2, int &d3, int &d4)
{
    MyStackMemory **p = &data;
    int l;
    if(NumberOfRecords <= 0) return false;
    if(num > NumberOfRecords) num = NumberOfRecords;
    l = random(num);
    if(l < 0) return false;
    while(1) {
        if(l < MYSTACKDATASIZE) break;
        p = &((*p)->next);
        l -= MYSTACKDATASIZE;
    }
    d1 = (*p)->mem[l][0];
    d2 = (*p)->mem[l][1];
    d3 = (*p)->mem[l][2];
    d4 = (*p)->mem[l][3];
    return true;
}

迷路トップ
記述内容について一切保障しません。リンクは自由に行ってかまいません。
Since 2005/9/24, Presented by Ishida So