0votos

Snake en Scala

por josejuan hace 6 años

Cada vez me mola más Scala

Fernando de Genbetadev dice que si haces un Snake en un lenguaje, entonces, ese lenguaje ya casi no tiene secretos para tí.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package snake 
 
import java.awt.Color 
import java.awt.event.ActionEvent 
import java.awt.event.ActionListener 
 
import scala.Array.canBuildFrom 
import scala.swing.Dimension 
import scala.swing.Graphics2D 
import scala.swing.MainFrame 
import scala.swing.Panel 
import scala.swing.SimpleSwingApplication 
import scala.swing.event.Key 
import scala.swing.event.KeyPressed 
import scala.swing.event.MouseEvent 
 
import javax.swing.Timer 
 
object SnakeRun extends SimpleSwingApplication { 
    val S = 11;    val S2 = S * S;    val W = 10;    val vs = S * W;    var d = 0 
    val D = Array(1, 0, 0, -1, -1, 0, 0, 1) 
    var s = Array((S >> 1, S >> 1)) 
    val rnd = new java.util.Random() 
    var f = food 
    def food = { 
        val l = 0.to(S2 - 1).map(p => (p % S, p / S)).filterNot(s.contains); 
        l(rnd.nextInt(l.length)) 
    def top = new MainFrame { 
        title = "Snake!" 
        contents = new Panel { 
            focusable = true 
            background = Color.white 
            preferredSize = new Dimension(vs, vs) 
            override def paint(g: Graphics2D) = { 
                g.setBackground(Color.white); g.clearRect(0, 0, vs, vs) 
                g.setColor(Color.green); s.foreach {case (x, y) => g.fillRect(x * W, y * W, W, W)} 
                g.setColor(Color.red); g.fillRect(f._1 * W, f._2 * W, W, W) 
                if(!t.isRunning()) { 
                    g.setColor(Color.black) 
                    g.drawString("Ouch!", 10, 10)  
            listenTo(keys) 
            reactions += { 
                case KeyPressed(_, Key.Left, _, _) => d = (d + 1) % 4 
                case KeyPressed(_, Key.Right, _, _) => d = (d + 3) % 4 
        val t: Timer = new Timer(250, new ActionListener() { 
            def actionPerformed(e: ActionEvent) { 
                val n = ((S + s(0)._1 + D(d << 1)) % S, (S + s(0)._2 + D((d << 1) + 1)) % S) 
                if(s.contains(n)) t.stop() 
                s +:= n 
                if(n == f) f = food else s = s.take(s.length - 1) 
                repaint() 
        }) 
        t.start() 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.