pbInfo.ro
Probleme
Probleme - clasa a IX-a
Probleme - clasa a X-a
Probleme - clasa a XI-a
Probleme din concursuri
Căutare problemă
Exerciții
Programează cu Blockly
Desenează cu Processing
Exersează SQL
Soluţii
Resurse
Resurse pentru clasa a IX-a
Resurse pentru clasa a X-a
Resurse pentru clasa a XI-a
Articole recomandate
Subiecte bacalaureat
Ajutor
Autentificare
Înregistrare
Autentificare
Utilizator sau email
Parola
Acest site foloseşte cookies. Navigând în continuare, vă exprimaţi acordul asupra folosirii cookie-urilor.
Îti place pbInfo? Atunci acceptă-l cu totul! Dezactivează modulul de blocare a reclamelor!
Script Nou - Processing
Lista scripturi
Script Nou
Ajutor
ID
Autor
Duplicat din
Ultima modificare
#7272
Amoniac NH3 (Alexandra_Gavrilescu)
-
Miercuri, 27 mai 2026, 10:21
let cols, rows; let resolution = 8; // Rezoluție mai fină pentru detalii grandioase let grid; let particles = []; let currentTeam = 1; // 1 = Roz Neon, 2 = Cyan Neon function setup() { createCanvas(800, 500); cols = floor(width / resolution); rows = floor(height / resolution); // Inițializăm grila cu 0 (aer/podea neutră) grid = new Array(cols).fill(0).map(() => new Array(rows).fill(0)); // Dezactivăm meniul contextual de click-dreapta în browser pentru a-l folosi în joc document.oncontextmenu = function() { return false; } } function draw() { background(20, 22, 26); // Fundal închis, hitech // 1. RANDARE GRILĂ ȘI MARGINI for (let i = 0; i < cols; i++) { for (let j = 0; j < rows; j++) { let team = grid[i][j]; if (team > 0) { // Setăm culoarea de bază a echipei if (team === 1) fill(255, 0, 128); // Roz else if (team === 2) fill(0, 235, 255); // Cyan noStroke(); rect(i * resolution, j * resolution, resolution, resolution); // --- Algoritmul de Margini Inteligente (Edge Detection) --- stroke(10, 12, 16); // Culoarea marginii (închisă, contrastantă) strokeWeight(2.5); // Grosimea conturului // Verificăm vecinul din STÂNGA if (i === 0 || grid[i - 1][j] !== team) { line(i * resolution, j * resolution, i * resolution, (j + 1) * resolution); } // Verificăm vecinul din DREAPTA if (i === cols - 1 || grid[i + 1][j] !== team) { line((i + 1) * resolution, j * resolution, (i + 1) * resolution, (j + 1) * resolution); } // Verificăm vecinul de SUS if (j === 0 || grid[i][j - 1] !== team) { line(i * resolution, j * resolution, (i + 1) * resolution, j * resolution); } // Verificăm vecinul de JOS if (j === rows - 1 || grid[i][j + 1] !== team) { line(i * resolution, (j + 1) * resolution, (i + 1) * resolution, (j + 1) * resolution); } } } } // 2. ACTUALIZARE ȘI RANDARE PARTICULE for (let i = particles.length - 1; i >= 0; i--) { particles[i].update(); particles[i].display(); if (particles[i].isDead()) { particles.splice(i, 1); } } // 3. INTERFAȚĂ GRAFICĂ (UI) drawUI(); } // GESTIONARE INPUT (MOUSE) function mousePressed() { if (mouseButton === LEFT) currentTeam = 1; if (mouseButton === RIGHT) currentTeam = 2; triggerSplash(); } function mouseDragged() { triggerSplash(); } function triggerSplash() { let cx = floor(mouseX / resolution); let cy = floor(mouseY / resolution); let radius = 5; if (cx >= 0 && cx < cols && cy >= 0 && cy < rows) { // Aplicăm Radial Splash let minX = max(0, cx - radius); let maxX = min(cols - 1, cx + radius); let minY = max(0, cy - radius); let maxY = min(rows - 1, cy + radius); for (let i = minX; i <= maxX; i++) { for (let j = minY; j <= maxY; j++) { let distSq = (i - cx) * (i - cx) + (j - cy) * (j - cy); if (distSq <= (radius * radius) - random(0, 3)) { grid[i][j] = currentTeam; } } } // Spawn particule de efect if (random() < 0.4) { particles.push(new Particle(mouseX, mouseY, currentTeam)); } } } // GESTIONARE INPUT (TASTATURĂ) function keyPressed() { if (key === 'c' || key === 'C') { // Curăță ecranul grid = new Array(cols).fill(0).map(() => new Array(rows).fill(0)); } if (key === 'd' || key === 'D') { // Aplică un pas de Dilation Fill (Expansiune) pe toată harta applyDilation(); } if (key === '1') currentTeam = 1; if (key === '2') currentTeam = 2; } // ALGORITM DE DILATARE (DILATION FILL) function applyDilation() { let nextGrid = new Array(cols).fill(0).map(() => new Array(rows).fill(0)); for (let i = 0; i < cols; i++) { for (let j = 0; j < rows; j++) { nextGrid[i][j] = grid[i][j]; } } for (let i = 1; i < cols - 1; i++) { for (let j = 1; j < rows - 1; j++) { if (grid[i][j] === 0) { // Numărăm vecinii pentru fiecare echipă let t1 = 0, t2 = 0; for (let x = -1; x <= 1; x++) { for (let y = -1; y <= 1; y++) { if (grid[i + x][j + y] === 1) t1++; if (grid[i + x][j + y] === 2) t2++; } } // Dacă există destulă vopsea în jur, umplem celula goală if (t1 >= 4 && t1 > t2) nextGrid[i][j] = 1; if (t2 >= 4 && t2 > t1) nextGrid[i][j] = 2; } } } grid = nextGrid; } // CLASA PENTRU PARTICULE class Particle { constructor(x, y, team) { this.pos = createVector(x, y); this.vel = p5.Vector.random2D().mult(random(2, 5)); this.vel.y -= 2; // Le aruncăm ușor în sus this.acc = createVector(0, 0.15); // Gravitație this.team = team; this.alpha = 255; this.size = random(4, 10); } update() { this.vel.add(this.acc); this.pos.add(this.vel); this.alpha -= 5; } display() { noStroke(); if (this.team === 1) fill(255, 0, 128, this.alpha); else fill(0, 235, 255, this.alpha); ellipse(this.pos.x, this.pos.y, this.size); } isDead() { return this.alpha <= 0; } } // DESENARE INTERFAȚĂ text function drawUI() { fill(255, 255, 255, 200); noStroke(); // Indicator echipă curentă text("Echipa activă: ", width - 150, 30); if (currentTeam === 1) fill(255, 0, 128); else fill(0, 235, 255); rect(width - 50, 18, 15, 15); }
Duplicare
Executare
Cod
Cod HTML
<iframe sandbox="allow-scripts" src="/p5js/index.php?id=7272" style="width:408px; height:408px;border:solid 1px gray; overflow: scroll;"></iframe>
Duplicare script
Denumirea noului script
Du-te sus!