examples/game_of_life: add a GUI frontend; compiler: local modules relative to a main module
parent
3d235169c8
commit
f42be0622e
|
@ -0,0 +1,114 @@
|
||||||
|
module automaton
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
pub struct A2D {
|
||||||
|
pub mut:
|
||||||
|
maxx int
|
||||||
|
maxy int
|
||||||
|
data &int
|
||||||
|
}
|
||||||
|
[inline] pub fn (a &A2D) set(x,y int, newval int) {
|
||||||
|
unsafe {
|
||||||
|
mut e := &int(0)
|
||||||
|
e = a.data + y*a.maxx + x
|
||||||
|
*e = newval
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[inline] pub fn (a &A2D) get(x,y int) int {
|
||||||
|
unsafe {
|
||||||
|
mut e := &int(0)
|
||||||
|
e = a.data + y*a.maxx + x
|
||||||
|
return *e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[inline] pub fn (a &A2D) clear() {
|
||||||
|
for y := 0; y<a.maxy; y++ {
|
||||||
|
for x := 0; x<a.maxx; x++ {
|
||||||
|
a.set(x,y,0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
pub struct Automaton {
|
||||||
|
pub mut:
|
||||||
|
field &A2D
|
||||||
|
new_field &A2D
|
||||||
|
}
|
||||||
|
|
||||||
|
fn new_automaton(f [][]int) Automaton {
|
||||||
|
mut maxy := f.len
|
||||||
|
mut maxx := 0
|
||||||
|
for y := 0; y<f.len; y++ {
|
||||||
|
if maxx < f[y].len {
|
||||||
|
maxx = f[y].len
|
||||||
|
}
|
||||||
|
}
|
||||||
|
field := &A2D{ maxx: maxx maxy: maxy data: &int( calloc( sizeof(int) * maxy * maxx ) ) }
|
||||||
|
new_field := &A2D{ maxx: maxx maxy: maxy data: &int( calloc( sizeof(int) * maxy * maxx ) ) }
|
||||||
|
for y := 0; y < field.maxy; y++ {
|
||||||
|
for x := 0; x < field.maxx; x++ {
|
||||||
|
field.set( x, y, f[y][x] )
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Automaton{ field: field new_field: new_field }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn (aa mut Automaton) update() {
|
||||||
|
aa.new_field.clear()
|
||||||
|
for y := 1; y<aa.field.maxy; y++ {
|
||||||
|
for x := 1; x<aa.field.maxx; x++ {
|
||||||
|
moore_sum := ( 0 +
|
||||||
|
aa.field.get(x-1,y-1) + aa.field.get(x,y-1) + aa.field.get(x+1,y-1) +
|
||||||
|
aa.field.get(x-1,y ) + 0 + aa.field.get(x+1,y ) +
|
||||||
|
aa.field.get(x-1,y+1) + aa.field.get(x,y+1) + aa.field.get(x+1,y+1)
|
||||||
|
)
|
||||||
|
cell := aa.field.get(x,y)
|
||||||
|
v := if cell == 1 {
|
||||||
|
int(moore_sum in [2, 3])
|
||||||
|
} else {
|
||||||
|
int(moore_sum == 3)
|
||||||
|
}
|
||||||
|
aa.new_field.set(x,y, v )
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mut tmp := aa.field
|
||||||
|
aa.field = aa.new_field
|
||||||
|
aa.new_field = tmp
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn gun() Automaton {
|
||||||
|
mut field := []array_int
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
return new_automaton(field)
|
||||||
|
}
|
|
@ -1,78 +1,24 @@
|
||||||
|
module main
|
||||||
import time
|
import time
|
||||||
|
import automaton
|
||||||
|
|
||||||
fn print_field(field []array_int) {
|
fn print_automaton(a &automaton.Automaton){
|
||||||
for line in field {
|
for y := 1; y<a.field.maxy; y++ {
|
||||||
mut s := ' '
|
mut s := ' '
|
||||||
for j, cell in line {
|
for x := 1; x<a.field.maxx; x++ {
|
||||||
if j == 0 || j == line.len - 1{continue}
|
cell := a.field.get(x,y)
|
||||||
s += if cell == 1{'@'} else { '.'}
|
s += if cell == 1 { '@' } else { '.' }
|
||||||
}
|
}
|
||||||
println(s)
|
println(s)
|
||||||
}
|
}
|
||||||
println('')
|
println('')
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn gun() []array_int {
|
|
||||||
mut field := []array_int
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
field << [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
return field
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
mut field := gun()
|
mut a := automaton.gun()
|
||||||
print_field(field)
|
|
||||||
for {
|
for {
|
||||||
mut new_field := []array_int
|
a.update()
|
||||||
for i, line in field {
|
print_automaton(a)
|
||||||
new_field << [0].repeat(line.len)
|
|
||||||
}
|
|
||||||
for i, line in field {
|
|
||||||
if i == 0 || i == field.len - 1{continue}
|
|
||||||
for j, cell in line {
|
|
||||||
if j == 0 || j == line.len - 1{continue}
|
|
||||||
moore_sum := (
|
|
||||||
field[i - 1] [j - 1] + field[i - 1] [j] + field[i - 1] [j + 1] +
|
|
||||||
field[i] [j - 1] + field[i] [j + 1] +
|
|
||||||
field[i + 1] [j - 1] + field[i + 1] [j] + field[i + 1] [j + 1]
|
|
||||||
)
|
|
||||||
new_field[i] [j] = if cell == 1 {
|
|
||||||
int(moore_sum in [2, 3])
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
int(moore_sum == 3)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
field = new_field
|
|
||||||
print_field(field)
|
|
||||||
time.sleep_ms(100)
|
time.sleep_ms(100)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
module main
|
||||||
|
|
||||||
|
import time
|
||||||
|
import gg
|
||||||
|
import glfw
|
||||||
|
import gx
|
||||||
|
import automaton
|
||||||
|
|
||||||
|
const (
|
||||||
|
screenWidth = 800
|
||||||
|
screenHeight = 600
|
||||||
|
filled_color = gx.Blue
|
||||||
|
)
|
||||||
|
|
||||||
|
fn new_graphics() &gg.GG {
|
||||||
|
glfw.init_glfw()
|
||||||
|
return gg.new_context(gg.Cfg{
|
||||||
|
width: screenWidth
|
||||||
|
height: screenHeight
|
||||||
|
use_ortho: true
|
||||||
|
create_window: true
|
||||||
|
resizable: false
|
||||||
|
window_title: 'v life (with gg, glfw, gx)'
|
||||||
|
window_user_ptr: 0
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
graphics = new_graphics()
|
||||||
|
)
|
||||||
|
|
||||||
|
[live]
|
||||||
|
fn print_automaton(a &automaton.Automaton){
|
||||||
|
gg.clear(gx.White)
|
||||||
|
square_size := 18
|
||||||
|
for y := 1; y<a.field.maxy; y++ {
|
||||||
|
for x := 1; x<a.field.maxx; x++ {
|
||||||
|
cell := a.field.get(x,y)
|
||||||
|
if cell == 1 {
|
||||||
|
graphics.draw_rect( square_size*x, square_size*y, square_size, square_size, filled_color )
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
mut a := automaton.gun()
|
||||||
|
for {
|
||||||
|
if graphics.window.should_close() { graphics.window.destroy() break }
|
||||||
|
gg.post_empty_event() // needed so the animation does not stop
|
||||||
|
///////////////////////////////////////////////
|
||||||
|
a.update()
|
||||||
|
print_automaton(a)
|
||||||
|
|
||||||
|
graphics.render()
|
||||||
|
time.sleep_ms(1) // TODO: remove this when live reload depence on the time module is fixed
|
||||||
|
}
|
||||||
|
}
|
|
@ -165,7 +165,7 @@ pub fn v_test_v(args_before_test string){
|
||||||
println('\nBuilding examples...')
|
println('\nBuilding examples...')
|
||||||
mut es := new_test_sesion( args_before_test )
|
mut es := new_test_sesion( args_before_test )
|
||||||
files := os.walk_ext(parent_dir+'/examples','.v')
|
files := os.walk_ext(parent_dir+'/examples','.v')
|
||||||
stable := files.filter(!it.contains('vweb'))
|
stable := files.filter(!it.contains('automaton.v'))
|
||||||
es.files << stable
|
es.files << stable
|
||||||
es.test()
|
es.test()
|
||||||
println( es.benchmark.total_message('building examples') )
|
println( es.benchmark.total_message('building examples') )
|
||||||
|
|
|
@ -62,6 +62,7 @@ pub mut:
|
||||||
out_name_c string // name of the temporary C file
|
out_name_c string // name of the temporary C file
|
||||||
files []string // all V files that need to be parsed and compiled
|
files []string // all V files that need to be parsed and compiled
|
||||||
dir string // directory (or file) being compiled (TODO rename to path?)
|
dir string // directory (or file) being compiled (TODO rename to path?)
|
||||||
|
compiled_dir string // contains os.realpath() of the dir of the final file beeing compiled, or the dir itself when doing `v .`
|
||||||
table &Table // table with types, vars, functions etc
|
table &Table // table with types, vars, functions etc
|
||||||
cgen &CGen // C code generator
|
cgen &CGen // C code generator
|
||||||
x64 &x64.Gen
|
x64 &x64.Gen
|
||||||
|
@ -874,6 +875,7 @@ pub fn new_v(args[]string) &V {
|
||||||
if args.len < 2 {
|
if args.len < 2 {
|
||||||
dir = ''
|
dir = ''
|
||||||
}
|
}
|
||||||
|
|
||||||
// build mode
|
// build mode
|
||||||
mut build_mode := BuildMode.default_mode
|
mut build_mode := BuildMode.default_mode
|
||||||
mut mod := ''
|
mut mod := ''
|
||||||
|
@ -1051,6 +1053,7 @@ pub fn new_v(args[]string) &V {
|
||||||
os: _os
|
os: _os
|
||||||
out_name: out_name
|
out_name: out_name
|
||||||
dir: dir
|
dir: dir
|
||||||
|
compiled_dir: if os.is_dir( rdir ) { rdir } else { os.dir( rdir ) }
|
||||||
lang_dir: vroot
|
lang_dir: vroot
|
||||||
table: new_table(obfuscate)
|
table: new_table(obfuscate)
|
||||||
out_name_c: out_name_c
|
out_name_c: out_name_c
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
module compiler
|
module compiler
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import filepath
|
||||||
|
|
||||||
pub const (
|
pub const (
|
||||||
v_modules_path = os.home_dir() + '.vmodules'
|
v_modules_path = os.home_dir() + '.vmodules'
|
||||||
|
@ -47,7 +48,7 @@ fn (p mut Parser) register_import_alias(alias string, mod string, tok_idx int) {
|
||||||
// NOTE: come back here
|
// NOTE: come back here
|
||||||
// if alias in it.imports && it.imports[alias] == mod {}
|
// if alias in it.imports && it.imports[alias] == mod {}
|
||||||
if alias in p.import_table.imports && p.import_table.imports[alias] != mod {
|
if alias in p.import_table.imports && p.import_table.imports[alias] != mod {
|
||||||
p.error('cannot import $mod as $alias: import name $alias already in use"')
|
p.error('cannot import $mod as $alias: import name $alias already in use')
|
||||||
}
|
}
|
||||||
if mod.contains('.internal.') && !p.is_vgen {
|
if mod.contains('.internal.') && !p.is_vgen {
|
||||||
mod_parts := mod.split('.')
|
mod_parts := mod.split('.')
|
||||||
|
@ -141,35 +142,34 @@ pub fn(graph &DepGraph) imports() []string {
|
||||||
return mods
|
return mods
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (v &V) module_path(mod string) string {
|
[inline] fn (v &V) module_path(mod string) string {
|
||||||
// submodule support
|
// submodule support
|
||||||
if mod.contains('.') {
|
return mod.replace('.', os.path_separator)
|
||||||
return mod.replace('.', os.path_separator)
|
|
||||||
// return mod.replace('.', '/')
|
|
||||||
}
|
|
||||||
return mod
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 'strings' => 'VROOT/vlib/strings'
|
// 'strings' => 'VROOT/vlib/strings'
|
||||||
// 'installed_mod' => '~/.vmodules/installed_mod'
|
// 'installed_mod' => '~/.vmodules/installed_mod'
|
||||||
// 'local_mod' => '/path/to/current/dir/local_mod'
|
// 'local_mod' => '/path/to/current/dir/local_mod'
|
||||||
fn (v &V) find_module_path(mod string) ?string {
|
fn (v &V) find_module_path(mod string) ?string {
|
||||||
|
// Module search order:
|
||||||
|
// 1) search in the *same* directory, as the compiled final v program source
|
||||||
|
// (i.e. the . in `v .` or file.v in `v file.v`)
|
||||||
|
// 2) search in the current work dir (this preserves existing behaviour)
|
||||||
|
// 3) search in vlib/
|
||||||
|
// 4) search in ~/.vmodules/ (i.e. modules installed with vpm)
|
||||||
mod_path := v.module_path(mod)
|
mod_path := v.module_path(mod)
|
||||||
// First check for local modules in the same directory
|
mut tried_paths := []string
|
||||||
mut import_path := os.getwd() + '${os.path_separator}$mod_path'
|
tried_paths << filepath.join(v.compiled_dir, mod_path)
|
||||||
// Now search in vlib/
|
tried_paths << filepath.join(os.getwd(), mod_path)
|
||||||
if mod == 'compiler' || !os.dir_exists(import_path) {
|
tried_paths << filepath.join(v.pref.vlib_path, mod_path)
|
||||||
import_path = '${v.pref.vlib_path}${os.path_separator}$mod_path'
|
tried_paths << filepath.join(v_modules_path, mod_path)
|
||||||
}
|
for try_path in tried_paths {
|
||||||
//println('ip=$import_path')
|
if v.pref.is_verbose { println(' >> trying to find $mod in $try_path ...') }
|
||||||
// Finally try modules installed with vpm (~/.vmodules)
|
if os.dir_exists(try_path) {
|
||||||
if !os.dir_exists(import_path) {
|
return try_path
|
||||||
import_path = '${v.pref.vpath}${os.path_separator}$mod_path'
|
|
||||||
if !os.dir_exists(import_path){
|
|
||||||
return error('module "$mod" not found')
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return import_path
|
return error('module "$mod" not found')
|
||||||
}
|
}
|
||||||
|
|
||||||
[inline] fn mod_gen_name(mod string) string {
|
[inline] fn mod_gen_name(mod string) string {
|
||||||
|
|
Loading…
Reference in New Issue