Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
go
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
go
Commits
9786b3f1
Commit
9786b3f1
authored
Nov 05, 2009
by
Robert Griesemer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
gofmt-ify 4s, iterable
R=rsc
http://go/go-review/1016055
parent
2a899154
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
375 additions
and
364 deletions
+375
-364
src/pkg/exp/4s/4s.go
src/pkg/exp/4s/4s.go
+4
-4
src/pkg/exp/4s/data.go
src/pkg/exp/4s/data.go
+124
-124
src/pkg/exp/4s/xs.go
src/pkg/exp/4s/xs.go
+163
-153
src/pkg/exp/iterable/iterable.go
src/pkg/exp/iterable/iterable.go
+39
-39
src/pkg/exp/iterable/iterable_test.go
src/pkg/exp/iterable/iterable_test.go
+45
-44
No files found.
src/pkg/exp/4s/4s.go
View file @
9786b3f1
...
@@ -32,7 +32,7 @@ func main() {
...
@@ -32,7 +32,7 @@ func main() {
p
=
pieces5
;
p
=
pieces5
;
}
}
dx
,
dy
:=
500
,
500
;
dx
,
dy
:=
500
,
500
;
w
,
err
:=
av
.
Init
(
av
.
SubsystemVideo
|
av
.
SubsystemAudio
,
dx
,
dy
);
w
,
err
:=
av
.
Init
(
av
.
SubsystemVideo
|
av
.
SubsystemAudio
,
dx
,
dy
);
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Exit
(
err
);
log
.
Exit
(
err
);
}
}
...
@@ -55,7 +55,7 @@ func audioServer() {
...
@@ -55,7 +55,7 @@ func audioServer() {
b
:=
<-
sndc
;
b
:=
<-
sndc
;
for
len
(
b
)
*
2
>=
n
{
for
len
(
b
)
*
2
>=
n
{
var
a
[]
uint16
;
var
a
[]
uint16
;
a
,
b
=
b
[
0
:
n
/
2
],
b
[
n
/
2
:
len
(
b
)];
a
,
b
=
b
[
0
:
n
/
2
],
b
[
n
/
2
:
len
(
b
)];
n
,
err
=
av
.
AudioStream
(
a
);
n
,
err
=
av
.
AudioStream
(
a
);
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Exit
(
err
);
log
.
Exit
(
err
);
...
@@ -74,6 +74,6 @@ func PlaySound(b []uint16) {
...
@@ -74,6 +74,6 @@ func PlaySound(b []uint16) {
sndc
<-
b
;
sndc
<-
b
;
}
}
var
whoosh
=
[]
uint16
{
var
whoosh
=
[]
uint16
{
// Insert your favorite sound samples here.
// Insert your favorite sound samples here.
}
}
src/pkg/exp/4s/data.go
View file @
9786b3f1
...
@@ -13,130 +13,130 @@ package main
...
@@ -13,130 +13,130 @@ package main
import
.
"exp/draw"
import
.
"exp/draw"
var
pieces4
=
[]
Piece
{
var
pieces4
=
[]
Piece
{
Piece
{
0
,
0
,
Point
{
4
,
1
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
0
,
0
,
Point
{
4
,
1
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
1
,
0
,
Point
{
1
,
4
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
1
,
0
,
Point
{
1
,
4
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
2
,
0
,
Point
{
4
,
1
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
0
,
Point
{
4
,
1
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
0
,
Point
{
1
,
4
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
3
,
0
,
Point
{
1
,
4
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
0
,
3
,
Point
{
2
,
2
},
[]
Point
{
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
-
1
},
Point
{
-
1
,
0
}},
nil
,
nil
},
Piece
{
0
,
3
,
Point
{
2
,
2
},
[]
Point
{
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
-
1
},
Point
{
-
1
,
0
}},
nil
,
nil
},
Piece
{
1
,
3
,
Point
{
2
,
2
},
[]
Point
{
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
-
1
},
Point
{
-
1
,
0
}},
nil
,
nil
},
Piece
{
1
,
3
,
Point
{
2
,
2
},
[]
Point
{
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
-
1
},
Point
{
-
1
,
0
}},
nil
,
nil
},
Piece
{
2
,
3
,
Point
{
2
,
2
},
[]
Point
{
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
-
1
},
Point
{
-
1
,
0
}},
nil
,
nil
},
Piece
{
2
,
3
,
Point
{
2
,
2
},
[]
Point
{
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
-
1
},
Point
{
-
1
,
0
}},
nil
,
nil
},
Piece
{
3
,
3
,
Point
{
2
,
2
},
[]
Point
{
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
-
1
},
Point
{
-
1
,
0
}},
nil
,
nil
},
Piece
{
3
,
3
,
Point
{
2
,
2
},
[]
Point
{
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
-
1
},
Point
{
-
1
,
0
}},
nil
,
nil
},
Piece
{
0
,
1
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
0
,
1
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
1
,
1
,
Point
{
2
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
-
1
,
0
}
},
nil
,
nil
},
Piece
{
1
,
1
,
Point
{
2
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
-
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
1
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
1
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
1
,
Point
{
2
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
3
,
1
,
Point
{
2
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
0
,
2
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
0
,
-
1
}},
nil
,
nil
},
Piece
{
0
,
2
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
0
,
-
1
}},
nil
,
nil
},
Piece
{
1
,
2
,
Point
{
2
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
1
,
2
,
Point
{
2
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
2
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
2
,
1
}
},
nil
,
nil
},
Piece
{
2
,
2
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
2
,
1
}
},
nil
,
nil
},
Piece
{
3
,
2
,
Point
{
2
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
3
,
2
,
Point
{
2
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
0
,
4
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
0
,
4
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
1
,
4
,
Point
{
2
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
1
,
4
,
Point
{
2
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
2
,
4
,
Point
{
3
,
2
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
4
,
Point
{
3
,
2
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
4
,
Point
{
2
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
1
,
-
1
}},
nil
,
nil
},
Piece
{
3
,
4
,
Point
{
2
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
1
,
-
1
}},
nil
,
nil
},
Piece
{
0
,
5
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
0
,
5
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
1
,
5
,
Point
{
2
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
-
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
1
,
5
,
Point
{
2
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
-
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
2
,
5
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
5
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
5
,
Point
{
2
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
-
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
3
,
5
,
Point
{
2
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
-
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
0
,
6
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
-
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
0
,
6
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
-
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
1
,
6
,
Point
{
2
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
1
,
6
,
Point
{
2
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
2
,
6
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
-
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
6
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
-
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
6
,
Point
{
2
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
3
,
6
,
Point
{
2
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
}
}
var
pieces5
=
[]
Piece
{
var
pieces5
=
[]
Piece
{
Piece
{
0
,
1
,
Point
{
5
,
1
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
0
,
1
,
Point
{
5
,
1
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
1
,
1
,
Point
{
1
,
5
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
1
,
1
,
Point
{
1
,
5
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
2
,
1
,
Point
{
5
,
1
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
1
,
Point
{
5
,
1
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
1
,
Point
{
1
,
5
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
3
,
1
,
Point
{
1
,
5
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
0
,
0
,
Point
{
4
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
0
,
0
,
Point
{
4
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
1
,
0
,
Point
{
2
,
4
},
[]
Point
{
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
-
1
,
0
}
},
nil
,
nil
},
Piece
{
1
,
0
,
Point
{
2
,
4
},
[]
Point
{
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
-
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
0
,
Point
{
4
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
0
,
Point
{
4
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
0
,
Point
{
2
,
4
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
0
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
3
,
0
,
Point
{
2
,
4
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
0
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
0
,
2
,
Point
{
4
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
-
1
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
0
,
2
,
Point
{
4
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
-
1
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
1
,
2
,
Point
{
2
,
4
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
1
,
2
,
Point
{
2
,
4
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
2
,
2
,
Point
{
4
,
2
},
[]
Point
{
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
0
,
-
1
}},
nil
,
nil
},
Piece
{
2
,
2
,
Point
{
4
,
2
},
[]
Point
{
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
0
,
-
1
}},
nil
,
nil
},
Piece
{
3
,
2
,
Point
{
2
,
4
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
2
,
Point
{
2
,
4
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
0
,
7
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
0
,
7
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
1
,
7
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
2
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
0
,
-
1
},
Point
{
0
,
-
1
}},
nil
,
nil
},
Piece
{
1
,
7
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
2
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
0
,
-
1
},
Point
{
0
,
-
1
}},
nil
,
nil
},
Piece
{
2
,
7
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
7
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
7
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
2
},
Point
{
0
,
-
1
},
Point
{
0
,
-
1
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
7
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
2
},
Point
{
0
,
-
1
},
Point
{
0
,
-
1
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
0
,
3
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
0
,
3
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
1
,
3
,
Point
{
2
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
1
,
3
,
Point
{
2
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
2
,
3
,
Point
{
3
,
2
},
[]
Point
{
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
3
,
Point
{
3
,
2
},
[]
Point
{
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
3
,
Point
{
2
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
3
,
Point
{
2
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
0
,
4
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
0
,
4
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
1
,
4
,
Point
{
2
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
1
,
4
,
Point
{
2
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
4
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
4
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
4
,
Point
{
2
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
3
,
4
,
Point
{
2
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
0
,
7
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
2
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
0
,
7
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
2
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
1
,
7
,
Point
{
2
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
0
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
1
,
7
,
Point
{
2
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
0
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
7
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
2
,
1
},
Point
{
2
,
0
}
},
nil
,
nil
},
Piece
{
2
,
7
,
Point
{
3
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
2
,
1
},
Point
{
2
,
0
}
},
nil
,
nil
},
Piece
{
3
,
7
,
Point
{
2
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
-
1
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
7
,
Point
{
2
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
-
1
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
0
,
5
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
0
,
5
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
1
,
5
,
Point
{
3
,
3
},
[]
Point
{
Point
{
2
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
1
,
5
,
Point
{
3
,
3
},
[]
Point
{
Point
{
2
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
2
,
5
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
5
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
5
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
2
,
1
}
},
nil
,
nil
},
Piece
{
3
,
5
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
2
,
1
}
},
nil
,
nil
},
Piece
{
0
,
6
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
0
,
6
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
1
,
6
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
1
,
6
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
2
,
6
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
6
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
6
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
3
,
6
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
0
,
0
,
Point
{
4
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
2
,
1
}
},
nil
,
nil
},
Piece
{
0
,
0
,
Point
{
4
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
2
,
1
}
},
nil
,
nil
},
Piece
{
1
,
0
,
Point
{
2
,
4
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
1
,
0
,
Point
{
2
,
4
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
2
,
0
,
Point
{
4
,
2
},
[]
Point
{
Point
{
2
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
0
,
Point
{
4
,
2
},
[]
Point
{
Point
{
2
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
0
,
Point
{
2
,
4
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
3
,
0
,
Point
{
2
,
4
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
0
,
2
,
Point
{
4
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
0
,
2
,
Point
{
4
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
1
,
2
,
Point
{
2
,
4
},
[]
Point
{
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
1
,
2
,
Point
{
2
,
4
},
[]
Point
{
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
2
,
2
,
Point
{
4
,
2
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
2
,
Point
{
4
,
2
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
2
,
Point
{
2
,
4
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
3
,
2
,
Point
{
2
,
4
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
0
,
1
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
0
,
1
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
1
,
1
,
Point
{
3
,
3
},
[]
Point
{
Point
{
2
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
1
,
1
,
Point
{
3
,
3
},
[]
Point
{
Point
{
2
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
1
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
1
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
1
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
3
,
1
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
0
,
3
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
0
,
3
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
1
,
3
,
Point
{
3
,
3
},
[]
Point
{
Point
{
2
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
1
,
3
,
Point
{
3
,
3
},
[]
Point
{
Point
{
2
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
2
,
3
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
3
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
3
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
2
,
1
}
},
nil
,
nil
},
Piece
{
3
,
3
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
2
,
1
}
},
nil
,
nil
},
Piece
{
0
,
4
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
0
,
4
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
1
,
4
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
1
,
4
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
2
,
4
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
2
,
4
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
3
,
4
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
3
,
4
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
0
,
8
,
Point
{
4
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
0
,
8
,
Point
{
4
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
1
,
8
,
Point
{
2
,
4
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
1
,
8
,
Point
{
2
,
4
},
[]
Point
{
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
2
,
8
,
Point
{
4
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
8
,
Point
{
4
,
2
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
8
,
Point
{
2
,
4
},
[]
Point
{
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
3
,
8
,
Point
{
2
,
4
},
[]
Point
{
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
-
1
,
1
},
Point
{
1
,
0
},
Point
{
-
1
,
1
}
},
nil
,
nil
},
Piece
{
0
,
9
,
Point
{
4
,
2
},
[]
Point
{
Point
{
2
,
0
},
Point
{
1
,
0
},
Point
{
-
3
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
0
,
9
,
Point
{
4
,
2
},
[]
Point
{
Point
{
2
,
0
},
Point
{
1
,
0
},
Point
{
-
3
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
1
,
9
,
Point
{
2
,
4
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
1
,
9
,
Point
{
2
,
4
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
2
,
9
,
Point
{
4
,
2
},
[]
Point
{
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
3
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
9
,
Point
{
4
,
2
},
[]
Point
{
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
3
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
9
,
Point
{
2
,
4
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
3
,
9
,
Point
{
2
,
4
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
0
,
5
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
0
,
5
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
1
,
5
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
-
1
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
1
,
5
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
-
1
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
5
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
2
,
5
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
0
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
}
},
nil
,
nil
},
Piece
{
3
,
5
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
-
1
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
5
,
Point
{
3
,
3
},
[]
Point
{
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
1
,
1
},
Point
{
-
1
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
0
,
6
,
Point
{
3
,
3
},
[]
Point
{
Point
{
2
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
2
,
1
}
},
nil
,
nil
},
Piece
{
0
,
6
,
Point
{
3
,
3
},
[]
Point
{
Point
{
2
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
2
,
1
}
},
nil
,
nil
},
Piece
{
1
,
6
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
1
,
6
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
2
,
6
,
Point
{
3
,
3
},
[]
Point
{
Point
{
2
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
2
,
1
}
},
nil
,
nil
},
Piece
{
2
,
6
,
Point
{
3
,
3
},
[]
Point
{
Point
{
2
,
0
},
Point
{
-
2
,
1
},
Point
{
1
,
0
},
Point
{
1
,
0
},
Point
{
-
2
,
1
}
},
nil
,
nil
},
Piece
{
3
,
6
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
Piece
{
3
,
6
,
Point
{
3
,
3
},
[]
Point
{
Point
{
0
,
0
},
Point
{
1
,
0
},
Point
{
0
,
1
},
Point
{
0
,
1
},
Point
{
1
,
0
}
},
nil
,
nil
},
}
;
}
src/pkg/exp/4s/xs.go
View file @
9786b3f1
...
@@ -50,36 +50,36 @@ const (
...
@@ -50,36 +50,36 @@ const (
)
)
var
(
var
(
N
int
;
N
int
;
display
draw
.
Context
;
display
draw
.
Context
;
screen
draw
.
Image
;
screen
draw
.
Image
;
screenr
draw
.
Rectangle
;
screenr
draw
.
Rectangle
;
board
[
NY
][
NX
]
byte
;
board
[
NY
][
NX
]
byte
;
rboard
draw
.
Rectangle
;
rboard
draw
.
Rectangle
;
pscore
draw
.
Point
;
pscore
draw
.
Point
;
scoresz
draw
.
Point
;
scoresz
draw
.
Point
;
pcsz
=
32
;
pcsz
=
32
;
pos
draw
.
Point
;
pos
draw
.
Point
;
bbr
,
bb2r
draw
.
Rectangle
;
bbr
,
bb2r
draw
.
Rectangle
;
bb
,
bbmask
,
bb2
,
bb2mask
*
image
.
RGBA
;
bb
,
bbmask
,
bb2
,
bb2mask
*
image
.
RGBA
;
whitemask
image
.
Image
;
whitemask
image
.
Image
;
br
,
br2
draw
.
Rectangle
;
br
,
br2
draw
.
Rectangle
;
points
int
;
points
int
;
dt
int
;
dt
int
;
DY
int
;
DY
int
;
DMOUSE
int
;
DMOUSE
int
;
lastmx
int
;
lastmx
int
;
mouse
draw
.
Mouse
;
mouse
draw
.
Mouse
;
newscreen
bool
;
newscreen
bool
;
timerc
<-
chan
int64
;
timerc
<-
chan
int64
;
suspc
chan
bool
;
suspc
chan
bool
;
mousec
chan
draw
.
Mouse
;
mousec
chan
draw
.
Mouse
;
resizec
<-
chan
bool
;
resizec
<-
chan
bool
;
kbdc
chan
int
;
kbdc
chan
int
;
suspended
bool
;
suspended
bool
;
tsleep
int
;
tsleep
int
;
piece
*
Piece
;
piece
*
Piece
;
pieces
[]
Piece
;
pieces
[]
Piece
;
)
)
type
Piece
struct
{
type
Piece
struct
{
...
@@ -92,56 +92,66 @@ type Piece struct {
...
@@ -92,56 +92,66 @@ type Piece struct {
}
}
var
txbits
=
[
NCOL
][
32
]
byte
{
var
txbits
=
[
NCOL
][
32
]
byte
{
[
32
]
byte
{
0xDD
,
0xDD
,
0xFF
,
0xFF
,
0x77
,
0x77
,
0xFF
,
0xFF
,
[
32
]
byte
{
0xDD
,
0xDD
,
0xFF
,
0xFF
,
0x77
,
0x77
,
0xFF
,
0xFF
,
0xDD
,
0xDD
,
0xFF
,
0xFF
,
0x77
,
0x77
,
0xFF
,
0xFF
,
0xDD
,
0xDD
,
0xFF
,
0xFF
,
0x77
,
0x77
,
0xFF
,
0xFF
,
0xDD
,
0xDD
,
0xFF
,
0xFF
,
0x77
,
0x77
,
0xFF
,
0xFF
,
0xDD
,
0xDD
,
0xFF
,
0xFF
,
0x77
,
0x77
,
0xFF
,
0xFF
,
0xDD
,
0xDD
,
0xFF
,
0xFF
,
0x77
,
0x77
,
0xFF
,
0xFF
},
0xDD
,
0xDD
,
0xFF
,
0xFF
,
0x77
,
0x77
,
0xFF
,
0xFF
,
[
32
]
byte
{
0xDD
,
0xDD
,
0x77
,
0x77
,
0xDD
,
0xDD
,
0x77
,
0x77
,
},
0xDD
,
0xDD
,
0x77
,
0x77
,
0xDD
,
0xDD
,
0x77
,
0x77
,
[
32
]
byte
{
0xDD
,
0xDD
,
0x77
,
0x77
,
0xDD
,
0xDD
,
0x77
,
0x77
,
0xDD
,
0xDD
,
0x77
,
0x77
,
0xDD
,
0xDD
,
0x77
,
0x77
,
0xDD
,
0xDD
,
0x77
,
0x77
,
0xDD
,
0xDD
,
0x77
,
0x77
,
0xDD
,
0xDD
,
0x77
,
0x77
,
0xDD
,
0xDD
,
0x77
,
0x77
},
0xDD
,
0xDD
,
0x77
,
0x77
,
0xDD
,
0xDD
,
0x77
,
0x77
,
[
32
]
byte
{
0xAA
,
0xAA
,
0x55
,
0x55
,
0xAA
,
0xAA
,
0x55
,
0x55
,
0xDD
,
0xDD
,
0x77
,
0x77
,
0xDD
,
0xDD
,
0x77
,
0x77
,
0xAA
,
0xAA
,
0x55
,
0x55
,
0xAA
,
0xAA
,
0x55
,
0x55
,
},
0xAA
,
0xAA
,
0x55
,
0x55
,
0xAA
,
0xAA
,
0x55
,
0x55
,
[
32
]
byte
{
0xAA
,
0xAA
,
0x55
,
0x55
,
0xAA
,
0xAA
,
0x55
,
0x55
,
0xAA
,
0xAA
,
0x55
,
0x55
,
0xAA
,
0xAA
,
0x55
,
0x55
},
0xAA
,
0xAA
,
0x55
,
0x55
,
0xAA
,
0xAA
,
0x55
,
0x55
,
[
32
]
byte
{
0xAA
,
0xAA
,
0x55
,
0x55
,
0xAA
,
0xAA
,
0x55
,
0x55
,
0xAA
,
0xAA
,
0x55
,
0x55
,
0xAA
,
0xAA
,
0x55
,
0x55
,
0xAA
,
0xAA
,
0x55
,
0x55
,
0xAA
,
0xAA
,
0x55
,
0x55
,
0xAA
,
0xAA
,
0x55
,
0x55
,
0xAA
,
0xAA
,
0x55
,
0x55
,
0xAA
,
0xAA
,
0x55
,
0x55
,
0xAA
,
0xAA
,
0x55
,
0x55
,
},
0xAA
,
0xAA
,
0x55
,
0x55
,
0xAA
,
0xAA
,
0x55
,
0x55
},
[
32
]
byte
{
0xAA
,
0xAA
,
0x55
,
0x55
,
0xAA
,
0xAA
,
0x55
,
0x55
,
[
32
]
byte
{
0x22
,
0x22
,
0x88
,
0x88
,
0x22
,
0x22
,
0x88
,
0x88
,
0xAA
,
0xAA
,
0x55
,
0x55
,
0xAA
,
0xAA
,
0x55
,
0x55
,
0x22
,
0x22
,
0x88
,
0x88
,
0x22
,
0x22
,
0x88
,
0x88
,
0xAA
,
0xAA
,
0x55
,
0x55
,
0xAA
,
0xAA
,
0x55
,
0x55
,
0x22
,
0x22
,
0x88
,
0x88
,
0x22
,
0x22
,
0x88
,
0x88
,
0xAA
,
0xAA
,
0x55
,
0x55
,
0xAA
,
0xAA
,
0x55
,
0x55
,
0x22
,
0x22
,
0x88
,
0x88
,
0x22
,
0x22
,
0x88
,
0x88
},
},
[
32
]
byte
{
0x22
,
0x22
,
0x00
,
0x00
,
0x88
,
0x88
,
0x00
,
0x00
,
[
32
]
byte
{
0x22
,
0x22
,
0x88
,
0x88
,
0x22
,
0x22
,
0x88
,
0x88
,
0x22
,
0x22
,
0x00
,
0x00
,
0x88
,
0x88
,
0x00
,
0x00
,
0x22
,
0x22
,
0x88
,
0x88
,
0x22
,
0x22
,
0x88
,
0x88
,
0x22
,
0x22
,
0x00
,
0x00
,
0x88
,
0x88
,
0x00
,
0x00
,
0x22
,
0x22
,
0x88
,
0x88
,
0x22
,
0x22
,
0x88
,
0x88
,
0x22
,
0x22
,
0x00
,
0x00
,
0x88
,
0x88
,
0x00
,
0x00
},
0x22
,
0x22
,
0x88
,
0x88
,
0x22
,
0x22
,
0x88
,
0x88
,
[
32
]
byte
{
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0x00
,
0x00
,
0x00
,
0x00
,
},
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0x00
,
0x00
,
0x00
,
0x00
,
[
32
]
byte
{
0x22
,
0x22
,
0x00
,
0x00
,
0x88
,
0x88
,
0x00
,
0x00
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0x00
,
0x00
,
0x00
,
0x00
,
0x22
,
0x22
,
0x00
,
0x00
,
0x88
,
0x88
,
0x00
,
0x00
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0x00
,
0x00
,
0x00
,
0x00
},
0x22
,
0x22
,
0x00
,
0x00
,
0x88
,
0x88
,
0x00
,
0x00
,
[
32
]
byte
{
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0x00
,
0x00
,
0x00
,
0x00
,
0x22
,
0x22
,
0x00
,
0x00
,
0x88
,
0x88
,
0x00
,
0x00
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0x00
,
0x00
,
0x00
,
0x00
,
},
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0x00
,
0x00
,
0x00
,
0x00
,
[
32
]
byte
{
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0x00
,
0x00
,
0x00
,
0x00
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0x00
,
0x00
,
0x00
,
0x00
},
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0x00
,
0x00
,
0x00
,
0x00
,
[
32
]
byte
{
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0x00
,
0x00
,
0x00
,
0x00
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0x00
,
0x00
,
0x00
,
0x00
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
},
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
},
[
32
]
byte
{
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0x00
,
0x00
,
0x00
,
0x00
,
[
32
]
byte
{
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0x33
,
0x33
,
0x33
,
0x33
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0x00
,
0x00
,
0x00
,
0x00
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0x33
,
0x33
,
0x33
,
0x33
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0x00
,
0x00
,
0x00
,
0x00
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0x33
,
0x33
,
0x33
,
0x33
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0x00
,
0x00
,
0x00
,
0x00
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0x33
,
0x33
,
0x33
,
0x33
},
},
[
32
]
byte
{
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
},
[
32
]
byte
{
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0x33
,
0x33
,
0x33
,
0x33
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0x33
,
0x33
,
0x33
,
0x33
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0x33
,
0x33
,
0x33
,
0x33
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0x33
,
0x33
,
0x33
,
0x33
,
},
}
}
var
txpix
=
[
NCOL
]
draw
.
Color
{
var
txpix
=
[
NCOL
]
draw
.
Color
{
draw
.
Yellow
,
/* yellow */
draw
.
Yellow
,
/* yellow */
draw
.
Cyan
,
/* cyan */
draw
.
Cyan
,
/* cyan */
draw
.
Green
,
/* lime green */
draw
.
Green
,
/* lime green */
draw
.
GreyBlue
,
/* slate */
draw
.
GreyBlue
,
/* slate */
draw
.
Red
,
/* red */
draw
.
Red
,
/* red */
draw
.
GreyGreen
,
/* olive green */
draw
.
GreyGreen
,
/* olive green */
draw
.
Blue
,
/* blue */
draw
.
Blue
,
/* blue */
draw
.
Color
(
0xFF55AAFF
),
/* pink */
draw
.
Color
(
0xFF55AAFF
),
/* pink */
draw
.
Color
(
0xFFAAFFFF
),
/* lavender */
draw
.
Color
(
0xFFAAFFFF
),
/* lavender */
draw
.
Color
(
0xBB005DFF
),
/* maroon */
draw
.
Color
(
0xBB005DFF
),
/* maroon */
...
@@ -155,7 +165,7 @@ func movemouse() int {
...
@@ -155,7 +165,7 @@ func movemouse() int {
func
warp
(
p
draw
.
Point
,
x
int
)
int
{
func
warp
(
p
draw
.
Point
,
x
int
)
int
{
if
!
suspended
&&
piece
!=
nil
{
if
!
suspended
&&
piece
!=
nil
{
x
=
pos
.
X
+
piece
.
sz
.
X
*
pcsz
/
2
;
x
=
pos
.
X
+
piece
.
sz
.
X
*
pcsz
/
2
;
if
p
.
Y
<
rboard
.
Min
.
Y
{
if
p
.
Y
<
rboard
.
Min
.
Y
{
p
.
Y
=
rboard
.
Min
.
Y
;
p
.
Y
=
rboard
.
Min
.
Y
;
}
}
...
@@ -184,12 +194,12 @@ func initPieces() {
...
@@ -184,12 +194,12 @@ func initPieces() {
}
}
func
collide
(
pt
draw
.
Point
,
p
*
Piece
)
bool
{
func
collide
(
pt
draw
.
Point
,
p
*
Piece
)
bool
{
pt
.
X
=
(
pt
.
X
-
rboard
.
Min
.
X
)
/
pcsz
;
pt
.
X
=
(
pt
.
X
-
rboard
.
Min
.
X
)
/
pcsz
;
pt
.
Y
=
(
pt
.
Y
-
rboard
.
Min
.
Y
)
/
pcsz
;
pt
.
Y
=
(
pt
.
Y
-
rboard
.
Min
.
Y
)
/
pcsz
;
for
_
,
q
:=
range
p
.
d
{
for
_
,
q
:=
range
p
.
d
{
pt
.
X
+=
q
.
X
;
pt
.
X
+=
q
.
X
;
pt
.
Y
+=
q
.
Y
;
pt
.
Y
+=
q
.
Y
;
if
pt
.
X
<
0
||
pt
.
X
>=
NX
||
pt
.
Y
<
0
||
pt
.
Y
>=
NY
{
if
pt
.
X
<
0
||
pt
.
X
>=
NX
||
pt
.
Y
<
0
||
pt
.
Y
>=
NY
{
return
true
;
return
true
;
continue
;
continue
;
}
}
...
@@ -201,8 +211,8 @@ func collide(pt draw.Point, p *Piece) bool {
...
@@ -201,8 +211,8 @@ func collide(pt draw.Point, p *Piece) bool {
}
}
func
collider
(
pt
,
pmax
draw
.
Point
)
bool
{
func
collider
(
pt
,
pmax
draw
.
Point
)
bool
{
pi
:=
(
pt
.
X
-
rboard
.
Min
.
X
)
/
pcsz
;
pi
:=
(
pt
.
X
-
rboard
.
Min
.
X
)
/
pcsz
;
pj
:=
(
pt
.
Y
-
rboard
.
Min
.
Y
)
/
pcsz
;
pj
:=
(
pt
.
Y
-
rboard
.
Min
.
Y
)
/
pcsz
;
n
:=
pmax
.
X
/
pcsz
;
n
:=
pmax
.
X
/
pcsz
;
m
:=
pmax
.
Y
/
pcsz
+
1
;
m
:=
pmax
.
Y
/
pcsz
+
1
;
for
i
:=
pi
;
i
<
pi
+
n
&&
i
<
NX
;
i
++
{
for
i
:=
pi
;
i
<
pi
+
n
&&
i
<
NX
;
i
++
{
...
@@ -228,8 +238,8 @@ func setpiece(p *Piece) {
...
@@ -228,8 +238,8 @@ func setpiece(p *Piece) {
var
r
draw
.
Rectangle
;
var
r
draw
.
Rectangle
;
r
.
Min
=
bbr
.
Min
;
r
.
Min
=
bbr
.
Min
;
for
i
,
pt
:=
range
p
.
d
{
for
i
,
pt
:=
range
p
.
d
{
r
.
Min
.
X
+=
pt
.
X
*
pcsz
;
r
.
Min
.
X
+=
pt
.
X
*
pcsz
;
r
.
Min
.
Y
+=
pt
.
Y
*
pcsz
;
r
.
Min
.
Y
+=
pt
.
Y
*
pcsz
;
r
.
Max
.
X
=
r
.
Min
.
X
+
pcsz
;
r
.
Max
.
X
=
r
.
Min
.
X
+
pcsz
;
r
.
Max
.
Y
=
r
.
Min
.
Y
+
pcsz
;
r
.
Max
.
Y
=
r
.
Min
.
Y
+
pcsz
;
if
i
==
0
{
if
i
==
0
{
...
@@ -237,7 +247,7 @@ func setpiece(p *Piece) {
...
@@ -237,7 +247,7 @@ func setpiece(p *Piece) {
draw
.
Draw
(
bb
,
r
.
Inset
(
1
),
txpix
[
piece
.
tx
],
nil
,
draw
.
ZP
);
draw
.
Draw
(
bb
,
r
.
Inset
(
1
),
txpix
[
piece
.
tx
],
nil
,
draw
.
ZP
);
draw
.
Draw
(
bbmask
,
r
,
draw
.
Opaque
,
nil
,
draw
.
ZP
);
draw
.
Draw
(
bbmask
,
r
,
draw
.
Opaque
,
nil
,
draw
.
ZP
);
op
=
r
.
Min
;
op
=
r
.
Min
;
}
else
{
}
else
{
draw
.
Draw
(
bb
,
r
,
bb
,
nil
,
op
);
draw
.
Draw
(
bb
,
r
,
bb
,
nil
,
op
);
draw
.
Draw
(
bbmask
,
r
,
bbmask
,
nil
,
op
);
draw
.
Draw
(
bbmask
,
r
,
bbmask
,
nil
,
op
);
}
}
...
@@ -249,7 +259,7 @@ func setpiece(p *Piece) {
...
@@ -249,7 +259,7 @@ func setpiece(p *Piece) {
}
}
}
}
br
.
Max
=
br
.
Max
.
Sub
(
bbr
.
Min
);
br
.
Max
=
br
.
Max
.
Sub
(
bbr
.
Min
);
delta
:=
draw
.
Pt
(
0
,
DY
);
delta
:=
draw
.
Pt
(
0
,
DY
);
br2
.
Max
=
br
.
Max
.
Add
(
delta
);
br2
.
Max
=
br
.
Max
.
Add
(
delta
);
r
=
br
.
Add
(
bb2r
.
Min
);
r
=
br
.
Add
(
bb2r
.
Min
);
r2
:=
br2
.
Add
(
bb2r
.
Min
);
r2
:=
br2
.
Add
(
bb2r
.
Min
);
...
@@ -280,26 +290,26 @@ func rest() {
...
@@ -280,26 +290,26 @@ func rest() {
for
_
,
p
:=
range
piece
.
d
{
for
_
,
p
:=
range
piece
.
d
{
pt
.
X
+=
p
.
X
;
pt
.
X
+=
p
.
X
;
pt
.
Y
+=
p
.
Y
;
pt
.
Y
+=
p
.
Y
;
board
[
pt
.
Y
][
pt
.
X
]
=
byte
(
piece
.
tx
+
16
);
board
[
pt
.
Y
][
pt
.
X
]
=
byte
(
piece
.
tx
+
16
);
}
}
}
}
func
canfit
(
p
*
Piece
)
bool
{
func
canfit
(
p
*
Piece
)
bool
{
var
dx
=
[
...
]
int
{
0
,
-
1
,
1
,
-
2
,
2
,
-
3
,
3
,
4
,
-
4
};
var
dx
=
[
...
]
int
{
0
,
-
1
,
1
,
-
2
,
2
,
-
3
,
3
,
4
,
-
4
};
j
:=
N
+
1
;
j
:=
N
+
1
;
if
j
>=
4
{
if
j
>=
4
{
j
=
p
.
sz
.
X
;
j
=
p
.
sz
.
X
;
if
j
<
p
.
sz
.
Y
{
if
j
<
p
.
sz
.
Y
{
j
=
p
.
sz
.
Y
;
j
=
p
.
sz
.
Y
;
}
}
j
=
2
*
j
-
1
;
j
=
2
*
j
-
1
;
}
}
for
i
:=
0
;
i
<
j
;
i
++
{
for
i
:=
0
;
i
<
j
;
i
++
{
var
z
draw
.
Point
;
var
z
draw
.
Point
;
z
.
X
=
pos
.
X
+
dx
[
i
]
*
pcsz
;
z
.
X
=
pos
.
X
+
dx
[
i
]
*
pcsz
;
z
.
Y
=
pos
.
Y
;
z
.
Y
=
pos
.
Y
;
if
!
collide
(
z
,
p
)
{
if
!
collide
(
z
,
p
)
{
z
.
Y
=
pos
.
Y
+
pcsz
-
1
;
z
.
Y
=
pos
.
Y
+
pcsz
-
1
;
if
!
collide
(
z
,
p
)
{
if
!
collide
(
z
,
p
)
{
undrawpiece
();
undrawpiece
();
pos
.
X
=
z
.
X
;
pos
.
X
=
z
.
X
;
...
@@ -312,28 +322,28 @@ func canfit(p *Piece) bool {
...
@@ -312,28 +322,28 @@ func canfit(p *Piece) bool {
func
score
(
p
int
)
{
func
score
(
p
int
)
{
points
+=
p
;
points
+=
p
;
// snprint(buf, sizeof(buf), "%.6ld", points);
// snprint(buf, sizeof(buf), "%.6ld", points);
// draw.Draw(screen, draw.Rpt(pscore, pscore.Add(scoresz)), draw.White, nil, draw.ZP);
// draw.Draw(screen, draw.Rpt(pscore, pscore.Add(scoresz)), draw.White, nil, draw.ZP);
// string(screen, pscore, draw.Black, draw.ZP, font, buf);
// string(screen, pscore, draw.Black, draw.ZP, font, buf);
}
}
func
drawsq
(
b
draw
.
Image
,
p
draw
.
Point
,
ptx
int
)
{
func
drawsq
(
b
draw
.
Image
,
p
draw
.
Point
,
ptx
int
)
{
var
r
draw
.
Rectangle
;
var
r
draw
.
Rectangle
;
r
.
Min
=
p
;
r
.
Min
=
p
;
r
.
Max
.
X
=
r
.
Min
.
X
+
pcsz
;
r
.
Max
.
X
=
r
.
Min
.
X
+
pcsz
;
r
.
Max
.
Y
=
r
.
Min
.
Y
+
pcsz
;
r
.
Max
.
Y
=
r
.
Min
.
Y
+
pcsz
;
draw
.
Draw
(
b
,
r
,
draw
.
Black
,
nil
,
draw
.
ZP
);
draw
.
Draw
(
b
,
r
,
draw
.
Black
,
nil
,
draw
.
ZP
);
draw
.
Draw
(
b
,
r
.
Inset
(
1
),
txpix
[
ptx
],
nil
,
draw
.
ZP
);
draw
.
Draw
(
b
,
r
.
Inset
(
1
),
txpix
[
ptx
],
nil
,
draw
.
ZP
);
}
}
func
drawboard
()
{
func
drawboard
()
{
draw
.
Border
(
screen
,
rboard
.
Inset
(
-
2
),
2
,
draw
.
Black
,
draw
.
ZP
);
draw
.
Border
(
screen
,
rboard
.
Inset
(
-
2
),
2
,
draw
.
Black
,
draw
.
ZP
);
draw
.
Draw
(
screen
,
draw
.
Rect
(
rboard
.
Min
.
X
,
rboard
.
Min
.
Y
-
2
,
rboard
.
Max
.
X
,
rboard
.
Min
.
Y
),
draw
.
Draw
(
screen
,
draw
.
Rect
(
rboard
.
Min
.
X
,
rboard
.
Min
.
Y
-
2
,
rboard
.
Max
.
X
,
rboard
.
Min
.
Y
),
draw
.
White
,
nil
,
draw
.
ZP
);
draw
.
White
,
nil
,
draw
.
ZP
);
for
i
:=
0
;
i
<
NY
;
i
++
{
for
i
:=
0
;
i
<
NY
;
i
++
{
for
j
:=
0
;
j
<
NX
;
j
++
{
for
j
:=
0
;
j
<
NX
;
j
++
{
if
board
[
i
][
j
]
!=
0
{
if
board
[
i
][
j
]
!=
0
{
drawsq
(
screen
,
draw
.
Pt
(
rboard
.
Min
.
X
+
j
*
pcsz
,
rboard
.
Min
.
Y
+
i
*
pcsz
),
int
(
board
[
i
][
j
]
-
16
));
drawsq
(
screen
,
draw
.
Pt
(
rboard
.
Min
.
X
+
j
*
pcsz
,
rboard
.
Min
.
Y
+
i
*
pcsz
),
int
(
board
[
i
][
j
]
-
16
));
}
}
}
}
}
}
...
@@ -348,8 +358,8 @@ func choosepiece() {
...
@@ -348,8 +358,8 @@ func choosepiece() {
i
:=
rand
.
Intn
(
len
(
pieces
));
i
:=
rand
.
Intn
(
len
(
pieces
));
setpiece
(
&
pieces
[
i
]);
setpiece
(
&
pieces
[
i
]);
pos
=
rboard
.
Min
;
pos
=
rboard
.
Min
;
pos
.
X
+=
rand
.
Intn
(
NX
)
*
pcsz
;
pos
.
X
+=
rand
.
Intn
(
NX
)
*
pcsz
;
if
!
collide
(
draw
.
Pt
(
pos
.
X
,
pos
.
Y
+
pcsz
-
DY
),
piece
)
{
if
!
collide
(
draw
.
Pt
(
pos
.
X
,
pos
.
Y
+
pcsz
-
DY
),
piece
)
{
break
;
break
;
}
}
}
}
...
@@ -359,7 +369,7 @@ func choosepiece() {
...
@@ -359,7 +369,7 @@ func choosepiece() {
func
movepiece
()
bool
{
func
movepiece
()
bool
{
var
mask
image
.
Image
;
var
mask
image
.
Image
;
if
collide
(
draw
.
Pt
(
pos
.
X
,
pos
.
Y
+
pcsz
),
piece
)
{
if
collide
(
draw
.
Pt
(
pos
.
X
,
pos
.
Y
+
pcsz
),
piece
)
{
return
false
;
return
false
;
}
}
if
collider
(
pos
,
br2
.
Max
)
{
if
collider
(
pos
,
br2
.
Max
)
{
...
@@ -374,11 +384,11 @@ func movepiece() bool {
...
@@ -374,11 +384,11 @@ func movepiece() bool {
func
suspend
(
s
bool
)
{
func
suspend
(
s
bool
)
{
suspended
=
s
;
suspended
=
s
;
/*
/*
if suspended {
if suspended {
setcursor(mousectl, &whitearrow);
setcursor(mousectl, &whitearrow);
} else {
} else {
setcursor(mousectl, nil);
setcursor(mousectl, nil);
}
}
*/
*/
if
!
suspended
{
if
!
suspended
{
drawpiece
();
drawpiece
();
...
@@ -417,8 +427,8 @@ func pause(t int) {
...
@@ -417,8 +427,8 @@ func pause(t int) {
func
horiz
()
bool
{
func
horiz
()
bool
{
var
lev
[
MAXN
]
int
;
var
lev
[
MAXN
]
int
;
h
:=
0
;
h
:=
0
;
for
i
:=
0
;
i
<
NY
;
i
++
{
for
i
:=
0
;
i
<
NY
;
i
++
{
for
j
:=
0
;
board
[
i
][
j
]
!=
0
;
j
++
{
for
j
:=
0
;
board
[
i
][
j
]
!=
0
;
j
++
{
if
j
==
NX
-
1
{
if
j
==
NX
-
1
{
lev
[
h
]
=
i
;
lev
[
h
]
=
i
;
h
++
;
h
++
;
...
@@ -431,20 +441,20 @@ func horiz() bool {
...
@@ -431,20 +441,20 @@ func horiz() bool {
}
}
r
:=
rboard
;
r
:=
rboard
;
newscreen
=
false
;
newscreen
=
false
;
for
j
:=
0
;
j
<
h
;
j
++
{
for
j
:=
0
;
j
<
h
;
j
++
{
r
.
Min
.
Y
=
rboard
.
Min
.
Y
+
lev
[
j
]
*
pcsz
;
r
.
Min
.
Y
=
rboard
.
Min
.
Y
+
lev
[
j
]
*
pcsz
;
r
.
Max
.
Y
=
r
.
Min
.
Y
+
pcsz
;
r
.
Max
.
Y
=
r
.
Min
.
Y
+
pcsz
;
draw
.
Draw
(
screen
,
r
,
draw
.
White
,
whitemask
,
draw
.
ZP
);
draw
.
Draw
(
screen
,
r
,
draw
.
White
,
whitemask
,
draw
.
ZP
);
display
.
FlushImage
();
display
.
FlushImage
();
}
}
PlaySound
(
whoosh
);
PlaySound
(
whoosh
);
for
i
:=
0
;
i
<
3
;
i
++
{
for
i
:=
0
;
i
<
3
;
i
++
{
pause
(
250
);
pause
(
250
);
if
newscreen
{
if
newscreen
{
drawboard
();
drawboard
();
break
;
break
;
}
}
for
j
:=
0
;
j
<
h
;
j
++
{
for
j
:=
0
;
j
<
h
;
j
++
{
r
.
Min
.
Y
=
rboard
.
Min
.
Y
+
lev
[
j
]
*
pcsz
;
r
.
Min
.
Y
=
rboard
.
Min
.
Y
+
lev
[
j
]
*
pcsz
;
r
.
Max
.
Y
=
r
.
Min
.
Y
+
pcsz
;
r
.
Max
.
Y
=
r
.
Min
.
Y
+
pcsz
;
draw
.
Draw
(
screen
,
r
,
draw
.
White
,
whitemask
,
draw
.
ZP
);
draw
.
Draw
(
screen
,
r
,
draw
.
White
,
whitemask
,
draw
.
ZP
);
...
@@ -452,13 +462,13 @@ func horiz() bool {
...
@@ -452,13 +462,13 @@ func horiz() bool {
display
.
FlushImage
();
display
.
FlushImage
();
}
}
r
=
rboard
;
r
=
rboard
;
for
j
:=
0
;
j
<
h
;
j
++
{
for
j
:=
0
;
j
<
h
;
j
++
{
i
:=
NY
-
lev
[
j
]
-
1
;
i
:=
NY
-
lev
[
j
]
-
1
;
score
(
250
+
10
*
i
*
i
);
score
(
250
+
10
*
i
*
i
);
r
.
Min
.
Y
=
rboard
.
Min
.
Y
;
r
.
Min
.
Y
=
rboard
.
Min
.
Y
;
r
.
Max
.
Y
=
rboard
.
Min
.
Y
+
lev
[
j
]
*
pcsz
;
r
.
Max
.
Y
=
rboard
.
Min
.
Y
+
lev
[
j
]
*
pcsz
;
draw
.
Draw
(
screen
,
r
.
Add
(
draw
.
Pt
(
0
,
pcsz
)),
screen
,
nil
,
r
.
Min
);
draw
.
Draw
(
screen
,
r
.
Add
(
draw
.
Pt
(
0
,
pcsz
)),
screen
,
nil
,
r
.
Min
);
r
.
Max
.
Y
=
rboard
.
Min
.
Y
+
pcsz
;
r
.
Max
.
Y
=
rboard
.
Min
.
Y
+
pcsz
;
draw
.
Draw
(
screen
,
r
,
draw
.
White
,
nil
,
draw
.
ZP
);
draw
.
Draw
(
screen
,
r
,
draw
.
White
,
nil
,
draw
.
ZP
);
for
k
:=
lev
[
j
]
-
1
;
k
>=
0
;
k
--
{
for
k
:=
lev
[
j
]
-
1
;
k
>=
0
;
k
--
{
board
[
k
+
1
]
=
board
[
k
];
board
[
k
+
1
]
=
board
[
k
];
...
@@ -470,8 +480,8 @@ func horiz() bool {
...
@@ -470,8 +480,8 @@ func horiz() bool {
}
}
func
mright
()
{
func
mright
()
{
if
!
collide
(
draw
.
Pt
(
pos
.
X
+
pcsz
,
pos
.
Y
),
piece
)
if
!
collide
(
draw
.
Pt
(
pos
.
X
+
pcsz
,
pos
.
Y
),
piece
)
&&
&&
!
collide
(
draw
.
Pt
(
pos
.
X
+
pcsz
,
pos
.
Y
+
pcsz
-
DY
),
piece
)
{
!
collide
(
draw
.
Pt
(
pos
.
X
+
pcsz
,
pos
.
Y
+
pcsz
-
DY
),
piece
)
{
undrawpiece
();
undrawpiece
();
pos
.
X
+=
pcsz
;
pos
.
X
+=
pcsz
;
drawpiece
();
drawpiece
();
...
@@ -480,8 +490,8 @@ func mright() {
...
@@ -480,8 +490,8 @@ func mright() {
}
}
func
mleft
()
{
func
mleft
()
{
if
!
collide
(
draw
.
Pt
(
pos
.
X
-
pcsz
,
pos
.
Y
),
piece
)
if
!
collide
(
draw
.
Pt
(
pos
.
X
-
pcsz
,
pos
.
Y
),
piece
)
&&
&&
!
collide
(
draw
.
Pt
(
pos
.
X
-
pcsz
,
pos
.
Y
+
pcsz
-
DY
),
piece
)
{
!
collide
(
draw
.
Pt
(
pos
.
X
-
pcsz
,
pos
.
Y
+
pcsz
-
DY
),
piece
)
{
undrawpiece
();
undrawpiece
();
pos
.
X
-=
pcsz
;
pos
.
X
-=
pcsz
;
drawpiece
();
drawpiece
();
...
@@ -509,13 +519,13 @@ var fusst = 0
...
@@ -509,13 +519,13 @@ var fusst = 0
func
drop
(
f
bool
)
bool
{
func
drop
(
f
bool
)
bool
{
if
f
{
if
f
{
score
(
5
*
(
rboard
.
Max
.
Y
-
pos
.
Y
)
/
pcsz
);
score
(
5
*
(
rboard
.
Max
.
Y
-
pos
.
Y
)
/
pcsz
);
for
movepiece
()
{
for
movepiece
()
{
}
}
}
}
fusst
=
0
;
fusst
=
0
;
rest
();
rest
();
if
pos
.
Y
==
rboard
.
Min
.
Y
&&
!
horiz
()
{
if
pos
.
Y
==
rboard
.
Min
.
Y
&&
!
horiz
()
{
return
true
;
return
true
;
}
}
horiz
();
horiz
();
...
@@ -536,7 +546,7 @@ func play() {
...
@@ -536,7 +546,7 @@ func play() {
for
{
for
{
select
{
select
{
case
mouse
=
<-
mousec
:
case
mouse
=
<-
mousec
:
if
suspended
{
if
suspended
{
om
=
mouse
;
om
=
mouse
;
break
;
break
;
}
}
...
@@ -551,15 +561,15 @@ func play() {
...
@@ -551,15 +561,15 @@ func play() {
mleft
();
mleft
();
lastmx
=
mouse
.
X
;
lastmx
=
mouse
.
X
;
}
}
if
mouse
.
Buttons
&^
om
.
Buttons
&
1
==
1
{
if
mouse
.
Buttons
&^
om
.
Buttons
&
1
==
1
{
rleft
();
rleft
();
}
}
if
mouse
.
Buttons
&^
om
.
Buttons
&
2
==
2
{
if
mouse
.
Buttons
&^
om
.
Buttons
&
2
==
2
{
if
drop
(
true
)
{
if
drop
(
true
)
{
return
;
return
;
}
}
}
}
if
mouse
.
Buttons
&^
om
.
Buttons
&
4
==
4
{
if
mouse
.
Buttons
&^
om
.
Buttons
&
4
==
4
{
rright
();
rright
();
}
}
om
=
mouse
;
om
=
mouse
;
...
@@ -579,7 +589,7 @@ func play() {
...
@@ -579,7 +589,7 @@ func play() {
if
suspended
{
if
suspended
{
break
;
break
;
}
}
switch
(
r
)
{
switch
r
{
case
'f'
,
';'
:
case
'f'
,
';'
:
mright
();
mright
();
case
'a'
,
'j'
:
case
'a'
,
'j'
:
...
@@ -601,7 +611,7 @@ func play() {
...
@@ -601,7 +611,7 @@ func play() {
dt
-=
tsleep
;
dt
-=
tsleep
;
if
dt
<
0
{
if
dt
<
0
{
i
:=
1
;
i
:=
1
;
dt
=
16
*
(
points
+
rand
.
Intn
(
10000
)
-
5000
)
/
10000
;
dt
=
16
*
(
points
+
rand
.
Intn
(
10000
)
-
5000
)
/
10000
;
if
dt
>=
32
{
if
dt
>=
32
{
i
+=
(
dt
-
32
)
/
16
;
i
+=
(
dt
-
32
)
/
16
;
dt
=
32
;
dt
=
32
;
...
@@ -656,17 +666,17 @@ func suspproc() {
...
@@ -656,17 +666,17 @@ func suspproc() {
}
}
func
redraw
(
new
bool
)
{
func
redraw
(
new
bool
)
{
// if new && getwindow(display, Refmesg) < 0 {
// if new && getwindow(display, Refmesg) < 0 {
// sysfatal("can't reattach to window");
// sysfatal("can't reattach to window");
// }
// }
r
:=
draw
.
Rect
(
0
,
0
,
screen
.
Width
(),
screen
.
Height
());
r
:=
draw
.
Rect
(
0
,
0
,
screen
.
Width
(),
screen
.
Height
());
pos
.
X
=
(
pos
.
X
-
rboard
.
Min
.
X
)
/
pcsz
;
pos
.
X
=
(
pos
.
X
-
rboard
.
Min
.
X
)
/
pcsz
;
pos
.
Y
=
(
pos
.
Y
-
rboard
.
Min
.
Y
)
/
pcsz
;
pos
.
Y
=
(
pos
.
Y
-
rboard
.
Min
.
Y
)
/
pcsz
;
dx
:=
r
.
Max
.
X
-
r
.
Min
.
X
;
dx
:=
r
.
Max
.
X
-
r
.
Min
.
X
;
dy
:=
r
.
Max
.
Y
-
r
.
Min
.
Y
-
2
*
32
;
dy
:=
r
.
Max
.
Y
-
r
.
Min
.
Y
-
2
*
32
;
DY
=
dx
/
NX
;
DY
=
dx
/
NX
;
if
DY
>
dy
/
NY
{
if
DY
>
dy
/
NY
{
DY
=
dy
/
NY
;
DY
=
dy
/
NY
;
}
}
DY
/=
8
;
DY
/=
8
;
if
DY
>
4
{
if
DY
>
4
{
...
@@ -678,19 +688,19 @@ func redraw(new bool) {
...
@@ -678,19 +688,19 @@ func redraw(new bool) {
log
.
Exitf
(
"screen too small: %d"
,
pcsz
);
log
.
Exitf
(
"screen too small: %d"
,
pcsz
);
}
}
rboard
=
screenr
;
rboard
=
screenr
;
rboard
.
Min
.
X
+=
(
dx
-
pcsz
*
NX
)
/
2
;
rboard
.
Min
.
X
+=
(
dx
-
pcsz
*
NX
)
/
2
;
rboard
.
Min
.
Y
+=
(
dy
-
pcsz
*
NY
)
/
2
+
32
;
rboard
.
Min
.
Y
+=
(
dy
-
pcsz
*
NY
)
/
2
+
32
;
rboard
.
Max
.
X
=
rboard
.
Min
.
X
+
NX
*
pcsz
;
rboard
.
Max
.
X
=
rboard
.
Min
.
X
+
NX
*
pcsz
;
rboard
.
Max
.
Y
=
rboard
.
Min
.
Y
+
NY
*
pcsz
;
rboard
.
Max
.
Y
=
rboard
.
Min
.
Y
+
NY
*
pcsz
;
pscore
.
X
=
rboard
.
Min
.
X
+
8
;
pscore
.
X
=
rboard
.
Min
.
X
+
8
;
pscore
.
Y
=
rboard
.
Min
.
Y
-
32
;
pscore
.
Y
=
rboard
.
Min
.
Y
-
32
;
// scoresz = stringsize(font, "000000");
// scoresz = stringsize(font, "000000");
pos
.
X
=
pos
.
X
*
pcsz
+
rboard
.
Min
.
X
;
pos
.
X
=
pos
.
X
*
pcsz
+
rboard
.
Min
.
X
;
pos
.
Y
=
pos
.
Y
*
pcsz
+
rboard
.
Min
.
Y
;
pos
.
Y
=
pos
.
Y
*
pcsz
+
rboard
.
Min
.
Y
;
bbr
=
draw
.
Rect
(
0
,
0
,
N
*
pcsz
,
N
*
pcsz
);
bbr
=
draw
.
Rect
(
0
,
0
,
N
*
pcsz
,
N
*
pcsz
);
bb
=
image
.
NewRGBA
(
bbr
.
Max
.
X
,
bbr
.
Max
.
Y
);
bb
=
image
.
NewRGBA
(
bbr
.
Max
.
X
,
bbr
.
Max
.
Y
);
bbmask
=
image
.
NewRGBA
(
bbr
.
Max
.
X
,
bbr
.
Max
.
Y
);
// actually just a bitmap
bbmask
=
image
.
NewRGBA
(
bbr
.
Max
.
X
,
bbr
.
Max
.
Y
);
// actually just a bitmap
bb2r
=
draw
.
Rect
(
0
,
0
,
N
*
pcsz
,
N
*
pcsz
+
DY
);
bb2r
=
draw
.
Rect
(
0
,
0
,
N
*
pcsz
,
N
*
pcsz
+
DY
);
bb2
=
image
.
NewRGBA
(
bb2r
.
Dx
(),
bb2r
.
Dy
());
bb2
=
image
.
NewRGBA
(
bb2r
.
Dx
(),
bb2r
.
Dy
());
bb2mask
=
image
.
NewRGBA
(
bb2r
.
Dx
(),
bb2r
.
Dy
());
// actually just a bitmap
bb2mask
=
image
.
NewRGBA
(
bb2r
.
Dx
(),
bb2r
.
Dy
());
// actually just a bitmap
draw
.
Draw
(
screen
,
screenr
,
draw
.
White
,
nil
,
draw
.
ZP
);
draw
.
Draw
(
screen
,
screenr
,
draw
.
White
,
nil
,
draw
.
ZP
);
...
@@ -716,10 +726,10 @@ func Play(pp []Piece, ctxt draw.Context) {
...
@@ -716,10 +726,10 @@ func Play(pp []Piece, ctxt draw.Context) {
pieces
=
pp
;
pieces
=
pp
;
N
=
len
(
pieces
[
0
]
.
d
);
N
=
len
(
pieces
[
0
]
.
d
);
initPieces
();
initPieces
();
rand
.
Seed
(
int32
(
time
.
Nanoseconds
()
%
(
1e9
-
1
)));
rand
.
Seed
(
int32
(
time
.
Nanoseconds
()
%
(
1e9
-
1
)));
whitemask
=
draw
.
White
.
SetAlpha
(
0x7F
);
whitemask
=
draw
.
White
.
SetAlpha
(
0x7F
);
tsleep
=
50
;
tsleep
=
50
;
timerc
=
time
.
Tick
(
int64
(
tsleep
/
2
)
*
1e6
);
timerc
=
time
.
Tick
(
int64
(
tsleep
/
2
)
*
1e6
);
suspc
=
make
(
chan
bool
);
suspc
=
make
(
chan
bool
);
mousec
=
make
(
chan
draw
.
Mouse
);
mousec
=
make
(
chan
draw
.
Mouse
);
resizec
=
ctxt
.
ResizeChan
();
resizec
=
ctxt
.
ResizeChan
();
...
...
src/pkg/exp/iterable/iterable.go
View file @
9786b3f1
...
@@ -12,77 +12,77 @@ import "container/vector"
...
@@ -12,77 +12,77 @@ import "container/vector"
type
Iterable
interface
{
type
Iterable
interface
{
// Iter should return a fresh channel each time it is called.
// Iter should return a fresh channel each time it is called.
Iter
()
<-
chan
interface
{}
Iter
()
<-
chan
interface
{};
}
}
func
not
(
f
func
(
interface
{})
bool
)
(
func
(
interface
{})
bool
)
{
func
not
(
f
func
(
interface
{})
bool
)
(
func
(
interface
{})
bool
)
{
return
func
(
e
interface
{})
bool
{
return
!
f
(
e
)
}
return
func
(
e
interface
{})
bool
{
return
!
f
(
e
)
};
}
}
// All tests whether f is true for every element of iter.
// All tests whether f is true for every element of iter.
func
All
(
iter
Iterable
,
f
func
(
interface
{})
bool
)
bool
{
func
All
(
iter
Iterable
,
f
func
(
interface
{})
bool
)
bool
{
for
e
:=
range
iter
.
Iter
()
{
for
e
:=
range
iter
.
Iter
()
{
if
!
f
(
e
)
{
if
!
f
(
e
)
{
return
false
return
false
;
}
}
}
}
return
true
return
true
;
}
}
// Any tests whether f is true for at least one element of iter.
// Any tests whether f is true for at least one element of iter.
func
Any
(
iter
Iterable
,
f
func
(
interface
{})
bool
)
bool
{
func
Any
(
iter
Iterable
,
f
func
(
interface
{})
bool
)
bool
{
return
!
All
(
iter
,
not
(
f
))
return
!
All
(
iter
,
not
(
f
))
;
}
}
// Data returns a slice containing the elements of iter.
// Data returns a slice containing the elements of iter.
func
Data
(
iter
Iterable
)
[]
interface
{}
{
func
Data
(
iter
Iterable
)
[]
interface
{}
{
vec
:=
vector
.
New
(
0
);
vec
:=
vector
.
New
(
0
);
for
e
:=
range
iter
.
Iter
()
{
for
e
:=
range
iter
.
Iter
()
{
vec
.
Push
(
e
)
vec
.
Push
(
e
)
;
}
}
return
vec
.
Data
()
return
vec
.
Data
()
;
}
}
// filteredIterable is a struct that implements Iterable with each element
// filteredIterable is a struct that implements Iterable with each element
// passed through a filter.
// passed through a filter.
type
filteredIterable
struct
{
type
filteredIterable
struct
{
it
Iterable
;
it
Iterable
;
f
func
(
interface
{})
bool
;
f
func
(
interface
{})
bool
;
}
}
func
(
f
*
filteredIterable
)
iterate
(
out
chan
<-
interface
{})
{
func
(
f
*
filteredIterable
)
iterate
(
out
chan
<-
interface
{})
{
for
e
:=
range
f
.
it
.
Iter
()
{
for
e
:=
range
f
.
it
.
Iter
()
{
if
f
.
f
(
e
)
{
if
f
.
f
(
e
)
{
out
<-
e
out
<-
e
;
}
}
}
}
close
(
out
)
close
(
out
)
;
}
}
func
(
f
*
filteredIterable
)
Iter
()
<-
chan
interface
{}
{
func
(
f
*
filteredIterable
)
Iter
()
<-
chan
interface
{}
{
ch
:=
make
(
chan
interface
{});
ch
:=
make
(
chan
interface
{});
go
f
.
iterate
(
ch
);
go
f
.
iterate
(
ch
);
return
ch
;
return
ch
;
}
}
// Filter returns an Iterable that returns the elements of iter that satisfy f.
// Filter returns an Iterable that returns the elements of iter that satisfy f.
func
Filter
(
iter
Iterable
,
f
func
(
interface
{})
bool
)
Iterable
{
func
Filter
(
iter
Iterable
,
f
func
(
interface
{})
bool
)
Iterable
{
return
&
filteredIterable
{
iter
,
f
}
return
&
filteredIterable
{
iter
,
f
};
}
}
// Find returns the first element of iter that satisfies f.
// Find returns the first element of iter that satisfies f.
// Returns nil if no such element is found.
// Returns nil if no such element is found.
func
Find
(
iter
Iterable
,
f
func
(
interface
{})
bool
)
interface
{}
{
func
Find
(
iter
Iterable
,
f
func
(
interface
{})
bool
)
interface
{}
{
for
e
:=
range
Filter
(
iter
,
f
)
.
Iter
()
{
for
e
:=
range
Filter
(
iter
,
f
)
.
Iter
()
{
return
e
return
e
;
}
}
return
nil
return
nil
;
}
}
// Injector is a type representing a function that takes two arguments,
// Injector is a type representing a function that takes two arguments,
// an accumulated value and an element, and returns the next accumulated value.
// an accumulated value and an element, and returns the next accumulated value.
// See the Inject function.
// See the Inject function.
type
Injector
func
(
interface
{},
interface
{})
interface
{};
type
Injector
func
(
interface
{},
interface
{})
interface
{}
// Inject combines the elements of iter by repeatedly calling f with an
// Inject combines the elements of iter by repeatedly calling f with an
// accumulated value and each element in order. The starting accumulated value
// accumulated value and each element in order. The starting accumulated value
...
@@ -92,42 +92,42 @@ type Injector func(interface {}, interface {}) interface{};
...
@@ -92,42 +92,42 @@ type Injector func(interface {}, interface {}) interface{};
// sum := iterable.Inject(arr, 0,
// sum := iterable.Inject(arr, 0,
// func(ax interface {}, x interface {}) interface {} {
// func(ax interface {}, x interface {}) interface {} {
// return ax.(int) + x.(int) }).(int)
// return ax.(int) + x.(int) }).(int)
func
Inject
(
iter
Iterable
,
initial
interface
{},
f
Injector
)
interface
{}
{
func
Inject
(
iter
Iterable
,
initial
interface
{},
f
Injector
)
interface
{}
{
acc
:=
initial
;
acc
:=
initial
;
for
e
:=
range
iter
.
Iter
()
{
for
e
:=
range
iter
.
Iter
()
{
acc
=
f
(
acc
,
e
)
acc
=
f
(
acc
,
e
)
;
}
}
return
acc
return
acc
;
}
}
// mappedIterable is a helper struct that implements Iterable, returned by Map.
// mappedIterable is a helper struct that implements Iterable, returned by Map.
type
mappedIterable
struct
{
type
mappedIterable
struct
{
it
Iterable
;
it
Iterable
;
f
func
(
interface
{})
interface
{};
f
func
(
interface
{})
interface
{};
}
}
func
(
m
*
mappedIterable
)
iterate
(
out
chan
<-
interface
{})
{
func
(
m
*
mappedIterable
)
iterate
(
out
chan
<-
interface
{})
{
for
e
:=
range
m
.
it
.
Iter
()
{
for
e
:=
range
m
.
it
.
Iter
()
{
out
<-
m
.
f
(
e
)
out
<-
m
.
f
(
e
)
;
}
}
close
(
out
)
close
(
out
)
;
}
}
func
(
m
*
mappedIterable
)
Iter
()
<-
chan
interface
{}
{
func
(
m
*
mappedIterable
)
Iter
()
<-
chan
interface
{}
{
ch
:=
make
(
chan
interface
{});
ch
:=
make
(
chan
interface
{});
go
m
.
iterate
(
ch
);
go
m
.
iterate
(
ch
);
return
ch
return
ch
;
}
}
// Map returns an Iterable that returns the result of applying f to each
// Map returns an Iterable that returns the result of applying f to each
// element of iter.
// element of iter.
func
Map
(
iter
Iterable
,
f
func
(
interface
{})
interface
{})
Iterable
{
func
Map
(
iter
Iterable
,
f
func
(
interface
{})
interface
{})
Iterable
{
return
&
mappedIterable
{
iter
,
f
}
return
&
mappedIterable
{
iter
,
f
};
}
}
// Partition(iter, f) returns Filter(iter, f) and Filter(iter, !f).
// Partition(iter, f) returns Filter(iter, f) and Filter(iter, !f).
func
Partition
(
iter
Iterable
,
f
func
(
interface
{})
bool
)
(
Iterable
,
Iterable
)
{
func
Partition
(
iter
Iterable
,
f
func
(
interface
{})
bool
)
(
Iterable
,
Iterable
)
{
return
Filter
(
iter
,
f
),
Filter
(
iter
,
not
(
f
))
return
Filter
(
iter
,
f
),
Filter
(
iter
,
not
(
f
))
;
}
}
// TODO:
// TODO:
...
...
src/pkg/exp/iterable/iterable_test.go
View file @
9786b3f1
...
@@ -8,82 +8,83 @@ import (
...
@@ -8,82 +8,83 @@ import (
"testing"
;
"testing"
;
)
)
type
IntArray
[]
int
;
type
IntArray
[]
int
func
(
arr
IntArray
)
Iter
()
<-
chan
interface
{}
{
func
(
arr
IntArray
)
Iter
()
<-
chan
interface
{}
{
ch
:=
make
(
chan
interface
{});
ch
:=
make
(
chan
interface
{});
go
func
()
{
go
func
()
{
for
_
,
x
:=
range
arr
{
for
_
,
x
:=
range
arr
{
ch
<-
x
ch
<-
x
;
}
}
close
(
ch
)
close
(
ch
)
;
}();
}();
return
ch
return
ch
;
}
}
var
oneToFive
=
IntArray
{
1
,
2
,
3
,
4
,
5
};
var
oneToFive
=
IntArray
{
1
,
2
,
3
,
4
,
5
}
func
isNegative
(
n
interface
{})
bool
{
func
isNegative
(
n
interface
{})
bool
{
return
n
.
(
int
)
<
0
return
n
.
(
int
)
<
0
;
}
}
func
isPositive
(
n
interface
{})
bool
{
func
isPositive
(
n
interface
{})
bool
{
return
n
.
(
int
)
>
0
return
n
.
(
int
)
>
0
;
}
}
func
isAbove3
(
n
interface
{})
bool
{
func
isAbove3
(
n
interface
{})
bool
{
return
n
.
(
int
)
>
3
return
n
.
(
int
)
>
3
;
}
}
func
isEven
(
n
interface
{})
bool
{
func
isEven
(
n
interface
{})
bool
{
return
n
.
(
int
)
%
2
==
0
return
n
.
(
int
)
%
2
==
0
;
}
}
func
doubler
(
n
interface
{})
interface
{}
{
func
doubler
(
n
interface
{})
interface
{}
{
return
n
.
(
int
)
*
2
return
n
.
(
int
)
*
2
;
}
}
func
addOne
(
n
interface
{})
interface
{}
{
func
addOne
(
n
interface
{})
interface
{}
{
return
n
.
(
int
)
+
1
return
n
.
(
int
)
+
1
;
}
}
func
adder
(
acc
interface
{},
n
interface
{})
interface
{}
{
func
adder
(
acc
interface
{},
n
interface
{})
interface
{}
{
return
acc
.
(
int
)
+
n
.
(
int
)
return
acc
.
(
int
)
+
n
.
(
int
)
;
}
}
// A stream of the natural numbers: 0, 1, 2, 3, ...
// A stream of the natural numbers: 0, 1, 2, 3, ...
type
integerStream
struct
{}
type
integerStream
struct
{}
func
(
i
integerStream
)
Iter
()
<-
chan
interface
{}
{
ch
:=
make
(
chan
interface
{});
func
(
i
integerStream
)
Iter
()
<-
chan
interface
{}
{
go
func
()
{
ch
:=
make
(
chan
interface
{});
for
i
:=
0
;
;
i
++
{
go
func
()
{
ch
<-
i
for
i
:=
0
;
;
i
++
{
}
ch
<-
i
;
}();
}
return
ch
}();
return
ch
;
}
}
func
TestAll
(
t
*
testing
.
T
)
{
func
TestAll
(
t
*
testing
.
T
)
{
if
!
All
(
oneToFive
,
isPositive
)
{
if
!
All
(
oneToFive
,
isPositive
)
{
t
.
Error
(
"All(oneToFive, isPositive) == false"
)
t
.
Error
(
"All(oneToFive, isPositive) == false"
)
;
}
}
if
All
(
oneToFive
,
isAbove3
)
{
if
All
(
oneToFive
,
isAbove3
)
{
t
.
Error
(
"All(oneToFive, isAbove3) == true"
)
t
.
Error
(
"All(oneToFive, isAbove3) == true"
)
;
}
}
}
}
func
TestAny
(
t
*
testing
.
T
)
{
func
TestAny
(
t
*
testing
.
T
)
{
if
Any
(
oneToFive
,
isNegative
)
{
if
Any
(
oneToFive
,
isNegative
)
{
t
.
Error
(
"Any(oneToFive, isNegative) == true"
)
t
.
Error
(
"Any(oneToFive, isNegative) == true"
)
;
}
}
if
!
Any
(
oneToFive
,
isEven
)
{
if
!
Any
(
oneToFive
,
isEven
)
{
t
.
Error
(
"Any(oneToFive, isEven) == false"
)
t
.
Error
(
"Any(oneToFive, isEven) == false"
)
;
}
}
}
}
func
assertArraysAreEqual
(
t
*
testing
.
T
,
res
[]
interface
{},
expected
[]
int
)
{
func
assertArraysAreEqual
(
t
*
testing
.
T
,
res
[]
interface
{},
expected
[]
int
)
{
if
len
(
res
)
!=
len
(
expected
)
{
if
len
(
res
)
!=
len
(
expected
)
{
t
.
Errorf
(
"len(res) = %v, want %v"
,
len
(
res
),
len
(
expected
));
t
.
Errorf
(
"len(res) = %v, want %v"
,
len
(
res
),
len
(
expected
));
goto
missing
goto
missing
;
}
}
for
i
:=
range
res
{
for
i
:=
range
res
{
if
v
:=
res
[
i
]
.
(
int
);
v
!=
expected
[
i
]
{
if
v
:=
res
[
i
]
.
(
int
);
v
!=
expected
[
i
]
{
t
.
Errorf
(
"res[%v] = %v, want %v"
,
i
,
v
,
expected
[
i
]);
t
.
Errorf
(
"res[%v] = %v, want %v"
,
i
,
v
,
expected
[
i
]);
goto
missing
goto
missing
;
}
}
}
}
return
;
return
;
...
@@ -94,35 +95,35 @@ missing:
...
@@ -94,35 +95,35 @@ missing:
func
TestFilter
(
t
*
testing
.
T
)
{
func
TestFilter
(
t
*
testing
.
T
)
{
ints
:=
integerStream
{};
ints
:=
integerStream
{};
moreInts
:=
Filter
(
ints
,
isAbove3
)
.
Iter
();
moreInts
:=
Filter
(
ints
,
isAbove3
)
.
Iter
();
res
:=
make
([]
interface
{},
3
);
res
:=
make
([]
interface
{},
3
);
for
i
:=
0
;
i
<
3
;
i
++
{
for
i
:=
0
;
i
<
3
;
i
++
{
res
[
i
]
=
<-
moreInts
;
res
[
i
]
=
<-
moreInts
;
}
}
assertArraysAreEqual
(
t
,
res
,
[]
int
{
4
,
5
,
6
})
assertArraysAreEqual
(
t
,
res
,
[]
int
{
4
,
5
,
6
});
}
}
func
TestFind
(
t
*
testing
.
T
)
{
func
TestFind
(
t
*
testing
.
T
)
{
ints
:=
integerStream
{};
ints
:=
integerStream
{};
first
:=
Find
(
ints
,
isAbove3
);
first
:=
Find
(
ints
,
isAbove3
);
if
first
.
(
int
)
!=
4
{
if
first
.
(
int
)
!=
4
{
t
.
Errorf
(
"Find(ints, isAbove3) = %v, want 4"
,
first
)
t
.
Errorf
(
"Find(ints, isAbove3) = %v, want 4"
,
first
)
;
}
}
}
}
func
TestInject
(
t
*
testing
.
T
)
{
func
TestInject
(
t
*
testing
.
T
)
{
res
:=
Inject
(
oneToFive
,
0
,
adder
);
res
:=
Inject
(
oneToFive
,
0
,
adder
);
if
res
.
(
int
)
!=
15
{
if
res
.
(
int
)
!=
15
{
t
.
Errorf
(
"Inject(oneToFive, 0, adder) = %v, want 15"
,
res
)
t
.
Errorf
(
"Inject(oneToFive, 0, adder) = %v, want 15"
,
res
)
;
}
}
}
}
func
TestMap
(
t
*
testing
.
T
)
{
func
TestMap
(
t
*
testing
.
T
)
{
res
:=
Data
(
Map
(
Map
(
oneToFive
,
doubler
),
addOne
));
res
:=
Data
(
Map
(
Map
(
oneToFive
,
doubler
),
addOne
));
assertArraysAreEqual
(
t
,
res
,
[]
int
{
3
,
5
,
7
,
9
,
11
})
assertArraysAreEqual
(
t
,
res
,
[]
int
{
3
,
5
,
7
,
9
,
11
});
}
}
func
TestPartition
(
t
*
testing
.
T
)
{
func
TestPartition
(
t
*
testing
.
T
)
{
ti
,
fi
:=
Partition
(
oneToFive
,
isEven
);
ti
,
fi
:=
Partition
(
oneToFive
,
isEven
);
assertArraysAreEqual
(
t
,
Data
(
ti
),
[]
int
{
2
,
4
});
assertArraysAreEqual
(
t
,
Data
(
ti
),
[]
int
{
2
,
4
});
assertArraysAreEqual
(
t
,
Data
(
fi
),
[]
int
{
1
,
3
,
5
})
assertArraysAreEqual
(
t
,
Data
(
fi
),
[]
int
{
1
,
3
,
5
});
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment