PyCatan-AI / pycatan /static /js /gameData.js
EZTIME2025
update plan
1b9de1f
// ื ืชื•ื ื™ ื”ืžืฉื—ืง - ืื•ื‘ื™ื™ืงื˜ GAMEDATA (ื‘ืจื™ืจืช ืžื—ื“ืœ ื›ืืฉืจ ืื™ืŸ ื—ื™ื‘ื•ืจ ืœืฉืจืช)
const GAMEDATA = {
// ืžืฉื•ืฉื™ื (19 ืžืฉื•ืฉื™ื ื‘ืจืžืช ืงื•ืฉื™ ืจื’ื™ืœื”)
hexes: [
// ืฉื•ืจื” ืขืœื™ื•ื ื” (3 ืžืฉื•ืฉื™ื)
{ id: 1, q: 0, r: -2, type: 'wood', number: 11, robber: false },
{ id: 2, q: 1, r: -2, type: 'sheep', number: 12, robber: false },
{ id: 3, q: 2, r: -2, type: 'wheat', number: 9, robber: false },
// ืฉื•ืจื” ืฉื ื™ื™ื” (4 ืžืฉื•ืฉื™ื)
{ id: 4, q: -1, r: -1, type: 'brick', number: 4, robber: false },
{ id: 5, q: 0, r: -1, type: 'ore', number: 6, robber: false },
{ id: 6, q: 1, r: -1, type: 'sheep', number: 5, robber: false },
{ id: 7, q: 2, r: -1, type: 'wheat', number: 10, robber: false },
// ืฉื•ืจื” ืืžืฆืขื™ืช (5 ืžืฉื•ืฉื™ื)
{ id: 8, q: -2, r: 0, type: 'wood', number: 3, robber: false },
{ id: 9, q: -1, r: 0, type: 'brick', number: 11, robber: false },
{ id: 10, q: 0, r: 0, type: 'desert', number: null, robber: true },
{ id: 11, q: 1, r: 0, type: 'wheat', number: 4, robber: false },
{ id: 12, q: 2, r: 0, type: 'ore', number: 8, robber: false },
// ืฉื•ืจื” ืจื‘ื™ืขื™ืช (4 ืžืฉื•ืฉื™ื)
{ id: 13, q: -2, r: 1, type: 'ore', number: 8, robber: false },
{ id: 14, q: -1, r: 1, type: 'sheep', number: 10, robber: false },
{ id: 15, q: 0, r: 1, type: 'wood', number: 9, robber: false },
{ id: 16, q: 1, r: 1, type: 'brick', number: 3, robber: false },
// ืฉื•ืจื” ืชื—ืชื•ื ื” (3 ืžืฉื•ืฉื™ื)
{ id: 17, q: -2, r: 2, type: 'wheat', number: 2, robber: false },
{ id: 18, q: -1, r: 2, type: 'sheep', number: 5, robber: false },
{ id: 19, q: 0, r: 2, type: 'ore', number: 6, robber: false }
],
// ื™ื™ืฉื•ื‘ื™ื - ืžืชื—ื™ืœื™ื ืจื™ืงื™ื
settlements: [],
// ืขืจื™ื - ืžืชื—ื™ืœื™ื ืจื™ืงื•ืช
cities: [],
// ื“ืจื›ื™ื - ืžืชื—ื™ืœื™ื ืจื™ืงื•ืช
roads: [],
// ืžื™ืงื•ื ื”ืฉื•ื“ื“ ื”ื ื•ื›ื—ื™
robberPosition: 10,
// ืฉื—ืงื ื™ื (ืชื•ืกืฃ ื—ื“ืฉ)
players: [
{ id: 0, name: 'ืฉื—ืงืŸ 1', victory_points: 2, total_cards: 5 },
{ id: 1, name: 'ืฉื—ืงืŸ 2', victory_points: 3, total_cards: 7 },
{ id: 2, name: 'ืฉื—ืงืŸ 3', victory_points: 1, total_cards: 4 },
{ id: 3, name: 'ืฉื—ืงืŸ 4', victory_points: 2, total_cards: 6 }
],
// ืžื™ื“ืข ื ื•ื›ื—ื™ ืขืœ ื”ืžืฉื—ืง
current_player: 0,
current_phase: 'ACTION',
dice_result: [3, 4]
};
// ืžื™ืคื•ื™ ืกื•ื’ื™ ืžืฉืื‘ื™ื ืœืงื‘ืฆื™ ื”ืชืžื•ื ื•ืช
const RESOURCE_FILES = {
'wood': 'Forest.png',
'brick': 'Hills.png',
'sheep': 'Pasture.png',
'wheat': 'Fields.png',
'ore': 'Mountains.png',
'desert': 'Desert.png'
};
// ืžื™ืคื•ื™ ืชื›ื•ื ื•ืช Tile ืœ-Hex ื‘ืคื•ืจืžื˜ ืฉืœื ื•
function tileToHex(tile) {
const tileTypeMap = {
'FOREST': 'wood',
'HILLS': 'brick',
'PASTURE': 'sheep',
'FIELDS': 'wheat',
'MOUNTAINS': 'ore',
'DESERT': 'desert'
};
return {
id: tile.id || tile.position,
q: tile.position ? tile.position[0] : 0,
r: tile.position ? tile.position[1] : 0,
type: tileTypeMap[tile.type] || 'desert',
number: tile.token,
robber: tile.has_robber || false
};
}
// ื”ืžืจืช GameState ืžPyCatan ืœืคื•ืจืžื˜ ืฉืœื ื•
function convertGameState(pyGameState) {
const converted = {
hexes: [],
settlements: [],
cities: [],
roads: [],
players: [],
robberPosition: null,
current_player: pyGameState.current_player || 0,
current_phase: pyGameState.current_phase || 'ACTION',
dice_result: pyGameState.dice_result || null
};
// ื”ืžืจ ืžืฉื•ืฉื™ื
if (pyGameState.board && pyGameState.board.tiles) {
converted.hexes = pyGameState.board.tiles.map((tile, index) => tileToHex({
...tile,
id: index + 1
}));
}
// ื”ืžืจ ืฉื—ืงื ื™ื
if (pyGameState.players) {
converted.players = pyGameState.players.map((player, index) => ({
id: index,
name: player.name || `ืฉื—ืงืŸ ${index + 1}`,
victory_points: player.victory_points || 0,
total_cards: (player.cards && player.cards.length) || 0
}));
}
// ื”ืžืจ ืžื‘ื ื™ื
if (pyGameState.buildings) {
pyGameState.buildings.forEach(building => {
if (building.type === 'settlement') {
converted.settlements.push({
id: building.id,
vertex: building.point_id,
player: building.player + 1
});
} else if (building.type === 'city') {
converted.cities.push({
id: building.id,
vertex: building.point_id,
player: building.player + 1
});
}
});
}
// ื”ืžืจ ื“ืจื›ื™ื
if (pyGameState.roads) {
converted.roads = pyGameState.roads.map((road, index) => ({
id: index + 1,
from: road.start_point_id,
to: road.end_point_id,
player: road.player + 1
}));
}
return converted;
}