2
4

ボタンをクリックするだけで、株を売買できるゲームのダッシュボード。

Last updated at Posted at 2024-10-04

スクリーンショット 2024-10-04 192854.png

スクリーンショット 2024-10-04 203034.png

簡単に株を売買できます。2秒ごとに株価が更新され、売買のタイミングを計る楽しさ。
ゲーム開始時の資産は1000円です。
(これはゲームです。本物ではありません。)

コードをメモ帳などのテキストエディタに貼り付け、ファイルを「index.html」などの拡張子が.htmlのファイルとして保存します。その後、保存したファイルをブラウザで開けば、コードが実行されます。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>株価ゲームダッシュボード</title>
    <style>
        body {
            font-family: 'Arial', sans-serif;
            background-color: #f5f5f5;
            margin: 0;
            padding: 20px;
        }
        .header {
            text-align: center;
            margin-bottom: 20px;
        }
        .portfolio {
            background-color: #ffffff;
            border-radius: 10px;
            padding: 20px;
            margin-bottom: 20px;
            box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
        }
        .stock {
            display: flex;
            justify-content: space-between;
            margin: 10px 0;
        }
        .stock-name {
            font-weight: bold;
        }
        .actions {
            display: flex;
            align-items: center;
        }
        button {
            margin-left: 10px;
            padding: 5px 10px;
            border: none;
            border-radius: 5px;
            background-color: #28a745;
            color: white;
            cursor: pointer;
        }
        button:hover {
            background-color: #218838;
        }
        .stock-price {
            color: #007bff;
            font-weight: bold;
        }
    </style>
</head>
<body>

    <div class="header">
        <h1>株価ゲームダッシュボード</h1>
        <p>架空の株を売買して資産を増やしましょう!</p>
    </div>

    <div class="portfolio">
        <h2>ポートフォリオ</h2>
        <div id="portfolioContainer"></div>
        <div class="stock">
            <span>資産: ¥<span id="totalValue">1000</span></span>
        </div>
    </div>

    <div id="stocksContainer"></div>

    <script>
        const stocks = [
            { name: "企業A", price: 100 },
            { name: "企業B", price: 200 },
            { name: "企業C", price: 150 },
            { name: "企業D", price: 250 }
        ];

        let portfolio = {};
        let totalValue = 1000; // 初期資金 1000円

        const stocksContainer = document.getElementById("stocksContainer");
        const portfolioContainer = document.getElementById("portfolioContainer");
        const totalValueDisplay = document.getElementById("totalValue");

        function updateStockPrices() {
            stocks.forEach(stock => {
                const priceChange = (Math.random() * 10 - 5).toFixed(2); // ±5の価格変動
                stock.price = Math.max(0, (stock.price + parseFloat(priceChange)).toFixed(2));
            });
            renderStocks();
        }

        function renderStocks() {
            stocksContainer.innerHTML = "";
            stocks.forEach(stock => {
                const stockDiv = document.createElement("div");
                stockDiv.className = "stock";
                stockDiv.innerHTML = `
                    <span class="stock-name">${stock.name}</span>
                    <span class="stock-price">¥${stock.price}</span>
                    <div class="actions">
                        <button onclick="buyStock('${stock.name}')">購入</button>
                        <button onclick="sellStock('${stock.name}')">売却</button>
                    </div>
                `;
                stocksContainer.appendChild(stockDiv);
            });
        }

        function buyStock(stockName) {
            const quantity = 1; // 購入時は常に1株
            const stock = stocks.find(s => s.name === stockName);
            const cost = stock.price * quantity;
            if (totalValue >= cost) {
                totalValue -= cost;
                portfolio[stockName] = (portfolio[stockName] || 0) + quantity;
                updatePortfolio();
                alert(`${stockName}${quantity}株購入しました。`);
            } else {
                alert("資金が不足しています。");
            }
        }

        function sellStock(stockName) {
            const quantity = 1; // 売却も常に1株
            if (portfolio[stockName] && portfolio[stockName] >= quantity) {
                const stock = stocks.find(s => s.name === stockName);
                totalValue += stock.price * quantity;
                portfolio[stockName] -= quantity;
                updatePortfolio();
                alert(`${stockName}${quantity}株売却しました。`);
            } else {
                alert("保有株数が不足しています。");
            }
        }

        function updatePortfolio() {
            portfolioContainer.innerHTML = "";
            for (let stock in portfolio) {
                if (portfolio[stock] > 0) {
                    const stockDiv = document.createElement("div");
                    stockDiv.innerHTML = `${stock}: ${portfolio[stock]}株`;
                    portfolioContainer.appendChild(stockDiv);
                }
            }
            totalValueDisplay.innerText = totalValue.toFixed(2);
        }

        setInterval(() => {
            updateStockPrices();
        }, 2000); // 2秒ごとに株価を更新

        updateStockPrices(); // 初期株価を表示
    </script>

</body>
</html>

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4