L’Agora joue avec l’IA

Répondre
Partager Rechercher
Citation :
Publié par Airmed / Ildefonse
Ouvre un bouquin de programmation puis revient causé

1/ le moteur n'est pas graphique. L'affichage est dissocié du moteur
2 & 4/ J'ai écrit array[4x4] et non array[4][4]
3/ le test c'est de compte le nombre de ligne et si nombre de ligne >= 1 alors on a lance la fonciton de gestion de ligne

4/ la fonction de deplacement de bloc n'a rien à voir avec la fonction d'affichage. Comme tout le moteur du jeu en faite. C'est évident pour n'importe quel dev.
Donc tu peux faire un affichage dans le sens que tu veux, il y a juste la fonction d'affichage à modifier. Et pour inversion, c'est bien - au lieu de +



Et bien écoute cest très facile à démontrer :

Tu as le html complet, pourquoi ne pas monter comment tu appliques ces points concrètement ?

Ça devrait te prendre 2mn.

Ou même from stcratch ? Après tout ça a l'air hyper facile, le Web regorge d'exemples.

Tu vas sans doute faire mieux que ce nul de Claude 4 opus.
Citation :
Publié par Ex-voto
Je suis très étonné des réponses de RonJdu type "imagine si je mets 30 pages de spec, ce que l'IA pourra faire"

Est-ce qu'on a des études montrant que la qualité d'un projet informatique généré par une IA s'améliore avec la qualité du prompt ? Je pense qu'avant même les limites en token, il n'y aura pas d'amélioration.
La limite ça serait l'incapacité des PM à faire des spécifications claires.

De toutes façons c'est impossible d'avoir un projet clair, parfaitement stipulé, et stable dans le temps. Les projets changent tout le temps et une IA n'est pas capable de gérer ça.
Citation :
Publié par Axoulotl08
Argh.
A ce niveau de méconnaissance du sujet je penses que tu devrais te taire...
Justement. Cest le but du topic : un néophyte complet peut créer un petit jeu.

Et sinon, cest bien un html, tu cliques sur le lien et tu affiches le code :

https://claude.ai/public/artifacts/c...5-1244619a835d

Cest du html qui s'exécute dans ton navigateur.

Citation :
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Tetris 3D Pro</title>
<style>
body {
margin: 0;
padding: 0;
background: #000;
color: #fff;
font-family: Arial, sans-serif;
overflow: hidden;
}

#gameContainer {
position: relative;
width: 100vw;
height: 100vh;
}

.controls {
position: absolute;
top: 20px;
right: 20px;
background: rgba(0, 0, 0, 0.8);
padding: 20px;
border-radius: 10px;
min-width: 250px;
border: 2px solid #0ff;
box-shadow: 0 0 20px rgba(0, 255, 255, 0.5);
}

.controls h3 {
margin-top: 0;
color: #0ff;
text-shadow: 0 0 10px #0ff;
}

button {
background: #0ff;
color: #000;
border: none;
padding: 10px 15px;
cursor: pointer;
border-radius: 5px;
font-weight: bold;
margin: 5px 0;
width: 100%;
transition: all 0.3s;
}

etc etc...

</script>
</body>
</html>
Citation :
Publié par kéwa
En ayant des attentes beaucoup plus raisonnables. Combien de temps il faut compter à un dev pour structurer quelque chose d'équivalent à ce qu'a donné le LLM ?
Créer les fichiers, les nommer, mettre quelques variables, api, fonctions etc. Est-ce plus efficient et ou qualitatif qu'un dev sur un IDE dopé avec des outils de complétions/autres ?
C'est une excellente question, et je renvoie à une vidéo de NeetCode pour en avoir la réponse:


En résumé: il ne peut exister aucun gain de temps quand le résultat n'est pas utilisable comme base et doit être jeté.

Une suite plus détaillée:


Les LLMs ne sont vraiment utiles en ce moment que pour des Senior Devs expérimentés. Je m'en sers absolument tous les jours, c'est pratique, ça me fait sauver du temps, exemple d'usages:

- Générer des tests unitaires pour une fonction: ça marche plus ou moins bien, souvent c'est à côté de la plaque. Mais après avoir crafté un prompt très précis j'ai au moins une structure répétable et modifiable avec la syntaxe que je veux
- Générer des fichiers de configuration genre docker
- Générer des squelettes
- Pointer vers des solutions techniques ou des améliorations de complexité


Citation :
Faut réaliser qu'en tout et pour tout, pour obtenir ça, j'ai utilisé quelques prompts, suite aux remarques de Airmed.
Il aurait été à côté de moi, on obtenait ça en moins de 10 minutes.
J'adore

