• 29-04-2026, 09:20:18
    #1
    <!DOCTYPE html>
    <html lang="tr">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
        <title>Arrow - Strateji ve Atış Oyunu</title>
        <style>
            * {
                box-sizing: border-box;
                user-select: none;
                -webkit-user-select: none;
            }
            body {
                margin: 0;
                padding: 0;
                background-color: #e6e6e6; 
                display: flex;
                justify-content: center;
                align-items: center;
                height: 100vh;
                overflow: hidden;
                font-family: 'Arial', sans-serif;
                touch-action: none; 
            }
            #gameContainer {
                position: relative;
                width: 100%;
                max-width: 450px;
                height: 100%;
                max-height: 800px;
                background-color: #f4f4f4;
                box-shadow: 0 0 20px rgba(0,0,0,0.2);
            }
            canvas {
                display: block;
                width: 100%;
                height: 100%;
            }
            #ui {
                position: absolute;
                top: 20px;
                left: 20px;
                font-size: 24px;
                font-weight: bold;
                color: #222;
                pointer-events: none;
            }
            #messageBox {
                position: absolute;
                top: 50%;
                left: 50%;
                transform: translate(-50%, -50%);
                text-align: center;
                display: none;
                flex-direction: column;
                align-items: center;
            }
            #messageText {
                font-size: 40px;
                font-weight: bold;
                margin-bottom: 20px;
                text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
            }
            .btn {
                padding: 15px 30px;
                font-size: 20px;
                background-color: #222;
                color: #fff;
                border: none;
                border-radius: 30px;
                cursor: pointer;
                box-shadow: 0 4px 6px rgba(0,0,0,0.3);
                transition: transform 0.1s;
            }
            .btn:active {
                transform: scale(0.95);
            }
        </style>
    </head>
    <body>
    
    <div id="gameContainer">
        <div id="ui">Lv <span id="levelDisplay">1</span>/1200</div>
        <canvas id="gameCanvas"></canvas>
        
        <div id="messageBox">
            <div id="messageText">YANDIN!</div>
            <button class="btn" id="actionBtn">Tekrar Dene</button>
        </div>
    </div>
    
    <script>
        const canvas = document.getElementById('gameCanvas');
        const ctx = canvas.getContext('2d');
        const levelDisplay = document.getElementById('levelDisplay');
        const messageBox = document.getElementById('messageBox');
        const messageText = document.getElementById('messageText');
        const actionBtn = document.getElementById('actionBtn');
    
        // Canvas boyutlandırma
        function resizeCanvas() {
            canvas.width = canvas.parentElement.clientWidth;
            canvas.height = canvas.parentElement.clientHeight;
        }
        window.addEventListener('resize', resizeCanvas);
        resizeCanvas();
    
        // Oyun Değişkenleri
        let level = 1;
        let maxLevel = 1200;
        let gameState = 'START'; // START, PLAYING, GAMEOVER, SUCCESS
        
        // Merkez Hedef (Büyük Top)
        const targetRadius = 50;
        let targetAngle = 0;
        let targetSpeed = 0.02;
        
        // İğneler / Atışlar (Küçük Toplar)
        const pinRadius = 12;
        const pinLineLength = 140; 
        const bulletSpeed = 25;
        
        let pins = []; 
        let bullets = []; 
        let activeBullet = null; 
        let startingBulletsCount = 0;
    
        // Renkler
        const colorBg = '#f4f4f4';
        const colorBlack = '#111';
        const colorFail = '#ff4d4d';
        const colorSuccess = '#4CAF50';
    
        function initLevel() {
            resizeCanvas();
            targetAngle = 0;
            
            // Seviyeye göre zorluk ayarları
            targetSpeed = 0.015 + (level * 0.001); 
            let initialPinsCount = Math.min(2 + Math.floor(level / 4), 10); // Başlangıçta olan iğne sayısı
            
            // Seviyeye göre atılacak mermi sayısını belirle
            startingBulletsCount = Math.min(5 + Math.floor(level / 2), 25); 
            
            // Bazen ters yöne dönsün
            if (level % 3 === 0) targetSpeed *= -1; 
    
            pins = [];
            for (let i = 0; i < initialPinsCount; i++) {
                pins.push({ 
                    angle: (Math.PI * 2 / initialPinsCount) * i,
                    num: '' 
                });
            }
    
            bullets = [];
            for (let i = startingBulletsCount; i > 0; i--) {
                bullets.push(i);
            }
    
            activeBullet = null;
            gameState = 'PLAYING';
            levelDisplay.innerText = level;
            messageBox.style.display = 'none';
        }
    
        function draw() {
            if (gameState === 'GAMEOVER') {
                ctx.fillStyle = colorFail;
            } else if (gameState === 'SUCCESS') {
                ctx.fillStyle = colorSuccess;
            } else {
                ctx.fillStyle = colorBg;
            }
            ctx.fillRect(0, 0, canvas.width, canvas.height);
    
            const cx = canvas.width / 2;
            const cy = canvas.height * 0.35; 
    
            ctx.save();
            ctx.translate(cx, cy);
            ctx.rotate(targetAngle);
    
            // Ekli İğneler
            pins.forEach(pin => {
                const px = Math.cos(pin.angle) * pinLineLength;
                const py = Math.sin(pin.angle) * pinLineLength;
    
                ctx.beginPath();
                ctx.moveTo(0, 0);
                ctx.lineTo(px, py);
                ctx.strokeStyle = colorBlack;
                ctx.lineWidth = 2;
                ctx.stroke();
    
                ctx.beginPath();
                ctx.arc(px, py, pinRadius, 0, Math.PI * 2);
                ctx.fillStyle = colorBlack;
                ctx.fill();
    
                if (pin.num !== '') {
                    ctx.save();
                    ctx.translate(px, py);
                    ctx.rotate(-targetAngle); 
                    ctx.fillStyle = '#fff';
                    ctx.font = '12px Arial';
                    ctx.textAlign = 'center';
                    ctx.textBaseline = 'middle';
                    ctx.fillText(pin.num, 0, 1);
                    ctx.restore();
                }
            });
    
            // Merkez Büyük Hedef
            ctx.beginPath();
            ctx.arc(0, 0, targetRadius, 0, Math.PI * 2);
            ctx.fillStyle = colorBlack;
            ctx.fill();
            
            // *** GÜNCELLEME: Hedef İçindeki Kalan Atış Sayısı ***
            ctx.rotate(-targetAngle); 
            ctx.fillStyle = '#fff';
            
            // Rakamın uzunluğuna göre font boyutunu ayarla (çembere sığması için)
            let fontSize = bullets.length >= 100 ? 35 : 45;
            ctx.font = 'bold ' + fontSize + 'px Arial';
            ctx.textAlign = 'center';
            ctx.textBaseline = 'middle';
            
            // Ekranda kalan mermi sayısını yazdır (havada uçan varsa onu da dahil et)
            let totalRemaining = bullets.length + (activeBullet ? 1 : 0);
            ctx.fillText(totalRemaining, 0, 2);
            ctx.restore();
    
            // Uçan (Aktif) Mermi
            if (activeBullet) {
                ctx.beginPath();
                ctx.moveTo(cx, activeBullet.y);
                ctx.lineTo(cx, activeBullet.y + 20); 
                ctx.strokeStyle = colorBlack;
                ctx.lineWidth = 2;
                ctx.stroke();
    
                ctx.beginPath();
                ctx.arc(cx, activeBullet.y, pinRadius, 0, Math.PI * 2);
                ctx.fillStyle = colorBlack;
                ctx.fill();
    
                ctx.fillStyle = '#fff';
                ctx.font = '12px Arial';
                ctx.textAlign = 'center';
                ctx.textBaseline = 'middle';
                ctx.fillText(activeBullet.num, cx, activeBullet.y + 1);
            }
    
            // Bekleyen Mermiler
            const bulletStartY = canvas.height * 0.75;
            const spacing = pinRadius * 2.5;
    
            for (let i = 0; i < bullets.length; i++) {
                if (i > 5) break; 
                
                const by = bulletStartY + (i * spacing);
                
                ctx.beginPath();
                ctx.arc(cx, by, pinRadius, 0, Math.PI * 2);
                ctx.fillStyle = colorBlack;
                ctx.fill();
    
                ctx.fillStyle = '#fff';
                ctx.font = '12px Arial';
                ctx.textAlign = 'center';
                ctx.textBaseline = 'middle';
                ctx.fillText(bullets[bullets.length - 1 - i], cx, by + 1);
            }
            
            // "Ateş Etmek İçin Dokun" yazısı
            if (gameState === 'PLAYING' && bullets.length === startingBulletsCount && !activeBullet) {
                ctx.fillStyle = 'rgba(0,0,0,0.3)';
                ctx.font = 'bold 22px Arial';
                ctx.textAlign = 'center';
                ctx.fillText('Ateş Etmek İçin Dokun', cx, canvas.height * 0.62);
            }
        }
    
        function update() {
            if (gameState !== 'PLAYING') return;
    
            targetAngle += targetSpeed;
    
            if (activeBullet) {
                activeBullet.y -= bulletSpeed;
                const cy = canvas.height * 0.35;
                
                if (activeBullet.y <= cy + pinLineLength) {
                    let hitAngle = (Math.PI / 2) - targetAngle;
                    hitAngle = (hitAngle % (Math.PI * 2) + Math.PI * 2) % (Math.PI * 2);
    
                    let collision = false;
                    
                    for (let i = 0; i < pins.length; i++) {
                        let pinAngle = pins[i].angle;
                        pinAngle = (pinAngle % (Math.PI * 2) + Math.PI * 2) % (Math.PI * 2);
    
                        let diff = Math.abs(hitAngle - pinAngle);
                        if (diff > Math.PI) diff = Math.PI * 2 - diff;
    
                        let distance = 2 * pinLineLength * Math.sin(diff / 2);
    
                        if (distance < pinRadius * 2 + 2) { 
                            collision = true;
                            break;
                        }
                    }
    
                    if (collision) {
                        gameState = 'GAMEOVER';
                        messageText.innerText = "YANDIN!";
                        messageText.style.color = "#fff";
                        actionBtn.innerText = "Tekrar Dene";
                        setTimeout(() => { messageBox.style.display = 'flex'; }, 300);
                    } else {
                        pins.push({ angle: hitAngle, num: activeBullet.num });
                        activeBullet = null;
                        
                        if (bullets.length === 0) {
                            gameState = 'SUCCESS';
                            messageText.innerText = "HARİKA!";
                            messageText.style.color = "#fff";
                            actionBtn.innerText = "Sonraki Seviye";
                            setTimeout(() => { messageBox.style.display = 'flex'; }, 300);
                        }
                    }
                }
            }
        }
    
        function gameLoop() {
            update();
            draw();
            requestAnimationFrame(gameLoop);
        }
    
        function shoot(e) {
            if (e && e.type === 'touchstart') e.preventDefault();
            
            if (gameState === 'PLAYING' && !activeBullet && bullets.length > 0) {
                const num = bullets.pop(); 
                activeBullet = { 
                    y: canvas.height * 0.75, 
                    num: num 
                };
            }
        }
    
        canvas.addEventListener('mousedown', shoot);
        canvas.addEventListener('touchstart', shoot, { passive: false });
    
        actionBtn.addEventListener('click', () => {
            if (gameState === 'SUCCESS') {
                level++;
                if(level > maxLevel) level = maxLevel; 
            }
            initLevel();
        });
    
        initLevel();
        gameLoop();
    
    </script>
    </body>
    </html>




    Selamlar trend haline gelen o oyunu yapay zeka ile yaptık kodlar yukarıda geliştirmek size kalmış ben daha napam kimse yapmaz kimse vermez iyi forumlar
  • 29-04-2026, 09:26:02
    #2
    Tşkler hocam
  • 29-04-2026, 09:26:40
    #3
    yarcanhack adlı üyeden alıntı: mesajı görüntüle
    Tşkler hocam
    rica ederim iyi forumlar

    koskoca forumda diğerleri gibi alıp gitmeden teşekkür ettiğin için değerli yorumun için ben teşekkür ederim helali hoş olsun
  • 29-04-2026, 09:37:12
    #4
    içinde uygulama yok diye kapanacak bir hesabım var böyle bir şey hesabaı aktif tutar mı ?
  • 29-04-2026, 09:37:50
    #5
    Rayd adlı üyeden alıntı: mesajı görüntüle
    içinde uygulama yok diye kapanacak bir hesabım var böyle bir şey hesabaı aktif tutar mı ?
    bu konuda bilgim yok malesef yanlış bilgi vermek istemem
  • 29-04-2026, 10:08:37
    #6
    Emeğinize sağlık. Teşekkürler
  • 29-04-2026, 10:12:12
    #7
    kazancrehberim adlı üyeden alıntı: mesajı görüntüle
    Emeğinize sağlık. Teşekkürler
    rica ederim iyi forumlar
  • 29-04-2026, 10:28:42
    #8
    Teşekkür ederim hocam
  • 29-04-2026, 10:28:59
    #9
    axen12 adlı üyeden alıntı: mesajı görüntüle
    Teşekkür ederim hocam
    rica ederim iyi forumlar