見出し画像

TypeScriptで生き抜く!無人島サバイバル計画をコードで立てる方法 🏝️💻


🌟 もしあなたが無人島に漂着したら、何を持ち込む?

今週、TypeScriptの勉強会行くんですけどなにも知らないんで、勉強してみます・・・・。

山田さんと太郎というキャラクターを使用してストーリー展開していきます。

深い森の中、GPSが圏外。方向感覚を失い、一瞬パニックに。その時、ふと思いました。「もし、これが無人島だったら?」そして、「プログラマーである私たちの強みは何だろう?」

そう、TypeScriptです!今回は、TypeScriptの型システムと関数を駆使して、無人島サバイバルをシミュレートしてみましょう。プログラミング初心者の太郎くんと一緒に、コードで命をつなぐ方法を探っていきます!

🧭 TypeScriptで立てる、サバイバル計画

1. リソース管理:生存の鍵

太郎くん:「山田さん、無人島で最初にすべきことって何ですか?」

山田:「そうだね、まずは持っているリソースを把握することだ。TypeScriptを使って、リソース管理システムを作ってみよう。」

// リソースの種類を定義
type ResourceType = 'water' | 'food' | 'wood' | 'tools';

// リソースインターフェースを定義
interface Resource {
  type: ResourceType;
  quantity: number;
}

// リソース管理クラスを定義
class ResourceManager {
  private resources: Map<ResourceType, number> = new Map();

  // リソースを追加するメソッド
  addResource(type: ResourceType, quantity: number): void {
    const currentQuantity = this.resources.get(type) || 0;
    this.resources.set(type, currentQuantity + quantity);
    console.log(`Added ${quantity} ${type}. New total: ${this.resources.get(type)}`);
  }

  // リソースを使用するメソッド
  useResource(type: ResourceType, quantity: number): boolean {
    const currentQuantity = this.resources.get(type) || 0;
    if (currentQuantity < quantity) {
      console.log(`Not enough ${type}. Current: ${currentQuantity}, Needed: ${quantity}`);
      return false;
    }
    this.resources.set(type, currentQuantity - quantity);
    console.log(`Used ${quantity} ${type}. Remaining: ${this.resources.get(type)}`);
    return true;
  }

  // 全リソースの状態を表示するメソッド
  displayResources(): void {
    console.log('Current Resources:');
    this.resources.forEach((quantity, type) => {
      console.log(`${type}: ${quantity}`);
    });
  }
}

// リソース管理システムを使用する
const survivorResources = new ResourceManager();
survivorResources.addResource('water', 5);
survivorResources.addResource('food', 3);
survivorResources.addResource('wood', 10);
survivorResources.displayResources();
survivorResources.useResource('water', 2);
survivorResources.displayResources();

太郎くん:「なるほど!TypeScriptの型システムを使うことで、リソースの種類を明確に定義できるんですね。これなら間違いも少なくなりそうです。」

山田:「そうだね。型安全性はプログラミングだけでなく、サバイバル状況でも重要なんだ。次は、このシステムを使って日々の行動計画を立ててみよう。」

2. 行動計画:効率的なサバイバル

// 行動の種類を定義
type ActionType = 'search for water' | 'gather food' | 'build shelter' | 'create tools';

// 行動インターフェースを定義
interface Action {
  type: ActionType;
  duration: number;
  resourceCost: Partial<Record<ResourceType, number>>;
  resourceGain: Partial<Record<ResourceType, number>>;
}

// サバイバー行動管理クラスを定義
class SurvivorActions {
  private resourceManager: ResourceManager;

  constructor(resourceManager: ResourceManager) {
    this.resourceManager = resourceManager;
  }

  // 行動を実行するメソッド
  performAction(action: Action): void {
    console.log(`Performing action: ${action.type}`);

    // リソースコストの確認と消費
    for (const [resourceType, cost] of Object.entries(action.resourceCost)) {
      if (!this.resourceManager.useResource(resourceType as ResourceType, cost)) {
        console.log(`Cannot perform ${action.type} due to lack of resources.`);
        return;
      }
    }

    // 行動の結果、リソースを獲得
    for (const [resourceType, gain] of Object.entries(action.resourceGain)) {
      this.resourceManager.addResource(resourceType as ResourceType, gain);
    }

    console.log(`Completed ${action.type}. Duration: ${action.duration} hours.`);
  }
}