Si j'avais un Senior Dev à côté de moi, on coderait vite

CQFD: Les LLMs actuels ne servent à rien sans une personne d'expérience. C'est un outil qui nous accélère.


Sinon j'ai déjà codé un tétris pour m'amuser (en vrai non: pour tester l’entraînement par renforcement après m'être fait viré et être en garden leave). Pour vrai c'est fucking compliqué quand les maths sont loins derrières et qu'on n'a jamais fait de JV. Par contre ça m'a pris 2h avec Unity. Je n'ai pas fait les assets évidement.

Dernière modification par Cpasmoi ; 31/05/2025 à 15h33.
Citation :
Publié par Cpasmoi
Sinon j'ai déjà codé un tétris pour m'amuser (en vrai non: pour tester l’entraînement par renforcement après m'être fait viré et être en garden leave). Pour vrai c'est fucking compliqué quand les maths sont loins derrières et qu'on n'a jamais fait de JV. Par contre ça m'a pris 2h avec Unity. Je n'ai pas fait les assets évidement.
Mais non, ça prend 2mn d'après des non codeurs de J0L.

Il feraient mieux que Claude et plus vite.
Citation :
Publié par Ron Jack Auboulot
Et bien écoute cest très facile à démontrer :
1/ le code n'est pas accessible.
2/ je parle de vrai code, pas un truc aleatoire pondu par une IA qui ne sait pas ce qu'elle fait.
3/ Je savais pas que les .html géraient le scripting, C'est une nouvelle norme ?
Citation :
Publié par Airmed / Ildefonse
1/ le code n'est pas accessible.
Bien sur que si : tu te connectes avec Google et tu as juste à afficher le code qui nest rien d'autre qu'un fichier html. Cest un lien public.
Citation :
Publié par Ron Jack Auboulot
Bien sur que si : tu te connectes avec Google et tu as juste à afficher le code qui nest rien d'autre qu'un fichier html. Cest un lien public.
Je me connecte avec rien du tout, j'ai pas envie d'être associé ou que mon compte apparaisse

Balance le code ici, je sens qu'on va rigoler =)
Parce que bon, le résumé c'est :
"J'ai fait un code de ouf avec une IA qui y capte que dalle et qui ne marche pas, tu veux pas le modifier ?"

J'en ai déjà vu passer un sacré paquet

(ou balance plutot sur https://pastebin.com/)

Dernière modification par Airmed / Ildefonse ; 31/05/2025 à 16h00.
Citation :
Publié par Airmed / Ildefonse
Je me connecte avec rien du tout, j'ai pas envie d'être associé ou que mon compte apparaisse

Balance le code ici, je sens qu'on va rigoler =)
Parce que bon, le résumé c'est :
"J'ai fait un code de ouf avec une IA qui y capte que dalle et qui ne marche pas, tu veux pas le modifier ?"

J'en ai déjà vu passer un sacré paquet
Associé de quoi ? Tu crains d'avoir un compte Google sur Anthropic ?

Code:
<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Tetris 3D Pro</title>
    <style>
        body {
            margin: 0;
            padding: 0;
            background: #000;
            color: #fff;
            font-family: Arial, sans-serif;
            overflow: hidden;
        }

        #gameContainer {
            position: relative;
            width: 100vw;
            height: 100vh;
        }

        .controls {
            position: absolute;
            top: 20px;
            right: 20px;
            background: rgba(0, 0, 0, 0.8);
            padding: 20px;
            border-radius: 10px;
            min-width: 250px;
            border: 2px solid #0ff;
            box-shadow: 0 0 20px rgba(0, 255, 255, 0.5);
        }

        .controls h3 {
            margin-top: 0;
            color: #0ff;
            text-shadow: 0 0 10px #0ff;
        }

        button {
            background: #0ff;
            color: #000;
            border: none;
            padding: 10px 15px;
            cursor: pointer;
            border-radius: 5px;
            font-weight: bold;
            margin: 5px 0;
            width: 100%;
            transition: all 0.3s;
        }

        button:hover {
            background: #fff;
            transform: scale(1.05);
        }

        .score-display {
            font-size: 20px;
            margin: 10px 0;
            color: #0ff;
        }

        .controls-info {
            background: rgba(51, 51, 51, 0.8);
            padding: 10px;
            border-radius: 5px;
            margin-top: 20px;
            font-size: 14px;
        }

        .controls-info kbd {
            background: #555;
            padding: 2px 5px;
            border-radius: 3px;
            margin: 0 2px;
        }

        #loadingScreen {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background: #000;
            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: center;
            z-index: 1000;
        }

        .loader {
            border: 5px solid #333;
            border-top: 5px solid #0ff;
            border-radius: 50%;
            width: 50px;
            height: 50px;
            animation: spin 1s linear infinite;
        }

        @keyframes spin {
            0% { transform: rotate(0deg); }
            100% { transform: rotate(360deg); }
        }
    </style>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
</head>
<body>
    <div id="gameContainer">
        <div id="loadingScreen">
            <div class="loader"></div>
            <p>Chargement du jeu...</p>
        </div>
        
        <div class="controls">
            <h3>Tetris 3D Pro</h3>
            <div class="score-display">
                Score: <span id="score">0</span><br>
                Lignes: <span id="lines">0</span><br>
                Niveau: <span id="level">1</span>
            </div>
            
            <button onclick="togglePause()">Pause</button>
            <button onclick="resetGame()">Nouveau Jeu</button>
            
            <div class="controls-info">
                <strong>Contrôles:</strong><br>
                <kbd>←</kbd> <kbd>→</kbd> Déplacer<br>
                <kbd>↑</kbd> Rotation<br>
                <kbd>↓</kbd> Descente rapide<br>
                <kbd>Espace</kbd> Chute instantanée<br>
                <kbd>P</kbd> Pause
            </div>
        </div>
    </div>

    <script>
        // Configuration
        const COLS = 10;
        const ROWS = 20;
        const BLOCK_SIZE = 1;
        
        // Variables
        let scene, camera, renderer;
        let gameGroup;
        let board = [];
        let currentPiece = null;
        let score = 0;
        let lines = 0;
        let level = 1;
        let dropCounter = 0;
        let lastTime = 0;
        let paused = false;
        
        // Textures
        let textures = [];
        
        // Pièces Tetris
        const pieces = {
            I: {
                shape: [[1,1,1,1]],
                rotationStates: [
                    [[1,1,1,1]],
                    [[1],[1],[1],[1]],
                    [[1,1,1,1]],
                    [[1],[1],[1],[1]]
                ],
                color: 0x00ffff
            },
            O: {
                shape: [[1,1],[1,1]],
                rotationStates: [
                    [[1,1],[1,1]],
                    [[1,1],[1,1]],
                    [[1,1],[1,1]],
                    [[1,1],[1,1]]
                ],
                color: 0xffff00
            },
            T: {
                shape: [[0,1,0],[1,1,1]],
                rotationStates: [
                    [[0,1,0],[1,1,1]],
                    [[1,0],[1,1],[1,0]],
                    [[1,1,1],[0,1,0]],
                    [[0,1],[1,1],[0,1]]
                ],
                color: 0xff00ff
            },
            S: {
                shape: [[0,1,1],[1,1,0]],
                rotationStates: [
                    [[0,1,1],[1,1,0]],
                    [[1,0],[1,1],[0,1]],
                    [[0,1,1],[1,1,0]],
                    [[1,0],[1,1],[0,1]]
                ],
                color: 0x00ff00
            },
            Z: {
                shape: [[1,1,0],[0,1,1]],
                rotationStates: [
                    [[1,1,0],[0,1,1]],
                    [[0,1],[1,1],[1,0]],
                    [[1,1,0],[0,1,1]],
                    [[0,1],[1,1],[1,0]]
                ],
                color: 0xff0000
            },
            J: {
                shape: [[1,0,0],[1,1,1]],
                rotationStates: [
                    [[1,0,0],[1,1,1]],
                    [[1,1],[1,0],[1,0]],
                    [[1,1,1],[0,0,1]],
                    [[0,1],[0,1],[1,1]]
                ],
                color: 0x0000ff
            },
            L: {
                shape: [[0,0,1],[1,1,1]],
                rotationStates: [
                    [[0,0,1],[1,1,1]],
                    [[1,0],[1,0],[1,1]],
                    [[1,1,1],[1,0,0]],
                    [[1,1],[0,1],[0,1]]
                ],
                color: 0xffa500
            }
        };
        
        class TetrisPiece {
            constructor() {
                const types = 'IOTSZJL';
                this.type = types[Math.floor(Math.random() * types.length)];
                this.rotationState = 0;
                this.matrix = pieces[this.type].shape.map(row => [...row]);
                this.x = Math.floor((COLS - this.matrix[0].length) / 2);
                this.y = 0;
                this.mesh = new THREE.Group();
                this.blocks = [];
                this.pieceColor = pieces[this.type].color;
                this.pieceFaceIndices = this.generatePieceFaceIndices();
                this.createMesh();
            }
            
            generatePieceFaceIndices() {
                const maxBlocks = 9;
                const indices = [];
                for (let i = 0; i < maxBlocks; i++) {
                    indices.push(Array(6).fill().map(() => 
                        Math.floor(Math.random() * textures.length)
                    ));
                }
                return indices;
            }
            
            createMesh() {
                this.mesh.clear();
                this.blocks = [];
                
                let blockIndex = 0;
                for (let y = 0; y < this.matrix.length; y++) {
                    this.blocks[y] = [];
                    for (let x = 0; x < this.matrix[y].length; x++) {
                        if (this.matrix[y][x]) {
                            const block = this.createCubeWithSpecificFaces(this.pieceFaceIndices[blockIndex]);
                            block.position.set(x * BLOCK_SIZE, -y * BLOCK_SIZE, 0);
                            this.mesh.add(block);
                            this.blocks[y][x] = block;
                            blockIndex++;
                        }
                    }
                }
                
                this.updatePosition();
            }
            
            createCubeWithSpecificFaces(faceIndices) {
                const geometry = new THREE.BoxGeometry(BLOCK_SIZE * 0.95, BLOCK_SIZE * 0.95, BLOCK_SIZE * 0.95);
                const materials = [];
                
                for (let i = 0; i < 6; i++) {
                    materials.push(new THREE.MeshPhongMaterial({ 
                        map: textures[faceIndices[i]],
                        color: this.pieceColor,
                        emissive: this.pieceColor,
                        emissiveIntensity: 0.2
                    }));
                }
                
                const cube = new THREE.Mesh(geometry, materials);
                
                const edges = new THREE.EdgesGeometry(geometry);
                const line = new THREE.LineSegments(edges, new THREE.LineBasicMaterial({ color: 0x000000 }));
                cube.add(line);
                
                return cube;
            }
            
            updatePosition() {
                this.mesh.position.set(
                    (this.x - COLS/2 + 0.5) * BLOCK_SIZE,
                    (ROWS/2 - this.y - 0.5) * BLOCK_SIZE,
                    0
                );
            }
            
            rotate() {
                const nextRotationState = (this.rotationState + 1) % 4;
                const nextMatrix = pieces[this.type].rotationStates[nextRotationState];
                
                const oldMatrix = this.matrix;
                const oldRotationState = this.rotationState;
                
                this.matrix = nextMatrix.map(row => [...row]);
                this.rotationState = nextRotationState;
                
                if (this.isValidPosition()) {
                    this.createMesh();
                    return true;
                }
                
                this.matrix = oldMatrix;
                this.rotationState = oldRotationState;
                return false;
            }
            
            isValidPosition(dx = 0, dy = 0) {
                for (let y = 0; y < this.matrix.length; y++) {
                    for (let x = 0; x < this.matrix[y].length; x++) {
                        if (this.matrix[y][x]) {
                            const newX = this.x + x + dx;
                            const newY = this.y + y + dy;
                            
                            if (newX < 0 || newX >= COLS || newY >= ROWS) {
                                return false;
                            }
                            
                            if (newY >= 0 && board[newY] && board[newY][newX]) {
                                return false;
                            }
                        }
                    }
                }
                return true;
            }
            
            move(dx, dy) {
                if (this.isValidPosition(dx, dy)) {
                    this.x += dx;
                    this.y += dy;
                    this.updatePosition();
                    return true;
                }
                return false;
            }
        }
        
        function init() {
            scene = new THREE.Scene();
            scene.background = new THREE.Color(0x000000);
            
            camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 0.1, 1000);
            camera.position.set(0, 0, 25);
            camera.lookAt(0, 0, 0);
            
            renderer = new THREE.WebGLRenderer({ antialias: true });
            renderer.setSize(window.innerWidth, window.innerHeight);
            document.getElementById('gameContainer').appendChild(renderer.domElement);
            
            const ambientLight = new THREE.AmbientLight(0xffffff, 0.6);
            scene.add(ambientLight);
            
            const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);
            directionalLight.position.set(10, 20, 10);
            scene.add(directionalLight);
            
            gameGroup = new THREE.Group();
            scene.add(gameGroup);
            
            createGameBoard();
            board = Array(ROWS).fill().map(() => Array(COLS).fill(null));
            
            loadTextures();
            
            window.addEventListener('resize', onWindowResize);
            document.addEventListener('keydown', onKeyDown);
            
            document.getElementById('loadingScreen').style.display = 'none';
        }
        
        function loadTextures() {
            // Créer 5 textures colorées
            for (let i = 0; i < 5; i++) {
                const canvas = document.createElement('canvas');
                canvas.width = 64;
                canvas.height = 64;
                const ctx = canvas.getContext('2d');
                
                const gradient = ctx.createLinearGradient(0, 0, 64, 64);
                gradient.addColorStop(0, `hsl(${i * 72}, 70%, 40%)`);
                gradient.addColorStop(1, `hsl(${i * 72}, 100%, 60%)`);
                
                ctx.fillStyle = gradient;
                ctx.fillRect(0, 0, 64, 64);
                
                ctx.fillStyle = '#fff';
                ctx.font = 'bold 32px Arial';
                ctx.textAlign = 'center';
                ctx.textBaseline = 'middle';
                ctx.fillText(i + 1, 32, 32);
                
                textures[i] = new THREE.CanvasTexture(canvas);
            }
            
            startGame();
        }
        
        function createGameBoard() {
            const borderMaterial = new THREE.MeshPhongMaterial({ color: 0x00ffff });
            const borderThickness = 0.2;
            
            const leftBorder = new THREE.Mesh(
                new THREE.BoxGeometry(borderThickness, ROWS * BLOCK_SIZE, 2),
                borderMaterial
            );
            leftBorder.position.x = -COLS * BLOCK_SIZE / 2 - borderThickness / 2;
            gameGroup.add(leftBorder);
            
            const rightBorder = new THREE.Mesh(
                new THREE.BoxGeometry(borderThickness, ROWS * BLOCK_SIZE, 2),
                borderMaterial
            );
            rightBorder.position.x = COLS * BLOCK_SIZE / 2 + borderThickness / 2;
            gameGroup.add(rightBorder);
            
            const bottomBorder = new THREE.Mesh(
                new THREE.BoxGeometry(COLS * BLOCK_SIZE + borderThickness * 2, borderThickness, 2),
                borderMaterial
            );
            bottomBorder.position.y = -ROWS * BLOCK_SIZE / 2 - borderThickness / 2;
            gameGroup.add(bottomBorder);
        }
        
        function startGame() {
            currentPiece = new TetrisPiece();
            gameGroup.add(currentPiece.mesh);
            animate();
        }
        
        function animate(time = 0) {
            requestAnimationFrame(animate);
            
            if (!paused) {
                const deltaTime = time - lastTime;
                lastTime = time;
                
                dropCounter += deltaTime;
                if (dropCounter > (1000 / level)) {
                    dropPiece();
                    dropCounter = 0;
                }
            }
            
            renderer.render(scene, camera);
        }
        
        function dropPiece() {
            if (!currentPiece) return;
            
            if (!currentPiece.move(0, 1)) {
                lockPiece();
                checkLines();
                spawnNewPiece();
            }
        }
        
        function lockPiece() {
            let blockIndex = 0;
            currentPiece.matrix.forEach((row, y) => {
                row.forEach((value, x) => {
                    if (value) {
                        const boardY = currentPiece.y + y;
                        const boardX = currentPiece.x + x;
                        if (boardY >= 0 && boardY < ROWS && boardX >= 0 && boardX < COLS) {
                            const faceIndices = currentPiece.pieceFaceIndices[blockIndex];
                            const block = currentPiece.createCubeWithSpecificFaces(faceIndices);
                            block.position.set(
                                (boardX - COLS/2 + 0.5) * BLOCK_SIZE,
                                (ROWS/2 - boardY - 0.5) * BLOCK_SIZE,
                                0
                            );
                            board[boardY][boardX] = block;
                            gameGroup.add(block);
                        }
                        blockIndex++;
                    }
                });
            });
            
            gameGroup.remove(currentPiece.mesh);
        }
        
        function checkLines() {
            let linesCleared = 0;
            
            for (let y = ROWS - 1; y >= 0; y--) {
                let isComplete = true;
                
                for (let x = 0; x < COLS; x++) {
                    if (!board[y][x]) {
                        isComplete = false;
                        break;
                    }
                }
                
                if (isComplete) {
                    for (let x = 0; x < COLS; x++) {
                        if (board[y][x]) {
                            gameGroup.remove(board[y][x]);
                        }
                    }
                    
                    for (let moveY = y - 1; moveY >= 0; moveY--) {
                        for (let x = 0; x < COLS; x++) {
                            if (board[moveY][x]) {
                                board[moveY][x].position.y -= BLOCK_SIZE;
                                board[moveY + 1][x] = board[moveY][x];
                            } else {
                                board[moveY + 1][x] = null;
                            }
                        }
                    }
                    
                    for (let x = 0; x < COLS; x++) {
                        board[0][x] = null;
                    }
                    
                    linesCleared++;
                    y++;
                }
            }
            
            if (linesCleared > 0) {
                lines += linesCleared;
                score += linesCleared * 100 * level;
                level = Math.floor(lines / 10) + 1;
                updateScore();
            }
        }
        
        function spawnNewPiece() {
            currentPiece = new TetrisPiece();
            
            if (!currentPiece.isValidPosition()) {
                gameGroup.remove(currentPiece.mesh);
                currentPiece = null;
                gameOver();
                return;
            }
            
            gameGroup.add(currentPiece.mesh);
        }
        
        function gameOver() {
            alert(`Game Over!\nScore: ${score}\nLignes: ${lines}`);
            resetGame();
        }
        
        function resetGame() {
            for (let y = 0; y < ROWS; y++) {
                for (let x = 0; x < COLS; x++) {
                    if (board[y][x]) {
                        gameGroup.remove(board[y][x]);
                        board[y][x] = null;
                    }
                }
            }
            
            board = Array(ROWS).fill().map(() => Array(COLS).fill(null));
            score = 0;
            lines = 0;
            level = 1;
            dropCounter = 0;
            updateScore();
            
            if (currentPiece && currentPiece.mesh) {
                gameGroup.remove(currentPiece.mesh);
            }
            
            currentPiece = null;
            spawnNewPiece();
            paused = false;
        }
        
        function updateScore() {
            document.getElementById('score').textContent = score;
            document.getElementById('lines').textContent = lines;
            document.getElementById('level').textContent = level;
        }
        
        function onKeyDown(event) {
            if (!currentPiece) return;
            if (paused && event.key !== 'p' && event.key !== 'P') return;
            
            switch(event.key) {
                case 'ArrowLeft':
                    currentPiece.move(-1, 0);
                    break;
                case 'ArrowRight':
                    currentPiece.move(1, 0);
                    break;
                case 'ArrowDown':
                    if (currentPiece.move(0, 1)) {
                        score++;
                        updateScore();
                        dropCounter = 0;
                    }
                    break;
                case 'ArrowUp':
                    currentPiece.rotate();
                    break;
                case ' ':
                    while (currentPiece.move(0, 1)) {
                        score += 2;
                    }
                    updateScore();
                    dropCounter = 0;
                    lockPiece();
                    checkLines();
                    spawnNewPiece();
                    break;
                case 'p':
                case 'P':
                    togglePause();
                    break;
            }
        }
        
        function onWindowResize() {
            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();
            renderer.setSize(window.innerWidth, window.innerHeight);
        }
        
        function togglePause() {
            paused = !paused;
        }
        
        window.addEventListener('load', () => {
            init();
        });
    </script>
