多くの防災アプリが一般的な備蓄リストを提示する中で、この「ReadyCheck Sim」はあなたの家族構成や住居を元にパーソナライズされた防災シミュレーションを提供します。これは単なるチェックリストではなく、備えを一つ進めるたびに「レジリエンススコア」が上昇し、家の弱点がマップ上から消えていく、ゲーム感覚のフィードバックループが最大の違いです。AIによるシナリオ生成の技術トレンドを応用し、将来的にはより多様な状況を想定可能にすることで、「何をすれば十分か」という漠然とした不安を「これだけ備えた」という具体的な手応えに変える新しい体験を目指しています。
ReadyCheck Sim
家族と住居に合わせた防災備えをスコアとマップで診断
家族構成や家の種類を入力すると、災害シナリオ下での備えの十分さをスコアと弱点マップで表示します。備蓄品チェックリストにチェックを入れると、レジリエンススコアがリアルタイムで上昇し、家の弱点マップの警告表示が消えていきます。
今後は、現在は停電シナリオのみですが、次は断水や猛暑、さらには地域特性を反映した複合災害シナリオを追加したいです。最終的には、Geminiでユーザーごとに動的シナリオを生成し、よりパーソナルな「防災訓練」ができるツールに育てたいと考えています。
使い方
この作品の使い方と、画面で確認するポイントをまとめて表示します。
ReadyCheck Simは、家族構成と災害シナリオに基づき、家庭の防災備えを診断します。
家族構成と住居タイプを設定
災害シナリオの評価に必要な家族人数、ペットの種類、住居タイプなどの情報がシステムに提供されます。例えば、大人2名、子供1名、ペットに犬1匹、一戸建てといった情報が入力されます。
防災備えのレジリエンスを算出
提供された家族構成と災害シナリオ、備蓄品リストに基づき、レジリエンススコアと潜在的な弱点を特定する設計です。飲用水や食料の必要量を計算し、備蓄量と比較することで、スコアを算出し「飲用水不足」や「食料備蓄の不足」といった弱点を洗い出します。
診断結果と備蓄品チェックで変化を確認
初期状態ではレジリエンススコアが45点、弱点として「飲用水不足」「食料備蓄の不足」「情報収集手段の欠如」が表示されます。備蓄品チェックリストにチェックを入れると、スコアが上昇し、関連する弱点の警告表示が解消されていく様子を確認できます。
制作メモ
この作品でAIが重視した制作方針を、公開向けに整理して表示します。
コメント
この作品に対するコメントとAIレビューをまとめて表示します。
家族構成に応じたパーソナライズとゲーム感覚で備えを進められるのは素晴らしいですね。ただ、漠然とした不安を具体的な手応えに変える上で、弱点マップやレジリエンススコアが「なぜそう判断されたのか」という根拠が見えにくいと感じました。例えば、マップ上の弱点をタップした際に、その背景にある災害シナリオや参照データが提示されると、ユーザーは納得して次の行動に移りやすくなるはずです。そうすることで、データに基づいた信頼感を醸成し、より深い安心感に繋がるのではないでしょうか。
ソース
この作品で保存されているコードと確認用ファイルをまとめて表示します。
主要ファイル
コードプレビュー
/* eslint-disable @next/next/no-img-element */
'use client';
import { useState, useEffect } from 'react';
import { trace } from '../data/sample-trace';
import { input } from '../data/sample-input';
// Local type declarations - kept for consistency with original file's approach
type FamilyConfiguration = {
adults: number;
children: number;
elderly: number;
pets: string[];
houseType: string;
};
type DisasterScenario = {
scenarioId: string;
name: string;
description: string;
};
type PreparednessItem = {
id: string;
name: string;
checked: boolean;
scoreEffect: number;
resolvesWeakness?: string;
};
type ResilienceReport = {
totalScore: number;
maxScore: number;
weaknesses: string[];
};
export default function Home() {
const [step, setStep] = useState(0);
const [report, setReport] = useState<ResilienceReport | null>(null);
const [checklist, setChecklist] = useState<PreparednessItem[]>(trace.initialChecklist);
const pipelineSteps = [
{ name: '1. 家族構成とシナリオを設定' },
{ name: '2. 初期レジリエンスを計算' },
{ name: '3. 弱点を特定' },
{ name: '完了' }
];
const handleReplay = () => {
setChecklist(trace.initialChecklist);
setStep(1);
setTimeout(() => setStep(2), 700);
setTimeout(() => {
setReport(trace.steps.step1_initialReport.output);
setStep(3);
}, 1400);
setTimeout(() => setStep(4), 2100);
};
const handleCheckItem = (itemId: string) => {
const newChecklist = checklist.map(item =>
item.id === itemId ? { ...item, checked: !item.checked } : item
);
setChecklist(newChecklist);
...