import React, { useState, useMemo } from ‘react’;
import { Trophy, Calendar, Swords, Info, User, ChevronRight } from ‘lucide-react’;
const App = () => {
// 選手データ
const players = [“三笠 貴大”, “児玉 勇也”, “丸山 大輝”, “樋口 幹太”, “大城 正也”];
// 初期対戦カード(確定スケジュール)
const initialMatches = [
{ id: 1, date: “2026/05/17”, event: “GRACHAN 82”, p1: “三笠 貴大”, p2: “児玉 勇也”, location: “大田区”, winner: null, method: null },
{ id: 2, date: “2026/05/17”, event: “GRACHAN 82”, p1: “丸山 大輝”, p2: “大城 正也”, location: “大田区”, winner: null, method: null },
{ id: 3, date: “2026/08/26”, event: “HELIOS 3”, p1: “三笠 貴大”, p2: “丸山 大輝”, location: “後楽園”, winner: null, method: null },
{ id: 4, date: “2026/09/13”, event: “GRACHAN 84”, p1: “大城 正也”, p2: “樋口 幹太”, location: “福岡”, winner: null, method: null },
{ id: 5, date: “2026/12/06”, event: “GRACHAN 86”, p1: “三笠 貴大”, p2: “樋口 幹太”, location: “大田区”, winner: null, method: null },
{ id: 6, date: “2026/12/06”, event: “GRACHAN 86”, p1: “児玉 勇也”, p2: “丸山 大輝”, location: “大田区”, winner: null, method: null },
{ id: 7, date: “2027/03/XX”, event: “GRACHAN 87”, p1: “三笠 貴大”, p2: “大城 正也”, location: “東京近郊”, winner: null, method: null },
{ id: 8, date: “2027/03/XX”, event: “GRACHAN 87”, p1: “児玉 勇也”, p2: “樋口 幹太”, location: “東京近郊”, winner: null, method: null },
{ id: 9, date: “2027/05/XX”, event: “最終戦”, p1: “児玉 勇也”, p2: “大城 正也”, location: “東京”, winner: null, method: null },
{ id: 10, date: “2027/05/XX”, event: “最終戦”, p1: “丸山 大輝”, p2: “樋口 幹太”, location: “東京”, winner: null, method: null },
];
const [matches, setMatches] = useState(initialMatches);
// 勝ち点ルール
const pointRules = {
“1R_KO”: { label: “1R 一本/KO”, pts: 6 },
“2R_KO”: { label: “2R 一本/KO”, pts: 5 },
“3R_KO”: { label: “3R 一本/KO”, pts: 4 },
“DECISION”: { label: “判定/不戦勝”, pts: 3 },
“LOSS”: { label: “負け”, pts: 0 }
};
// 結果入力ハンドラ
const handleUpdateMatch = (matchId, winnerName, methodKey) => {
setMatches(prev => prev.map(m =>
m.id === matchId ? { …m, winner: winnerName, method: methodKey } : m
));
};
// 順位計算ロジック
const standings = useMemo(() => {
const stats = players.reduce((acc, name) => {
acc[name] = { name, played: 0, win: 0, loss: 0, pts: 0 };
return acc;
}, {});
matches.forEach(m => {
if (m.winner) {
const loser = m.winner === m.p1 ? m.p2 : m.p1;
// 勝者の統計
stats[m.winner].played += 1;
stats[m.winner].win += 1;
stats[m.winner].pts += pointRules[m.method].pts;
// 敗者の統計
stats[loser].played += 1;
stats[loser].loss += 1;
}
});
return Object.values(stats).sort((a, b) => b.pts – a.pts || b.win – a.win);
}, [matches]);
return (
{/* Header */}
GRACHAN リーグ戦 2026-2027
5選手総当たり・全10試合管理システム
Total Matches
10
Completed
{matches.filter(m => m.winner).length}
{/* Main Column: Match List */}
{/* Side Column: Standings & Rules */}
対戦スケジュール & 結果入力
{matches.map((m) => (
))}
{m.date} – {m.event} ({m.location})
Match #{m.id}
{/* Matchup */}
VS
{/* Result Input */}
選手A
{m.p1}
選手B
{m.p2}
{/* Standings Table */}
{/* Point Rules Card */}
現在の順位表
| 順位 | 選手名 | 試合 | 勝ち点 |
|---|---|---|---|
| {idx === 0 ? 🥇 : idx + 1} | {s.name} | {s.played} | {s.pts} pts |
Translate(翻訳)>>