Code edit (4 edits merged)
Please save this source code
Code edit (1 edits merged)
Please save this source code
User prompt
neden olmadığını söylermisin şöyle uyarı çıkıyo FAILURE: Integration failed, target source not found. Please try again. ne yapmam lazım yardımcı olurmusun
User prompt
32 olsun vazgeçtim
User prompt
40 pixel alan kazansın
User prompt
botları daha zeeki yap
User prompt
para kesesini sağ üste ekle
User prompt
şimdide oyuna para ekliyelim paran olmadıkça bir yere saldırılmasın
User prompt
şimdide sınırmdaki herhangi bir yere saldırabileyim
User prompt
kırmızıya nasıl saldırıyosam yeşilede saldırayım
User prompt
yeşile saldırılmoyor
User prompt
yeşil bir yere saldırmıyor ona aı ekle
User prompt
yeşile saldırılmoyor
User prompt
yukarıya yeşilinde skor tablosu yap
User prompt
yeşil renk hala saldırmıyor
User prompt
yeşil renk biryere saldırmıyor
User prompt
sadece kırmızı ile mavi var oraya bide yeşil renk eklermisin
User prompt
daha fazla renk ekle birazde haritayı büyüt
Code edit (1 edits merged)
Please save this source code
User prompt
Territory Conquest: Ülke Oyunu
Initial prompt
territorial yaparmısın ülke oyunu
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// CountryMarker: Player, AI, or Country 3 marker for claiming territory
var CountryMarker = Container.expand(function () {
var self = Container.call(this);
// 1 = player, 2 = AI, 3 = Country 3 (green)
self.owner = 1;
var markerAsset = null;
self.setOwner = function (owner) {
self.owner = owner;
self.removeChildren();
if (self.owner === 1) {
markerAsset = self.attachAsset('playerMarker', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (self.owner === 2) {
markerAsset = self.attachAsset('aiMarker', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (self.owner === 3) {
markerAsset = self.attachAsset('markerCountry3', {
anchorX: 0.5,
anchorY: 0.5
});
}
};
// For AI, target cell to move towards
self.targetCell = null;
return self;
});
// GridCell: Represents a single region on the map
var GridCell = Container.expand(function () {
var self = Container.call(this);
// State: 0 = neutral, 1 = player, 2 = AI
self.state = 0;
self.row = 0;
self.col = 0;
// Attach neutral asset by default
var cellAsset = self.attachAsset('cellNeutral', {
anchorX: 0.5,
anchorY: 0.5
});
// Update cell appearance based on state
self.setState = function (newState) {
self.state = newState;
// Remove previous asset
self.removeChildren();
if (self.state === 0) {
cellAsset = self.attachAsset('cellNeutral', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (self.state === 1) {
cellAsset = self.attachAsset('cellPlayer', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (self.state === 2) {
cellAsset = self.attachAsset('cellAI', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (self.state === 3) {
cellAsset = self.attachAsset('cellCountry3', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (self.state === 4) {
cellAsset = self.attachAsset('cellCountry4', {
anchorX: 0.5,
anchorY: 0.5
});
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xfafafa
});
/****
* Game Code
****/
// Additional colors for more countries
// Grid cell states
// Country markers (player and AI)
// Grid settings
var GRID_ROWS = 9;
var GRID_COLS = 7;
var CELL_SIZE = 180;
var GRID_OFFSET_X = (2048 - GRID_COLS * CELL_SIZE) / 2;
var GRID_OFFSET_Y = 200;
// Game state
var grid = [];
var playerMarker = null;
var aiMarker = null;
var playerCells = 0;
var aiCells = 0;
var neutralCells = 0;
var country3Cells = 0;
var dragMarker = null;
var lastPlayerCell = null;
var lastAIUpdateTick = 0;
var aiMoveInterval = 60; // AI moves every 60 ticks (~1s)
var gameEnded = false;
// Score display
var scoreTxt = new Text2('0 - 0 - 0', {
size: 110,
fill: "#222"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Player money
var playerMoney = 5;
var moneyTxt = new Text2('💰 ' + playerMoney, {
size: 90,
fill: 0x2ECC40
});
moneyTxt.anchor.set(1, 0); // anchor right/top
LK.gui.topRight.addChild(moneyTxt);
moneyTxt.x = 0; // right edge of gui.topRight
moneyTxt.y = 0; // top edge of gui.topRight
// Helper: Get cell at grid position
function getCell(row, col) {
if (row < 0 || row >= GRID_ROWS || col < 0 || col >= GRID_COLS) return null;
return grid[row][col];
// Green (country 3) AI move
if (!gameEnded && LK.ticks - lastCountry3UpdateTick > country3MoveInterval) {
lastCountry3UpdateTick = LK.ticks;
var greenTarget = country3ChooseTarget();
if (greenTarget) {
// Animate green marker to target
tween(country3Marker, {
x: greenTarget.x,
y: greenTarget.y
}, {
duration: 200,
easing: tween.easeInOut,
onFinish: function onFinish() {
// Claim cell
if (greenTarget.state === 1 || greenTarget.state === 2) {
// Player or AI loses cell
greenTarget.setState(3);
// If player marker is here, snap it back to last owned cell
var dx = playerMarker.x - greenTarget.x;
var dy = playerMarker.y - greenTarget.y;
if (Math.sqrt(dx * dx + dy * dy) < 10) {
// Find any player cell to snap to
var found = false;
for (var r = 0; r < GRID_ROWS; r++) {
for (var c = 0; c < GRID_COLS; c++) {
if (grid[r][c].state === 1) {
lastPlayerCell = grid[r][c];
tween(playerMarker, {
x: lastPlayerCell.x,
y: lastPlayerCell.y
}, {
duration: 120,
easing: tween.easeIn
});
found = true;
break;
}
}
if (found) break;
}
}
} else {
greenTarget.setState(3);
}
lastCountry3Cell = greenTarget;
countCells();
updateScore();
checkEndGame();
}
});
}
}
}
;
// Helper: Get cell at (x, y) game coordinates
function getCellAtPosition(x, y) {
var col = Math.floor((x - GRID_OFFSET_X) / CELL_SIZE);
var row = Math.floor((y - GRID_OFFSET_Y) / CELL_SIZE);
return getCell(row, col);
}
// Helper: Get adjacent cells (up, down, left, right)
function getAdjacentCells(cell) {
var adj = [];
var dirs = [{
dr: -1,
dc: 0
}, {
dr: 1,
dc: 0
}, {
dr: 0,
dc: -1
}, {
dr: 0,
dc: 1
}];
for (var i = 0; i < dirs.length; i++) {
var ncell = getCell(cell.row + dirs[i].dr, cell.col + dirs[i].dc);
if (ncell) adj.push(ncell);
}
return adj;
}
// Helper: Count cells by state
function countCells() {
playerCells = 0;
aiCells = 0;
neutralCells = 0;
country3Cells = 0;
for (var r = 0; r < GRID_ROWS; r++) {
for (var c = 0; c < GRID_COLS; c++) {
var cell = grid[r][c];
if (cell.state === 0) {
neutralCells++;
} else if (cell.state === 1) {
playerCells++;
} else if (cell.state === 2) {
aiCells++;
} else if (cell.state === 3) {
country3Cells++;
}
}
}
}
// Helper: Update score display
function updateScore() {
scoreTxt.setText(playerCells + " - " + aiCells + " - " + country3Cells);
}
// Helper: Check win/lose
function checkEndGame() {
if (gameEnded) return;
var total = GRID_ROWS * GRID_COLS;
if (playerCells > total / 2) {
gameEnded = true;
LK.showYouWin();
} else if (aiCells > total / 2 || playerCells === 0) {
gameEnded = true;
LK.showGameOver();
}
}
// Initialize grid
grid = [];
for (var r = 0; r < GRID_ROWS; r++) {
var rowArr = [];
for (var c = 0; c < GRID_COLS; c++) {
var cell = new GridCell();
cell.row = r;
cell.col = c;
cell.x = GRID_OFFSET_X + c * CELL_SIZE + CELL_SIZE / 2;
cell.y = GRID_OFFSET_Y + r * CELL_SIZE + CELL_SIZE / 2;
cell.setState(0);
game.addChild(cell);
rowArr.push(cell);
}
grid.push(rowArr);
}
// Set initial player, AI, and Country 3 (green) territory (center cells)
var playerStart = getCell(Math.floor(GRID_ROWS / 2), 1);
playerStart.setState(1);
var aiStart = getCell(Math.floor(GRID_ROWS / 2), GRID_COLS - 2);
aiStart.setState(2);
var country3Start = getCell(Math.floor(GRID_ROWS / 2), Math.floor(GRID_COLS / 2));
country3Start.setState(3);
// Place player marker
playerMarker = new CountryMarker();
playerMarker.setOwner(1);
playerMarker.x = playerStart.x;
playerMarker.y = playerStart.y;
game.addChild(playerMarker);
lastPlayerCell = playerStart;
// Place AI marker
aiMarker = new CountryMarker();
aiMarker.setOwner(2);
aiMarker.x = aiStart.x;
aiMarker.y = aiStart.y;
game.addChild(aiMarker);
// Place Country 3 (green) marker (now with AI movement/attack)
country3Marker = new CountryMarker();
country3Marker.setOwner(3);
country3Marker.x = country3Start.x;
country3Marker.y = country3Start.y;
game.addChild(country3Marker);
lastCountry3Cell = country3Start;
// Country 3 (green) AI variables
var lastCountry3UpdateTick = 0;
var country3MoveInterval = 60; // green AI moves every 60 ticks (~1s)
// Initial cell counts
countCells();
updateScore();
// Dragging logic for player marker
game.down = function (x, y, obj) {
// Only allow drag if touch/click is on player marker
var dx = x - playerMarker.x;
var dy = y - playerMarker.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 80) {
dragMarker = playerMarker;
}
};
game.up = function (x, y, obj) {
if (dragMarker === playerMarker) {
// Snap to nearest cell
var cell = getCellAtPosition(playerMarker.x, playerMarker.y);
if (cell && (cell.state === 0 || cell.state === 2 || cell.state === 3)) {
// Allow move to any cell adjacent to ANY player cell
var isAdj = false;
for (var r = 0; r < GRID_ROWS; r++) {
for (var c = 0; c < GRID_COLS; c++) {
if (grid[r][c].state === 1) {
var adj = getAdjacentCells(grid[r][c]);
for (var i = 0; i < adj.length; i++) {
if (adj[i] === cell) {
isAdj = true;
break;
}
}
if (isAdj) break;
}
}
if (isAdj) break;
}
if (isAdj) {
// Only allow attack if player has money
if (playerMoney > 0) {
playerMoney--;
moneyTxt.setText('💰 ' + playerMoney);
// Claim cell
cell.setState(1);
lastPlayerCell = cell;
// Animate marker to cell center
tween(playerMarker, {
x: cell.x,
y: cell.y
}, {
duration: 180,
easing: tween.easeOut
});
countCells();
updateScore();
checkEndGame();
} else {
// Not enough money, snap back
tween(playerMarker, {
x: lastPlayerCell.x,
y: lastPlayerCell.y
}, {
duration: 120,
easing: tween.easeIn
});
}
} else {
// Not adjacent, snap back
tween(playerMarker, {
x: lastPlayerCell.x,
y: lastPlayerCell.y
}, {
duration: 120,
easing: tween.easeIn
});
}
} else {
// Not a valid cell, snap back
tween(playerMarker, {
x: lastPlayerCell.x,
y: lastPlayerCell.y
}, {
duration: 120,
easing: tween.easeIn
});
}
}
dragMarker = null;
};
game.move = function (x, y, obj) {
if (dragMarker === playerMarker) {
// Restrict movement to grid area
var px = Math.max(GRID_OFFSET_X + 60, Math.min(x, GRID_OFFSET_X + GRID_COLS * CELL_SIZE - 60));
var py = Math.max(GRID_OFFSET_Y + 60, Math.min(y, GRID_OFFSET_Y + GRID_ROWS * CELL_SIZE - 60));
playerMarker.x = px;
playerMarker.y = py;
}
};
// AI logic: smarter targeting: prioritize attacking player cells with most adjacent AI cells, fallback to neutral, then green (country 3)
function aiChooseTarget() {
// Find all AI cells
var aiCellsArr = [];
for (var r = 0; r < GRID_ROWS; r++) {
for (var c = 0; c < GRID_COLS; c++) {
if (grid[r][c].state === 2) aiCellsArr.push(grid[r][c]);
}
}
// For each AI cell, check adjacent for neutral, player, or green cells
var playerCandidates = [];
var neutralCandidates = [];
var greenCandidates = [];
for (var i = 0; i < aiCellsArr.length; i++) {
var adj = getAdjacentCells(aiCellsArr[i]);
for (var j = 0; j < adj.length; j++) {
var cell = adj[j];
if (cell.state === 1) {
// Count how many AI cells are adjacent to this player cell
var adjToPlayer = getAdjacentCells(cell);
var aiAdjCount = 0;
for (var k = 0; k < adjToPlayer.length; k++) {
if (adjToPlayer[k].state === 2) aiAdjCount++;
}
playerCandidates.push({
cell: cell,
aiAdjCount: aiAdjCount
});
} else if (cell.state === 0) {
neutralCandidates.push(cell);
} else if (cell.state === 3) {
greenCandidates.push(cell);
}
}
}
// Prefer player cells with most adjacent AI cells (easier to defend/expand)
if (playerCandidates.length > 0) {
// Sort descending by aiAdjCount
playerCandidates.sort(function (a, b) {
return b.aiAdjCount - a.aiAdjCount;
});
// Pick one of the best (if multiple have same max)
var maxAdj = playerCandidates[0].aiAdjCount;
var best = [];
for (var i = 0; i < playerCandidates.length; i++) {
if (playerCandidates[i].aiAdjCount === maxAdj) best.push(playerCandidates[i].cell);
}
var idx = Math.floor(Math.random() * best.length);
return best[idx];
}
// Otherwise, prefer neutral cells
if (neutralCandidates.length > 0) {
var idx = Math.floor(Math.random() * neutralCandidates.length);
return neutralCandidates[idx];
}
// Otherwise, attack green (country 3)
if (greenCandidates.length > 0) {
var idx = Math.floor(Math.random() * greenCandidates.length);
return greenCandidates[idx];
}
return null;
}
// Green (country 3) AI logic: smarter targeting: prioritize attacking player/AI cells with most adjacent green cells, fallback to neutral
function country3ChooseTarget() {
// Find all green cells
var greenCellsArr = [];
for (var r = 0; r < GRID_ROWS; r++) {
for (var c = 0; c < GRID_COLS; c++) {
if (grid[r][c].state === 3) greenCellsArr.push(grid[r][c]);
}
}
// For each green cell, check adjacent for neutral, player, or AI cells (never yellow)
var playerCandidates = [];
var aiCandidates = [];
var neutralCandidates = [];
for (var i = 0; i < greenCellsArr.length; i++) {
var adj = getAdjacentCells(greenCellsArr[i]);
for (var j = 0; j < adj.length; j++) {
var cell = adj[j];
if (cell.state === 1) {
// Count how many green cells are adjacent to this player cell
var adjToPlayer = getAdjacentCells(cell);
var greenAdjCount = 0;
for (var k = 0; k < adjToPlayer.length; k++) {
if (adjToPlayer[k].state === 3) greenAdjCount++;
}
playerCandidates.push({
cell: cell,
greenAdjCount: greenAdjCount
});
} else if (cell.state === 2) {
// Count how many green cells are adjacent to this AI cell
var adjToAI = getAdjacentCells(cell);
var greenAdjCount = 0;
for (var k = 0; k < adjToAI.length; k++) {
if (adjToAI[k].state === 3) greenAdjCount++;
}
aiCandidates.push({
cell: cell,
greenAdjCount: greenAdjCount
});
} else if (cell.state === 0) {
neutralCandidates.push(cell);
}
}
}
// Prefer player cells with most adjacent green cells
if (playerCandidates.length > 0) {
playerCandidates.sort(function (a, b) {
return b.greenAdjCount - a.greenAdjCount;
});
var maxAdj = playerCandidates[0].greenAdjCount;
var best = [];
for (var i = 0; i < playerCandidates.length; i++) {
if (playerCandidates[i].greenAdjCount === maxAdj) best.push(playerCandidates[i].cell);
}
var idx = Math.floor(Math.random() * best.length);
return best[idx];
}
// Otherwise, prefer AI cells with most adjacent green cells
if (aiCandidates.length > 0) {
aiCandidates.sort(function (a, b) {
return b.greenAdjCount - a.greenAdjCount;
});
var maxAdj = aiCandidates[0].greenAdjCount;
var best = [];
for (var i = 0; i < aiCandidates.length; i++) {
if (aiCandidates[i].greenAdjCount === maxAdj) best.push(aiCandidates[i].cell);
}
var idx = Math.floor(Math.random() * best.length);
return best[idx];
}
// Otherwise, prefer neutral cells
if (neutralCandidates.length > 0) {
var idx = Math.floor(Math.random() * neutralCandidates.length);
return neutralCandidates[idx];
}
return null;
}
// Main game update loop
game.update = function () {
if (gameEnded) return;
// Give player money for each cell owned at the start of their turn (max 10)
if (LK.ticks % 60 === 0 && !gameEnded) {
var newMoney = 0;
for (var r = 0; r < GRID_ROWS; r++) {
for (var c = 0; c < GRID_COLS; c++) {
if (grid[r][c].state === 1) newMoney++;
}
}
playerMoney += newMoney;
if (playerMoney > 10) playerMoney = 10;
moneyTxt.setText('💰 ' + playerMoney);
}
// AI move
if (LK.ticks - lastAIUpdateTick > aiMoveInterval) {
lastAIUpdateTick = LK.ticks;
var target = aiChooseTarget();
if (target) {
// Animate AI marker to target
tween(aiMarker, {
x: target.x,
y: target.y
}, {
duration: 200,
easing: tween.easeInOut,
onFinish: function onFinish() {
// Claim cell
if (target.state === 1) {
// Player loses cell
target.setState(2);
// If player marker is here, snap it back to last owned cell
var dx = playerMarker.x - target.x;
var dy = playerMarker.y - target.y;
if (Math.sqrt(dx * dx + dy * dy) < 10) {
// Find any player cell to snap to
var found = false;
for (var r = 0; r < GRID_ROWS; r++) {
for (var c = 0; c < GRID_COLS; c++) {
if (grid[r][c].state === 1) {
lastPlayerCell = grid[r][c];
tween(playerMarker, {
x: lastPlayerCell.x,
y: lastPlayerCell.y
}, {
duration: 120,
easing: tween.easeIn
});
found = true;
break;
}
}
if (found) break;
}
}
} else {
target.setState(2);
}
countCells();
updateScore();
checkEndGame();
}
});
}
}
// Green (country 3) AI move
if (!gameEnded && LK.ticks - lastCountry3UpdateTick > country3MoveInterval) {
lastCountry3UpdateTick = LK.ticks;
var greenTarget = country3ChooseTarget();
if (greenTarget) {
// Animate green marker to target
tween(country3Marker, {
x: greenTarget.x,
y: greenTarget.y
}, {
duration: 200,
easing: tween.easeInOut,
onFinish: function onFinish() {
// Claim cell
if (greenTarget.state === 1 || greenTarget.state === 2) {
// Player or AI loses cell
greenTarget.setState(3);
// If player marker is here, snap it back to last owned cell
var dx = playerMarker.x - greenTarget.x;
var dy = playerMarker.y - greenTarget.y;
if (Math.sqrt(dx * dx + dy * dy) < 10) {
// Find any player cell to snap to
var found = false;
for (var r = 0; r < GRID_ROWS; r++) {
for (var c = 0; c < GRID_COLS; c++) {
if (grid[r][c].state === 1) {
lastPlayerCell = grid[r][c];
tween(playerMarker, {
x: lastPlayerCell.x,
y: lastPlayerCell.y
}, {
duration: 120,
easing: tween.easeIn
});
found = true;
break;
}
}
if (found) break;
}
}
} else {
greenTarget.setState(3);
}
lastCountry3Cell = greenTarget;
countCells();
updateScore();
checkEndGame();
}
});
}
}
}; ===================================================================
--- original.js
+++ change.js
@@ -396,36 +396,71 @@
playerMarker.x = px;
playerMarker.y = py;
}
};
-// AI logic: move towards nearest neutral or player cell adjacent to its territory
+// AI logic: smarter targeting: prioritize attacking player cells with most adjacent AI cells, fallback to neutral, then green (country 3)
function aiChooseTarget() {
// Find all AI cells
var aiCellsArr = [];
for (var r = 0; r < GRID_ROWS; r++) {
for (var c = 0; c < GRID_COLS; c++) {
if (grid[r][c].state === 2) aiCellsArr.push(grid[r][c]);
}
}
- // For each AI cell, check adjacent for neutral or player cells
- var candidates = [];
+ // For each AI cell, check adjacent for neutral, player, or green cells
+ var playerCandidates = [];
+ var neutralCandidates = [];
+ var greenCandidates = [];
for (var i = 0; i < aiCellsArr.length; i++) {
var adj = getAdjacentCells(aiCellsArr[i]);
for (var j = 0; j < adj.length; j++) {
- // Only target neutral, player, or green (country 3) cells
- if (adj[j].state === 0 || adj[j].state === 1 || adj[j].state === 3) {
- candidates.push(adj[j]);
+ var cell = adj[j];
+ if (cell.state === 1) {
+ // Count how many AI cells are adjacent to this player cell
+ var adjToPlayer = getAdjacentCells(cell);
+ var aiAdjCount = 0;
+ for (var k = 0; k < adjToPlayer.length; k++) {
+ if (adjToPlayer[k].state === 2) aiAdjCount++;
+ }
+ playerCandidates.push({
+ cell: cell,
+ aiAdjCount: aiAdjCount
+ });
+ } else if (cell.state === 0) {
+ neutralCandidates.push(cell);
+ } else if (cell.state === 3) {
+ greenCandidates.push(cell);
}
}
}
- // Pick random candidate
- if (candidates.length > 0) {
- var idx = Math.floor(Math.random() * candidates.length);
- return candidates[idx];
+ // Prefer player cells with most adjacent AI cells (easier to defend/expand)
+ if (playerCandidates.length > 0) {
+ // Sort descending by aiAdjCount
+ playerCandidates.sort(function (a, b) {
+ return b.aiAdjCount - a.aiAdjCount;
+ });
+ // Pick one of the best (if multiple have same max)
+ var maxAdj = playerCandidates[0].aiAdjCount;
+ var best = [];
+ for (var i = 0; i < playerCandidates.length; i++) {
+ if (playerCandidates[i].aiAdjCount === maxAdj) best.push(playerCandidates[i].cell);
+ }
+ var idx = Math.floor(Math.random() * best.length);
+ return best[idx];
}
+ // Otherwise, prefer neutral cells
+ if (neutralCandidates.length > 0) {
+ var idx = Math.floor(Math.random() * neutralCandidates.length);
+ return neutralCandidates[idx];
+ }
+ // Otherwise, attack green (country 3)
+ if (greenCandidates.length > 0) {
+ var idx = Math.floor(Math.random() * greenCandidates.length);
+ return greenCandidates[idx];
+ }
return null;
}
-// Green (country 3) AI logic: move towards nearest neutral, player, or AI cell adjacent to its territory
+// Green (country 3) AI logic: smarter targeting: prioritize attacking player/AI cells with most adjacent green cells, fallback to neutral
function country3ChooseTarget() {
// Find all green cells
var greenCellsArr = [];
for (var r = 0; r < GRID_ROWS; r++) {
@@ -433,23 +468,73 @@
if (grid[r][c].state === 3) greenCellsArr.push(grid[r][c]);
}
}
// For each green cell, check adjacent for neutral, player, or AI cells (never yellow)
- var candidates = [];
+ var playerCandidates = [];
+ var aiCandidates = [];
+ var neutralCandidates = [];
for (var i = 0; i < greenCellsArr.length; i++) {
var adj = getAdjacentCells(greenCellsArr[i]);
for (var j = 0; j < adj.length; j++) {
- // Only target neutral, player, or AI cells, never yellow (country 4) or itself
- if (adj[j].state === 0 || adj[j].state === 1 || adj[j].state === 2) {
- candidates.push(adj[j]);
+ var cell = adj[j];
+ if (cell.state === 1) {
+ // Count how many green cells are adjacent to this player cell
+ var adjToPlayer = getAdjacentCells(cell);
+ var greenAdjCount = 0;
+ for (var k = 0; k < adjToPlayer.length; k++) {
+ if (adjToPlayer[k].state === 3) greenAdjCount++;
+ }
+ playerCandidates.push({
+ cell: cell,
+ greenAdjCount: greenAdjCount
+ });
+ } else if (cell.state === 2) {
+ // Count how many green cells are adjacent to this AI cell
+ var adjToAI = getAdjacentCells(cell);
+ var greenAdjCount = 0;
+ for (var k = 0; k < adjToAI.length; k++) {
+ if (adjToAI[k].state === 3) greenAdjCount++;
+ }
+ aiCandidates.push({
+ cell: cell,
+ greenAdjCount: greenAdjCount
+ });
+ } else if (cell.state === 0) {
+ neutralCandidates.push(cell);
}
}
}
- // Pick random candidate
- if (candidates.length > 0) {
- var idx = Math.floor(Math.random() * candidates.length);
- return candidates[idx];
+ // Prefer player cells with most adjacent green cells
+ if (playerCandidates.length > 0) {
+ playerCandidates.sort(function (a, b) {
+ return b.greenAdjCount - a.greenAdjCount;
+ });
+ var maxAdj = playerCandidates[0].greenAdjCount;
+ var best = [];
+ for (var i = 0; i < playerCandidates.length; i++) {
+ if (playerCandidates[i].greenAdjCount === maxAdj) best.push(playerCandidates[i].cell);
+ }
+ var idx = Math.floor(Math.random() * best.length);
+ return best[idx];
}
+ // Otherwise, prefer AI cells with most adjacent green cells
+ if (aiCandidates.length > 0) {
+ aiCandidates.sort(function (a, b) {
+ return b.greenAdjCount - a.greenAdjCount;
+ });
+ var maxAdj = aiCandidates[0].greenAdjCount;
+ var best = [];
+ for (var i = 0; i < aiCandidates.length; i++) {
+ if (aiCandidates[i].greenAdjCount === maxAdj) best.push(aiCandidates[i].cell);
+ }
+ var idx = Math.floor(Math.random() * best.length);
+ return best[idx];
+ }
+ // Otherwise, prefer neutral cells
+ if (neutralCandidates.length > 0) {
+ var idx = Math.floor(Math.random() * neutralCandidates.length);
+ return neutralCandidates[idx];
+ }
return null;
}
// Main game update loop
game.update = function () {