User prompt
koyulabilecek yerleri 10*10 küçük kareler ayır
User prompt
eeski haline geri dön
User prompt
olduğu bölgeye koyuludun yana kaydırılmasın blok
User prompt
bu kodu geliştir
Code edit (1 edits merged)
Please save this source code
User prompt
Blok Izgara: Sürükle & Yerleştir
Initial prompt
1. Oyun Alanı (Izgara) Tasarımı Tipik olarak 10x10 kareden oluşur (ama değiştirilebilir). Her kareye bir blok yerleşebilir. Boş kareleri ve dolu kareleri izlemek için bir matris (örneğin 2D dizi) kullanılır. 2. Blok Şekilleri Oluşturma Bloklar Tetris benzeri farklı şekillerdedir: Örnek bloklar: Tek kare 1x2, 1x3 dikdörtgenler L, T, Z şekilleri 2x2 kare Her blok şekli, bir 2D matris olarak temsil edilebilir: 3. Blokların Sürüklenip Bırakılması (Drag & Drop) Kullanıcı ekrandaki blokları fare ya da parmakla sürükler. Bırakıldığında, blokun o anki pozisyonunun ızgaraya uygun olup olmadığı kontrol edilir: Tüm parçalar boş karelere denk geliyor mu? Izgarayı taşır mı? 4. Blok Yerleştirme ve Temizleme Blok uygun konuma yerleştirildiyse, ızgaraya işlenir. Ardından satır veya sütun tamamen dolmuşsa temizlenir. Temizlenen her satır/sütun için puan verilir. 5. Oyun Bitti Kontrolü Yeni bloklardan hiçbiri yerleştirilemiyorsa oyun biter.
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// DraggableBlock: Sürüklenebilir blok (ekranın altındaki bloklar)
var DraggableBlock = Container.expand(function () {
var self = Container.call(this);
self.shapeIndex = 0; // BLOCK_SHAPES indexi
self.matrix = null; // 2D array
self.asset = null; // asset adı
self.cells = []; // Çocuk bloklar (Container)
self.isDragging = false;
self.dragOffsetX = 0;
self.dragOffsetY = 0;
self.originX = 0;
self.originY = 0;
// Blok oluştur
self.init = function (shapeIndex) {
self.shapeIndex = shapeIndex;
var shape = BLOCK_SHAPES[shapeIndex];
self.matrix = shape.matrix;
self.asset = shape.asset;
// Önceki hücreleri temizle
for (var i = 0; i < self.cells.length; i++) {
self.cells[i].destroy();
}
self.cells = [];
// Blok hücrelerini oluştur
var rows = self.matrix.length;
var cols = self.matrix[0].length;
for (var r = 0; r < rows; r++) {
for (var c = 0; c < cols; c++) {
if (self.matrix[r][c]) {
var cell = new Container();
var asset = cell.attachAsset(self.asset, {
anchorX: 0.5,
anchorY: 0.5
});
cell.x = c * GRID_CELL_SIZE;
cell.y = r * GRID_CELL_SIZE;
self.addChild(cell);
self.cells.push(cell);
}
}
}
// Blokun merkezini anchor olarak ayarla
self.pivot.x = (cols - 1) * GRID_CELL_SIZE / 2;
self.pivot.y = (rows - 1) * GRID_CELL_SIZE / 2;
self.width = cols * GRID_CELL_SIZE;
self.height = rows * GRID_CELL_SIZE;
};
// Sürükleme başlat
self.startDrag = function (x, y) {
self.isDragging = true;
self.dragOffsetX = x - self.x;
self.dragOffsetY = y - self.y;
self.originX = self.x;
self.originY = self.y;
// Öne getir
if (self.parent) {
self.parent.setChildIndex(self, self.parent.children.length - 1);
}
// Hafif büyüt
tween(self, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 120,
easing: tween.easeOut
});
};
// Sürükleme bitir
self.stopDrag = function () {
self.isDragging = false;
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 120,
easing: tween.easeIn
});
};
// Sürükleme sırasında pozisyon güncelle
self.dragMove = function (x, y) {
if (self.isDragging) {
self.x = x - self.dragOffsetX;
self.y = y - self.dragOffsetY;
}
};
// Orijinal konuma dön
self.returnToOrigin = function () {
tween(self, {
x: self.originX,
y: self.originY
}, {
duration: 180,
easing: tween.easeIn
});
};
return self;
});
/****
* Oyun Sabitleri
****/
// GridCell: Izgara hücresi (arka plan için)
var GridCell = Container.expand(function () {
var self = Container.call(this);
var cell = self.attachAsset('gridCell', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
// PlacedBlock: Izgaraya yerleştirilen blokun bir parçası
var PlacedBlock = Container.expand(function () {
var self = Container.call(this);
// asset ve renk, parametre olarak alınacak
self.init = function (asset) {
self.asset = self.attachAsset(asset, {
anchorX: 0.5,
anchorY: 0.5
});
};
return self;
});
/****
* Initialize Game
****/
// Blokların gösterileceği alt kısım
var game = new LK.Game({
backgroundColor: 0x181c22
});
/****
* Game Code
****/
// Her şekil: {matrix: 2D array, asset: string}
/****
* Blok Şekilleri Tanımı
****/
// Blok şekilleri için renkli kutular ve ızgara hücreleri
// Izgara verisi: 10x10, 0=boş, 1=dolu
var BLOCK_SHAPES = [
// Tekli blok
{
matrix: [[1]],
asset: 'block1'
},
// 1x2 yatay
{
matrix: [[1, 1]],
asset: 'block2'
},
// 1x3 yatay
{
matrix: [[1, 1, 1]],
asset: 'block3'
},
// 2x1 dikey
{
matrix: [[1], [1]],
asset: 'block4'
},
// 3x1 dikey
{
matrix: [[1], [1], [1]],
asset: 'block5'
},
// 2x2 kare
{
matrix: [[1, 1], [1, 1]],
asset: 'block6'
},
// L şekli
{
matrix: [[1, 0], [1, 0], [1, 1]],
asset: 'block7'
},
// T şekli
{
matrix: [[1, 1, 1], [0, 1, 0]],
asset: 'block2'
},
// Z şekli
{
matrix: [[1, 1, 0], [0, 1, 1]],
asset: 'block3'
},
// 1x4 yatay
{
matrix: [[1, 1, 1, 1]],
asset: 'block4'
},
// 4x1 dikey
{
matrix: [[1], [1], [1], [1]],
asset: 'block5'
}];
/****
* Oyun Sabitleri
****/
var GRID_SIZE = 10;
var GRID_CELL_SIZE = 180; // px
var GRID_MARGIN_TOP = 180; // px
var GRID_MARGIN_LEFT = 124; // px (2048-1800)/2
var BLOCK_AREA_Y = 2200;
var grid = [];
for (var i = 0; i < GRID_SIZE; i++) {
grid[i] = [];
for (var j = 0; j < GRID_SIZE; j++) {
grid[i][j] = 0;
}
}
// Izgara hücrelerini çiz
var gridCells = [];
for (var r = 0; r < GRID_SIZE; r++) {
for (var c = 0; c < GRID_SIZE; c++) {
var cell = new GridCell();
cell.x = GRID_MARGIN_LEFT + c * GRID_CELL_SIZE + GRID_CELL_SIZE / 2;
cell.y = GRID_MARGIN_TOP + r * GRID_CELL_SIZE + GRID_CELL_SIZE / 2;
game.addChild(cell);
gridCells.push(cell);
}
}
// Skor göstergesi
var score = 0;
var scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Sürüklenebilir bloklar (en fazla 3 blok)
var draggableBlocks = [];
var BLOCKS_PER_SET = 3;
// Blokları oluştur ve konumlandır
function spawnDraggableBlocks() {
// Öncekileri temizle
for (var i = 0; i < draggableBlocks.length; i++) {
draggableBlocks[i].destroy();
}
draggableBlocks = [];
for (var i = 0; i < BLOCKS_PER_SET; i++) {
var block = new DraggableBlock();
var shapeIndex = Math.floor(Math.random() * BLOCK_SHAPES.length);
block.init(shapeIndex);
// Blokları alt kısımda aralıklı yerleştir
block.x = 400 + i * 420;
block.y = BLOCK_AREA_Y;
block.scaleX = 1;
block.scaleY = 1;
game.addChild(block);
draggableBlocks.push(block);
}
}
// Izgaraya blok yerleştirilebilir mi? (pozisyon, şekil matrisi)
function canPlaceBlockAt(row, col, matrix) {
var rows = matrix.length;
var cols = matrix[0].length;
if (row + rows > GRID_SIZE || col + cols > GRID_SIZE) return false;
for (var r = 0; r < rows; r++) {
for (var c = 0; c < cols; c++) {
if (matrix[r][c]) {
if (grid[row + r][col + c]) return false;
}
}
}
return true;
}
// Blok yerleştir (verilen pozisyon ve şekil)
function placeBlockAt(row, col, matrix, asset) {
var rows = matrix.length;
var cols = matrix[0].length;
for (var r = 0; r < rows; r++) {
for (var c = 0; c < cols; c++) {
if (matrix[r][c]) {
grid[row + r][col + c] = 1;
// Görsel olarak ekle
var pb = new PlacedBlock();
pb.init(asset);
pb.x = GRID_MARGIN_LEFT + (col + c) * GRID_CELL_SIZE + GRID_CELL_SIZE / 2;
pb.y = GRID_MARGIN_TOP + (row + r) * GRID_CELL_SIZE + GRID_CELL_SIZE / 2;
game.addChild(pb);
}
}
}
}
// Satır/sütun temizle ve skor ekle
function clearFullLines() {
var cleared = 0;
// Satırları kontrol et
for (var r = 0; r < GRID_SIZE; r++) {
var full = true;
for (var c = 0; c < GRID_SIZE; c++) {
if (!grid[r][c]) {
full = false;
break;
}
}
if (full) {
cleared++;
for (var c = 0; c < GRID_SIZE; c++) {
grid[r][c] = 0;
// O hücredeki placedblock'u bul ve yok et
removePlacedBlockAt(r, c);
}
}
}
// Sütunları kontrol et
for (var c = 0; c < GRID_SIZE; c++) {
var full = true;
for (var r = 0; r < GRID_SIZE; r++) {
if (!grid[r][c]) {
full = false;
break;
}
}
if (full) {
cleared++;
for (var r = 0; r < GRID_SIZE; r++) {
grid[r][c] = 0;
removePlacedBlockAt(r, c);
}
}
}
if (cleared > 0) {
score += cleared * 10;
scoreTxt.setText(score);
LK.effects.flashObject(scoreTxt, 0xffff00, 400);
}
}
// Izgaradaki bir hücredeki placedblock'u bul ve yok et
function removePlacedBlockAt(row, col) {
var x = GRID_MARGIN_LEFT + col * GRID_CELL_SIZE + GRID_CELL_SIZE / 2;
var y = GRID_MARGIN_TOP + row * GRID_CELL_SIZE + GRID_CELL_SIZE / 2;
// game.children içinde arama
for (var i = game.children.length - 1; i >= 0; i--) {
var obj = game.children[i];
if (obj instanceof PlacedBlock) {
if (Math.abs(obj.x - x) < 2 && Math.abs(obj.y - y) < 2) {
obj.destroy();
break;
}
}
}
}
// Ekrandaki bloklardan biri ızgaraya yerleştirilebiliyor mu?
function anyBlockFits() {
for (var i = 0; i < draggableBlocks.length; i++) {
var block = draggableBlocks[i];
if (!block.parent) continue; // Kullanılmış blok
var matrix = block.matrix;
var rows = matrix.length;
var cols = matrix[0].length;
for (var r = 0; r <= GRID_SIZE - rows; r++) {
for (var c = 0; c <= GRID_SIZE - cols; c++) {
if (canPlaceBlockAt(r, c, matrix)) return true;
}
}
}
return false;
}
// Bloklar bittiğinde yeni set oluştur
function allBlocksUsed() {
for (var i = 0; i < draggableBlocks.length; i++) {
if (draggableBlocks[i].parent) return false;
}
return true;
}
// Sürükleme değişkenleri
var draggingBlock = null;
// Oyun başlat
score = 0;
scoreTxt.setText(score);
spawnDraggableBlocks();
// Oyun hareketleri
game.move = function (x, y, obj) {
// Sürüklenen blok varsa, hareket ettir
if (draggingBlock) {
draggingBlock.dragMove(x, y);
}
};
game.down = function (x, y, obj) {
// Bloklardan birine tıklandı mı?
for (var i = 0; i < draggableBlocks.length; i++) {
var block = draggableBlocks[i];
if (!block.parent) continue;
// Blok sınırları içinde mi?
var local = block.toLocal(game.toGlobal({
x: x,
y: y
}));
// Blokun alanı içinde mi?
if (local.x >= -block.pivot.x && local.x <= block.width - block.pivot.x && local.y >= -block.pivot.y && local.y <= block.height - block.pivot.y) {
draggingBlock = block;
block.startDrag(x, y);
break;
}
}
};
game.up = function (x, y, obj) {
if (!draggingBlock) return;
// Bırakılan pozisyonu ızgaraya çevir
var block = draggingBlock;
var matrix = block.matrix;
var rows = matrix.length;
var cols = matrix[0].length;
// Blokun merkezini referans al
var gridX = Math.round((block.x + block.pivot.x - GRID_MARGIN_LEFT - GRID_CELL_SIZE / 2) / GRID_CELL_SIZE);
var gridY = Math.round((block.y + block.pivot.y - GRID_MARGIN_TOP - GRID_CELL_SIZE / 2) / GRID_CELL_SIZE);
// Yerleştirilebilir mi?
if (canPlaceBlockAt(gridY, gridX, matrix)) {
// Yerleştir
placeBlockAt(gridY, gridX, matrix, block.asset);
block.destroy();
draggingBlock = null;
clearFullLines();
// Tüm bloklar kullanıldıysa yeni set oluştur
if (allBlocksUsed()) {
spawnDraggableBlocks();
}
// Oyun bitti mi?
if (!anyBlockFits()) {
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
}
} else {
// Yerleştirilemezse orijinal konuma dön
block.returnToOrigin();
block.stopDrag();
draggingBlock = null;
}
};
// Oyun güncellemesi (gerektiğinde)
game.update = function () {
// Oyun bitti mi? (her frame kontrol)
if (!anyBlockFits()) {
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,446 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+// DraggableBlock: Sürüklenebilir blok (ekranın altındaki bloklar)
+var DraggableBlock = Container.expand(function () {
+ var self = Container.call(this);
+ self.shapeIndex = 0; // BLOCK_SHAPES indexi
+ self.matrix = null; // 2D array
+ self.asset = null; // asset adı
+ self.cells = []; // Çocuk bloklar (Container)
+ self.isDragging = false;
+ self.dragOffsetX = 0;
+ self.dragOffsetY = 0;
+ self.originX = 0;
+ self.originY = 0;
+ // Blok oluştur
+ self.init = function (shapeIndex) {
+ self.shapeIndex = shapeIndex;
+ var shape = BLOCK_SHAPES[shapeIndex];
+ self.matrix = shape.matrix;
+ self.asset = shape.asset;
+ // Önceki hücreleri temizle
+ for (var i = 0; i < self.cells.length; i++) {
+ self.cells[i].destroy();
+ }
+ self.cells = [];
+ // Blok hücrelerini oluştur
+ var rows = self.matrix.length;
+ var cols = self.matrix[0].length;
+ for (var r = 0; r < rows; r++) {
+ for (var c = 0; c < cols; c++) {
+ if (self.matrix[r][c]) {
+ var cell = new Container();
+ var asset = cell.attachAsset(self.asset, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ cell.x = c * GRID_CELL_SIZE;
+ cell.y = r * GRID_CELL_SIZE;
+ self.addChild(cell);
+ self.cells.push(cell);
+ }
+ }
+ }
+ // Blokun merkezini anchor olarak ayarla
+ self.pivot.x = (cols - 1) * GRID_CELL_SIZE / 2;
+ self.pivot.y = (rows - 1) * GRID_CELL_SIZE / 2;
+ self.width = cols * GRID_CELL_SIZE;
+ self.height = rows * GRID_CELL_SIZE;
+ };
+ // Sürükleme başlat
+ self.startDrag = function (x, y) {
+ self.isDragging = true;
+ self.dragOffsetX = x - self.x;
+ self.dragOffsetY = y - self.y;
+ self.originX = self.x;
+ self.originY = self.y;
+ // Öne getir
+ if (self.parent) {
+ self.parent.setChildIndex(self, self.parent.children.length - 1);
+ }
+ // Hafif büyüt
+ tween(self, {
+ scaleX: 1.1,
+ scaleY: 1.1
+ }, {
+ duration: 120,
+ easing: tween.easeOut
+ });
+ };
+ // Sürükleme bitir
+ self.stopDrag = function () {
+ self.isDragging = false;
+ tween(self, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 120,
+ easing: tween.easeIn
+ });
+ };
+ // Sürükleme sırasında pozisyon güncelle
+ self.dragMove = function (x, y) {
+ if (self.isDragging) {
+ self.x = x - self.dragOffsetX;
+ self.y = y - self.dragOffsetY;
+ }
+ };
+ // Orijinal konuma dön
+ self.returnToOrigin = function () {
+ tween(self, {
+ x: self.originX,
+ y: self.originY
+ }, {
+ duration: 180,
+ easing: tween.easeIn
+ });
+ };
+ return self;
+});
+/****
+* Oyun Sabitleri
+****/
+// GridCell: Izgara hücresi (arka plan için)
+var GridCell = Container.expand(function () {
+ var self = Container.call(this);
+ var cell = self.attachAsset('gridCell', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ return self;
+});
+// PlacedBlock: Izgaraya yerleştirilen blokun bir parçası
+var PlacedBlock = Container.expand(function () {
+ var self = Container.call(this);
+ // asset ve renk, parametre olarak alınacak
+ self.init = function (asset) {
+ self.asset = self.attachAsset(asset, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
+// Blokların gösterileceği alt kısım
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x181c22
+});
+
+/****
+* Game Code
+****/
+// Her şekil: {matrix: 2D array, asset: string}
+/****
+* Blok Şekilleri Tanımı
+****/
+// Blok şekilleri için renkli kutular ve ızgara hücreleri
+// Izgara verisi: 10x10, 0=boş, 1=dolu
+var BLOCK_SHAPES = [
+// Tekli blok
+{
+ matrix: [[1]],
+ asset: 'block1'
+},
+// 1x2 yatay
+{
+ matrix: [[1, 1]],
+ asset: 'block2'
+},
+// 1x3 yatay
+{
+ matrix: [[1, 1, 1]],
+ asset: 'block3'
+},
+// 2x1 dikey
+{
+ matrix: [[1], [1]],
+ asset: 'block4'
+},
+// 3x1 dikey
+{
+ matrix: [[1], [1], [1]],
+ asset: 'block5'
+},
+// 2x2 kare
+{
+ matrix: [[1, 1], [1, 1]],
+ asset: 'block6'
+},
+// L şekli
+{
+ matrix: [[1, 0], [1, 0], [1, 1]],
+ asset: 'block7'
+},
+// T şekli
+{
+ matrix: [[1, 1, 1], [0, 1, 0]],
+ asset: 'block2'
+},
+// Z şekli
+{
+ matrix: [[1, 1, 0], [0, 1, 1]],
+ asset: 'block3'
+},
+// 1x4 yatay
+{
+ matrix: [[1, 1, 1, 1]],
+ asset: 'block4'
+},
+// 4x1 dikey
+{
+ matrix: [[1], [1], [1], [1]],
+ asset: 'block5'
+}];
+/****
+* Oyun Sabitleri
+****/
+var GRID_SIZE = 10;
+var GRID_CELL_SIZE = 180; // px
+var GRID_MARGIN_TOP = 180; // px
+var GRID_MARGIN_LEFT = 124; // px (2048-1800)/2
+var BLOCK_AREA_Y = 2200;
+var grid = [];
+for (var i = 0; i < GRID_SIZE; i++) {
+ grid[i] = [];
+ for (var j = 0; j < GRID_SIZE; j++) {
+ grid[i][j] = 0;
+ }
+}
+// Izgara hücrelerini çiz
+var gridCells = [];
+for (var r = 0; r < GRID_SIZE; r++) {
+ for (var c = 0; c < GRID_SIZE; c++) {
+ var cell = new GridCell();
+ cell.x = GRID_MARGIN_LEFT + c * GRID_CELL_SIZE + GRID_CELL_SIZE / 2;
+ cell.y = GRID_MARGIN_TOP + r * GRID_CELL_SIZE + GRID_CELL_SIZE / 2;
+ game.addChild(cell);
+ gridCells.push(cell);
+ }
+}
+// Skor göstergesi
+var score = 0;
+var scoreTxt = new Text2('0', {
+ size: 120,
+ fill: "#fff"
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// Sürüklenebilir bloklar (en fazla 3 blok)
+var draggableBlocks = [];
+var BLOCKS_PER_SET = 3;
+// Blokları oluştur ve konumlandır
+function spawnDraggableBlocks() {
+ // Öncekileri temizle
+ for (var i = 0; i < draggableBlocks.length; i++) {
+ draggableBlocks[i].destroy();
+ }
+ draggableBlocks = [];
+ for (var i = 0; i < BLOCKS_PER_SET; i++) {
+ var block = new DraggableBlock();
+ var shapeIndex = Math.floor(Math.random() * BLOCK_SHAPES.length);
+ block.init(shapeIndex);
+ // Blokları alt kısımda aralıklı yerleştir
+ block.x = 400 + i * 420;
+ block.y = BLOCK_AREA_Y;
+ block.scaleX = 1;
+ block.scaleY = 1;
+ game.addChild(block);
+ draggableBlocks.push(block);
+ }
+}
+// Izgaraya blok yerleştirilebilir mi? (pozisyon, şekil matrisi)
+function canPlaceBlockAt(row, col, matrix) {
+ var rows = matrix.length;
+ var cols = matrix[0].length;
+ if (row + rows > GRID_SIZE || col + cols > GRID_SIZE) return false;
+ for (var r = 0; r < rows; r++) {
+ for (var c = 0; c < cols; c++) {
+ if (matrix[r][c]) {
+ if (grid[row + r][col + c]) return false;
+ }
+ }
+ }
+ return true;
+}
+// Blok yerleştir (verilen pozisyon ve şekil)
+function placeBlockAt(row, col, matrix, asset) {
+ var rows = matrix.length;
+ var cols = matrix[0].length;
+ for (var r = 0; r < rows; r++) {
+ for (var c = 0; c < cols; c++) {
+ if (matrix[r][c]) {
+ grid[row + r][col + c] = 1;
+ // Görsel olarak ekle
+ var pb = new PlacedBlock();
+ pb.init(asset);
+ pb.x = GRID_MARGIN_LEFT + (col + c) * GRID_CELL_SIZE + GRID_CELL_SIZE / 2;
+ pb.y = GRID_MARGIN_TOP + (row + r) * GRID_CELL_SIZE + GRID_CELL_SIZE / 2;
+ game.addChild(pb);
+ }
+ }
+ }
+}
+// Satır/sütun temizle ve skor ekle
+function clearFullLines() {
+ var cleared = 0;
+ // Satırları kontrol et
+ for (var r = 0; r < GRID_SIZE; r++) {
+ var full = true;
+ for (var c = 0; c < GRID_SIZE; c++) {
+ if (!grid[r][c]) {
+ full = false;
+ break;
+ }
+ }
+ if (full) {
+ cleared++;
+ for (var c = 0; c < GRID_SIZE; c++) {
+ grid[r][c] = 0;
+ // O hücredeki placedblock'u bul ve yok et
+ removePlacedBlockAt(r, c);
+ }
+ }
+ }
+ // Sütunları kontrol et
+ for (var c = 0; c < GRID_SIZE; c++) {
+ var full = true;
+ for (var r = 0; r < GRID_SIZE; r++) {
+ if (!grid[r][c]) {
+ full = false;
+ break;
+ }
+ }
+ if (full) {
+ cleared++;
+ for (var r = 0; r < GRID_SIZE; r++) {
+ grid[r][c] = 0;
+ removePlacedBlockAt(r, c);
+ }
+ }
+ }
+ if (cleared > 0) {
+ score += cleared * 10;
+ scoreTxt.setText(score);
+ LK.effects.flashObject(scoreTxt, 0xffff00, 400);
+ }
+}
+// Izgaradaki bir hücredeki placedblock'u bul ve yok et
+function removePlacedBlockAt(row, col) {
+ var x = GRID_MARGIN_LEFT + col * GRID_CELL_SIZE + GRID_CELL_SIZE / 2;
+ var y = GRID_MARGIN_TOP + row * GRID_CELL_SIZE + GRID_CELL_SIZE / 2;
+ // game.children içinde arama
+ for (var i = game.children.length - 1; i >= 0; i--) {
+ var obj = game.children[i];
+ if (obj instanceof PlacedBlock) {
+ if (Math.abs(obj.x - x) < 2 && Math.abs(obj.y - y) < 2) {
+ obj.destroy();
+ break;
+ }
+ }
+ }
+}
+// Ekrandaki bloklardan biri ızgaraya yerleştirilebiliyor mu?
+function anyBlockFits() {
+ for (var i = 0; i < draggableBlocks.length; i++) {
+ var block = draggableBlocks[i];
+ if (!block.parent) continue; // Kullanılmış blok
+ var matrix = block.matrix;
+ var rows = matrix.length;
+ var cols = matrix[0].length;
+ for (var r = 0; r <= GRID_SIZE - rows; r++) {
+ for (var c = 0; c <= GRID_SIZE - cols; c++) {
+ if (canPlaceBlockAt(r, c, matrix)) return true;
+ }
+ }
+ }
+ return false;
+}
+// Bloklar bittiğinde yeni set oluştur
+function allBlocksUsed() {
+ for (var i = 0; i < draggableBlocks.length; i++) {
+ if (draggableBlocks[i].parent) return false;
+ }
+ return true;
+}
+// Sürükleme değişkenleri
+var draggingBlock = null;
+// Oyun başlat
+score = 0;
+scoreTxt.setText(score);
+spawnDraggableBlocks();
+// Oyun hareketleri
+game.move = function (x, y, obj) {
+ // Sürüklenen blok varsa, hareket ettir
+ if (draggingBlock) {
+ draggingBlock.dragMove(x, y);
+ }
+};
+game.down = function (x, y, obj) {
+ // Bloklardan birine tıklandı mı?
+ for (var i = 0; i < draggableBlocks.length; i++) {
+ var block = draggableBlocks[i];
+ if (!block.parent) continue;
+ // Blok sınırları içinde mi?
+ var local = block.toLocal(game.toGlobal({
+ x: x,
+ y: y
+ }));
+ // Blokun alanı içinde mi?
+ if (local.x >= -block.pivot.x && local.x <= block.width - block.pivot.x && local.y >= -block.pivot.y && local.y <= block.height - block.pivot.y) {
+ draggingBlock = block;
+ block.startDrag(x, y);
+ break;
+ }
+ }
+};
+game.up = function (x, y, obj) {
+ if (!draggingBlock) return;
+ // Bırakılan pozisyonu ızgaraya çevir
+ var block = draggingBlock;
+ var matrix = block.matrix;
+ var rows = matrix.length;
+ var cols = matrix[0].length;
+ // Blokun merkezini referans al
+ var gridX = Math.round((block.x + block.pivot.x - GRID_MARGIN_LEFT - GRID_CELL_SIZE / 2) / GRID_CELL_SIZE);
+ var gridY = Math.round((block.y + block.pivot.y - GRID_MARGIN_TOP - GRID_CELL_SIZE / 2) / GRID_CELL_SIZE);
+ // Yerleştirilebilir mi?
+ if (canPlaceBlockAt(gridY, gridX, matrix)) {
+ // Yerleştir
+ placeBlockAt(gridY, gridX, matrix, block.asset);
+ block.destroy();
+ draggingBlock = null;
+ clearFullLines();
+ // Tüm bloklar kullanıldıysa yeni set oluştur
+ if (allBlocksUsed()) {
+ spawnDraggableBlocks();
+ }
+ // Oyun bitti mi?
+ if (!anyBlockFits()) {
+ LK.effects.flashScreen(0xff0000, 800);
+ LK.showGameOver();
+ }
+ } else {
+ // Yerleştirilemezse orijinal konuma dön
+ block.returnToOrigin();
+ block.stopDrag();
+ draggingBlock = null;
+ }
+};
+// Oyun güncellemesi (gerektiğinde)
+game.update = function () {
+ // Oyun bitti mi? (her frame kontrol)
+ if (!anyBlockFits()) {
+ LK.effects.flashScreen(0xff0000, 800);
+ LK.showGameOver();
+ }
+};
\ No newline at end of file