// 行動計画の例
const searchWater: Action = {
  type: 'search for water',
  duration: 2,
  resourceCost: { food: 1 },
  resourceGain: { water: 3 }
};

const gatherFood: Action = {
  type: 'gather food',
  duration: 3,
  resourceCost: { water: 1 },
  resourceGain: { food: 2 }
};

// 行動計画の実行
const survivorActions = new SurvivorActions(survivorResources);
survivorActions.performAction(searchWater);
survivorActions.performAction(gatherFood);

太郎くん:「わぁ、これはすごいです!各行動にかかる時間やコスト、得られるリソースまで計算できるんですね。」

山田:「そうだね。これで効率的な行動計画が立てられるよ。でも、サバイバルには予期せぬ事態がつきものだ。次は、環境の変化をシミュレートしてみよう。」

3. 環境シミュレーション:変化に適応する

// 天候の種類を定義
type Weather = 'Sunny' | 'Rainy' | 'Stormy';

// 環境クラスを定義
class Environment {
  private weather: Weather = 'Sunny';

  // 天候を変更するメソッド
  changeWeather(): void {
    const weathers: Weather[] = ['Sunny', 'Rainy', 'Stormy'];
    this.weather = weathers[Math.floor(Math.random() * weathers.length)];
    console.log(`Weather changed to: ${this.weather}`);
  }

  // 天候に基づいて行動の効果を調整するメソッド
  adjustActionEffect(action: Action): Action {
    const adjustedAction = { ...action };
    switch (this.weather) {
      case 'Rainy':
        if (action.type === 'search for water') {
          adjustedAction.resourceGain.water! *= 1.5; // 水の獲得量50%増加
        }
        break;
      case 'Stormy':
        adjustedAction.duration *= 1.5; // すべての行動に50%多く時間がかかる
        break;
      // Sunny weather doesn't affect actions
    }
    return adjustedAction;
  }
}

// 環境を考慮したサバイバルシミュレーション
const environment = new Environment();
for (let day = 1; day <= 5; day++) {
  console.log(`\n--- Day ${day} ---`);
  environment.changeWeather();
  const adjustedSearchWater = environment.adjustActionEffect(searchWater);
  const adjustedGatherFood = environment.adjustActionEffect(gatherFood);
  
  survivorActions.performAction(adjustedSearchWater);
  survivorActions.performAction(adjustedGatherFood);
  
  survivorResources.displayResources();
}

太郎くん:「環境の変化まで考慮できるなんて、TypeScriptってすごいですね!」

山田:「そうだね。プログラミングの考え方を使えば、複雑な状況でも論理的に対処できるんだ。」

🌟 まとめ:コードが教えてくれたサバイバルの知恵

この仮想的な無人島サバイバル体験を通じて、私たちは新しい発見をしました。TypeScriptというプログラミング言語が、単なるウェブ開発のツールではなく、思考力を鍛え、問題解決能力を高める強力な道具だということです。

実際の無人島でコーディングはできませんが、日々のコーディングで培った以下のスキルは、どんな困難な状況でも必ず役立つはずです:

  1. 論理的思考と問題分解能力

  2. リソース管理と最適化の習慣

  3. 予測と対策の重要性

  4. データに基づく意思決定

さらに、今回のシミュレーションを通じて学んだサバイバルの基本も押さえておきましょう:

  • 水の確保が最優先(1日約3リットル必要)

  • 食料の調達と保存方法(野生植物の見分け方、魚の保存方法など)

  • シェルター作りの基本(地形を利用し、雨風をしのぐ)

  • 道具の作り方(石器、木製の道具など)

これらの知識とプログラミングスキルを組み合わせれば、どんな困難な状況でも道は開けるはずです!

🔍 もっと詳しく知りたい方へ:

💡 次回予告:「都市サバイバル:TypeScriptで災害対策アプリを作ろう」(気が向いたら書きます。。。。多分)

太郎くん:「山田さん、今回の記事で学んだことを、普段の生活にも活かせそうですね。次回も楽しみです!」

山田:「ありがとう、太郎くん。プログラミングの可能性は無限大だ。次回も一緒に学んでいこう!」

みなさんも、日々のコーディングを「サバイバル訓練」だと思って取り組んでみてはいかがでしょうか? きっと新しい視点が得られるはずです。



この記事が気に入ったらサポートをしてみませんか?