</body>
</html>
Faut connaître un peu three.js déjà si on veut modifier le code. D'ailleurs, accessoirement, la version utilisée est la release 128. On en est à la 177. Mais c'est inévitable, si tu lui indiques aucune version, il va en prendre une au pif dans le code d'un repo github / page random du net lié à tetris.
Je l'ai mis ici :
https://pastebin.com/P278uBzi

Allez, quelques morceaux choisient qui explique pourquoi cela bug. On pourra faire un classement du nawak :

1\ On voit qu'on est en 2025 et que le stockage/RAM c'est pas cher
Code:
[*]O: {
                shape: [[1,1],[1,1]],
                rotationStates: [
                    [[1,1],[1,1]],
                    [[1,1],[1,1]],
                    [[1,1],[1,1]],
                    [[1,1],[1,1]]
                ],
2\ C'est ce qui fait qu'une couleur par carré ne marchera jamais :
Code:
            generatePieceFaceIndices() {
                const maxBlocks = 9;
                const indices = [];
                for (let i = 0; i < maxBlocks; i++) {
                   indices.push(Array(6).fill().map(() => 
                        Math.floor(Math.random() * textures.length)
                    ));
                }
                return indices;
            }
3\ On notera un float sur un jeu en reel

Code:
[*]          updatePosition() {
                this.mesh.position.set(
                    (this.x - COLS/2 + 0.5) * BLOCK_SIZE,
                    (ROWS/2 - this.y - 0.5) * BLOCK_SIZE,
                    0
                );
            }
4/ C'est pour etre sur

Code:
                            if (newX < 0 || newX >= COLS || newY >= ROWS) {
                                return false;
                            }
                            
                            if (newY >= 0 && board[newY] && board[newY][newX]) {
                                return false;
                            }
5/ heu ... ?

Code:
 board = Array(ROWS).fill().map(() => Array(COLS).fill(null));
6/ La function checkLines() elle donne mal à la tête

7/

Code:
        function dropPiece() {
            if (!currentPiece) return;
            
            if (!currentPiece.move(0, 1)) {
                lockPiece();
                checkLines();
                spawnNewPiece();
            }
        }
8/ Pourquoi une IA c'est totalement con et qu'au final, on peut rien modifier rapidement :

Code:
            I: {
                shape: [[1,1,1,1]],
                rotationStates: [
                    [[1,1,1,1]],
                    [[1],[1],[1],[1]],
                    [[1,1,1,1]],
                    [[1],[1],[1],[1]]
                ],
                color: 0x00ffff
            },
On passera sur un stock d'erreur de conception, on va dire qu'elles n'empechent pas de fonctionner

Dernière modification par Airmed / Ildefonse ; 31/05/2025 à 16h35.
Ce sont des tests surs lesquels les IA sont pré-entraînées, ça ne peut toujours pas construire un site comme NeetCode, ni une POC.

Franchement Ron autant j'admire ta capacité à te lancer dans le bain et relever des défis, autant ton incapacité à écouter les avis de ceux qui ont 15 ans d'expérience du métier et se servent d'IA à la journée longue me sidère.
Citation :
Publié par Cpasmoi
Franchement Ron autant j'admire ta capacité à te lancer dans le bain et relever des défis, autant ton incapacité à écouter les avis de ceux qui ont 15 ans d'expérience du métier et se servent d'IA à la journée longue me sidère.
SI j'écoutais les gens, je serai en train de chialer d'avoir tout perdu suite au covid, je ne me serai pas refait le million depuis (surtout si j'écoutais J0L en fait). Je serai encore traumatisé de la tentative d'assasinnat d'il y a 10 ans, j'aurai peur de sortir dehors.

C'est mon fonctionnement. En sport de combat je n'affrontais que les plus forts en testant des nouveaux trucs à chaque fois.

Tout ce que je fais ici, c'est tester, éprouver, m'entraîner. tomber, me relever. L'IA c'est pareil. C'est pas en hurlant avec le reste de la meute que c'est trop nuuuuuuul que je vais en tirer quelque chose.

Je risque pas de te prendre en défaut sur le code. Mais si je réussis ne serait-ce qu'avec un résultat, je serai content.

Quand j'ai dit à Airmed que ça me faisait plaisir quand il a admis être un peu épaté, c'est vrai.

Ce topic est super, l'adversité que vous m'offrez tous est formidable, je remercie tous les jours l'univers de cet outil merveilleux qu'est le web et ses forums.

Moi je m'éclate ici.

SI je t'écoute, tout s'arrête. C'est pas ma nature mec. Si je dois tenir 12 rounds je tiendrai 12 rounds. et si à la fin tu dis "putain je suis surpris", ce sera trop cool.

Beaucoup ici ne me comprennent pas, mais je vous aime tous à ma façon.

Bref la bataille n'est pas terminée, je suis occupé là mais je mettrai ce soir une nouvelle version de tetris ou essayer de répondre au défi de Malkav.
Citation :
Publié par Ron Jack Auboulot
C'est pas en hurlant avec le reste de la meute que c'est trop nuuuuuuul que je vais en tirer quelque chose.
Il y a un entre deux à avoir surtout. Je suis dev, et j'utilise de temps en temps l'"IA" comme un outil et non un remplaçant. J'apprécie parfois les complétions que peut me proposer Copilot sur VSCode. (Même si parfois c'est totalement au fraise, mais c'est pas grave, je l'envoi bouler. Et je sais pas trop comment est exploité le code lu par Copilot, donc j'évite dans un environnement pro).

A mon niveau, je vois totalement le gain que ça peut m'apporter sur des interfaces relativement simple ou du code basique. Ma plus value à faire ça est globalement nulle, donc si je peux prompter l'IA pour qu'il me sorte un squelette de ce que je souhaite, ça me va. Je devrais nécessairement relire car il me sortira forcément des âneries, mais je serais quand même gagnant en terme de temps.

Par contre, dès que l'on rentre dans le dur, si je rencontre des problèmes et que j'ai pas un collègue de boulot sous la main, je m'en sers plutôt comme interlocuteur qui va me permettre de me faire raisonner, c'est un peu mon canard. Ça peut être concernant un bug, une manière de faire, de la théorie...

J'ajoute à cela aussi que je m'interdis formellement de mettre quoique soit concernant les règles métiers de mes clients. Je vais donc avoir deux choix :
- Si c'est pas trop complexe, je vais tenter d'anonymiser ce que je peux pour qu'ils puissent me sortir un squelette de code "re-travaillable".
- Je me démerde (Car je sais faire). Et aussi parce que j'ai déjà potentiellement fait des choses qui ressemblent sur d'autres projets, avec une architecture proche/identique.

L'"IA", maintenant qu'elle est là, il faut faire avec, la boite de pandore est ouverte. Je l'utilise donc pour ce qu'elle est actuellement pour moi : Un outil, qui parfois se révèle intéressant / pertinent, parfois nul. Je fais mon tri.
Citation :
Publié par Ron Jack Auboulot
SI j'écoutais les gens, je serai en train de chialer d'avoir tout perdu suite au covid, je ne me serai pas refait le million depuis (surtout si j'écoutais J0L en fait). Je serai encore traumatisé de la tentative d'assasinnat d'il y a 10 ans, j'aurai peur de sortir dehors.

C'est mon fonctionnement. En sport de combat je n'affrontais que les plus forts en testant des nouveaux trucs à chaque fois.

Tout ce que je fais ici, c'est tester, éprouver, m'entraîner. tomber, me relever. L'IA c'est pareil. C'est pas en hurlant avec le reste de la meute que c'est trop nuuuuuuul que je vais en tirer quelque chose.

Je risque pas de te prendre en défaut sur le code. Mais si je réussis ne serait-ce qu'avec un résultat, je serai content.

Quand j'ai dit à Airmed que ça me faisait plaisir quand il a admis être un peu épaté, c'est vrai.

Ce topic est super, l'adversité que vous m'offrez tous est formidable, je remercie tous les jours l'univers de cet outil merveilleux qu'est le web et ses forums.

Moi je m'éclate ici.

SI je t'écoute, tout s'arrête. C'est pas ma nature mec. Si je dois tenir 12 rounds je tiendrai 12 rounds. et si à la fin tu dis "putain je suis surpris", ce sera trop cool.

Beaucoup ici ne me comprennent pas, mais je vous aime tous à ma façon.

Bref la bataille n'est pas terminée, je suis occupé là mais je mettrai ce soir une nouvelle version de tetris ou essayer de répondre au défi de Malkav.
Si tu veux filer ta métaphore du combat, l'arbitre est en train de te dire que t'as une commotion cérébrale et tu veux continuer alors que t'es en train de te baver dessus.

T'aurais plus à y gagner à apprendre le fonctionnement des LLMs plutôt que de pondre du code inutile. Après oui faut se documenter, lire, écouter, c'est moins trivial que de taper des prompts et de rester bloquer dans son avis avec une machine qui ne fait qu'aller dans ton sens.

Surtout que depuis le départ personne ne rejette en bloc son utilisation.
Citation :
Publié par Cpasmoi
Les LLMs ne sont vraiment utiles en ce moment que pour des Senior Devs expérimentés. Je m'en sers absolument tous les jours, c'est pratique, ça me fait sauver du temps, exemple d'usages:

- Générer des tests unitaires pour une fonction: ça marche plus ou moins bien, souvent c'est à côté de la plaque. Mais après avoir crafté un prompt très précis j'ai au moins une structure répétable et modifiable avec la syntaxe que je veux
- Générer des fichiers de configuration genre docker
- Générer des squelettes
- Pointer vers des solutions techniques ou des améliorations de complexité
Merci c'est un peu ce que je pensais. En gros pour la partie dev, on atteint très vite les limites actuellement (au moins en oneshot), par contre pour le reste c'est assez stable pour se reposer dessus.
Pour déterminer qui a raison entre les pro dev et les pro IA, il faudrait organiser un concours du style : en 48h vous devez créer un projet original avec un cahier des charges précis. Je pense que c'est facile à organiser. Un jury joliens trancherait pour déterminer le gagnant .
Citation :
Publié par Tonton Jack
Pour déterminer qui a raison entre les pro dev et les pro IA, il faudrait organiser un concours du style : en 48h vous devez créer un projet original avec un cahier des charges précis. Je pense que c'est facile à organiser. Un jury joliens trancherait pour déterminer le gagnant .
Faut déjà démontrer qu'au moins un programme "made in IA" fonctionne.
Et t'es pas sympa, ca fait que 4 prompt
Citation :
Publié par Tonton Jack
En effet, ca me parait être un point fondamental. Ce serait facile a trancher pour le coup. Après, il y aurait d'autres points à déterminer pour statuer.
Je reformule :
Faut déjà démontrer que l'IA arrive à pondre 1 programme respectant des specs sans bugs majeurs. Après on peut étudier l'idée d'un concours
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés