/* Same Copyright (c) 1998, Robby Findler http://www.cs.uchicago.edu/~robby/ This program fully redistributable, as long as the above copyright remains intact. */ import java.lang.Character.*; import java.lang.Boolean.*; import java.awt.event.*; import java.awt.*; import java.applet.Applet; import java.io.*; interface Predicate { boolean compare(Object n1,Object n2); } interface Function { Object f(Object n,Object o); } interface Iterator { void f(Object n); } interface List { List Sort (Predicate p); List Insert (Predicate p, Object n); int Length(); boolean NotNullp(); boolean Nullp(); Object Foldr(Function f, Object o); void ForEach(Iterator f); public List Reverse(); public List ReverseHelp(List m); } class Node { Color color; boolean visited = false; int i; int j; public Node(java.awt.Color _color, int _i, int _j) { color=_color; i=_i; j=_j; } public String toString() { return new String("(" + i + " " + j + " " + color + ")"); } public void set_visit(boolean _visited) { visited = _visited; } public void set_color(Color _color) { color = _color; } public void set_ij(int _i, int _j) { i=_i; j=_j; } } class Null implements List { static public List NULL = new Null(); public Null() {} public int Length() {return 0;} public List Sort(Predicate p) {return this;} public List Insert(Predicate p,Object item) {return new Cons(item,this);} public boolean Nullp() {return true;} public boolean NotNullp() {return false;} public String toString() {return new String("");} public Object Foldr(Function f, Object o) {return o;} public void ForEach(Iterator f) {} public List Reverse() {return this;} public List ReverseHelp(List m) {return m;} } class Cons implements List { Object hd; List tl; public Cons(Object _hd, List _tl) { hd=_hd; tl=_tl; } public int Length () { return 1 + tl.Length(); } public List Sort(Predicate p) { return tl.Sort(p).Insert(p,hd); } public List Insert(Predicate p, Object n) { if (p.compare(hd,n)) { return new Cons(hd, tl.Insert(p,n)); } else { return new Cons (n,this); } } public boolean NotNullp() {return true;} public boolean Nullp() {return false;} public String toString() {return new String(hd.toString()+ tl.toString());} public void ForEach(Iterator f) { f.f(hd); tl.ForEach(f); } public Object Foldr(Function f, Object o) { return tl.Foldr(f,f.f(hd,o)); } public List ReverseHelp(List m) { return tl.ReverseHelp(new Cons (hd,m));} public List Reverse() {return ReverseHelp(Null.NULL);} } class SortJ implements Predicate { public boolean compare(Object n1,Object n2) { return ((Node)n1).j < ((Node)n2).j; } } interface BoardListener { void EraseGameOver(); void ColumnChanged(int i); void GameOver(); } interface ScoreListener { void ScoreChanged(int new_score); } class Move { int score; int i; int j; public Move(int _score, int _i, int _j) { i=_i; j=_j; score=_score; } } class SameGame { int score = 0; static int board_width = 20; static int board_height = 10; boolean game_over = false; Node[][] board = null; List moves = Null.NULL; void initialize_board(long seed) { int num_colors = 5; java.awt.Color colors[] = new java.awt.Color[num_colors]; colors[0] = java.awt.Color.blue; colors[1] = java.awt.Color.red; colors[2] = java.awt.Color.magenta; colors[3] = java.awt.Color.yellow; colors[4] = java.awt.Color.cyan; java.util.Random r = new java.util.Random(seed); board = new Node[board_width][board_height]; for (int i=0; i < board_width; i++) { for (int j=0; j < board_height; j++) { int ci = (int)(r.nextFloat() * num_colors); if (ci == 5) { ci = 0; } /* if (j == board_height-1) { board[i][j]=new Node (colors[num_colors-1],i,j); } else { board[i][j]=new Node (colors[i % (num_colors-1)],i,j); } */ //board[i][j]=new Node(colors[i % num_colors],i,j); //board[i][j]=new Node(colors[0],i,j); board[i][j]=new Node(colors[ci],i,j); } } } public void Restart(long seed) { SetScore(0); game_over=false; moves = Null.NULL; initialize_board(seed); board_listeners.ForEach(new BoardListenersEraseGameOver()); for (int i = 0; i < board_width; i++) { board_listeners.ForEach(new BoardListenersRedrawColumn(i)); } } public SameGame (long seed) { initialize_board(seed); } private List find_some_colors_help (Color looking, int i, int j, List cells) { if (0 <= i && i < board_width && 0 <= j && j < board_height) { Node n = board[i][j]; if (! n.visited && n.color == looking) { n.set_visit(true); return find_some_colors_help (looking, i-1,j, find_some_colors_help (looking, i+1,j, find_some_colors_help (looking, i,j-1, find_some_colors_help (looking, i,j+1, new Cons(n, cells))))); } else { return cells; } } else { return cells; } } public List find_some_colors (int i, int j) { Node n = board[i][j]; if (n.color != java.awt.Color.white) { List cells = find_some_colors_help(n.color, i, j, Null.NULL); class ResetVisit implements Iterator { public void f (Object n) { ((Node)n).set_visit(false); return ; } } cells.ForEach(new ResetVisit()); return cells; } return Null.NULL; } class CallScoreListeners implements Iterator { int new_score; public CallScoreListeners(int _new_score) { new_score=_new_score; } public void f (Object sl) { ((ScoreListener)sl).ScoreChanged(new_score); } } List score_listeners = Null.NULL; public void AddScoreListener(ScoreListener s) { score_listeners=new Cons(s,score_listeners); } public void SetScore(int new_score) { score=new_score; score_listeners.ForEach(new CallScoreListeners(new_score)); } public int calc_score(int n) { if (n == 2) { return 2; } else { return (n-1)*(n-1) - (n-3); } } List board_listeners=Null.NULL; public void AddBoardListener(BoardListener b) { board_listeners = new Cons (b,board_listeners); } class BoardListenersEraseGameOver implements Iterator { public void f(Object board_listener) { ((BoardListener)board_listener).EraseGameOver(); } } class BoardListenersRedrawColumn implements Iterator { int column; public BoardListenersRedrawColumn (int _column) { column=_column; } public void f(Object board_listener) { ((BoardListener)board_listener).ColumnChanged(column); } } class BoardListenersGameOver implements Iterator { public void f(Object board_listener) { ((BoardListener)board_listener).GameOver(); } } // returns true if something changed; false otherwise public boolean RemoveAt (int i, int j) { List cells = find_some_colors (i,j); int l; // loop variable int m; // loop variable // if the user found something to delete if (cells.Nullp() || ((Cons)cells).tl.Nullp()) { return false; } SetScore(score + calc_score(cells.Length())); // update the moves list with current move moves = new Cons(new Move (score,i,j),moves); final Boolean changed[] = new Boolean[board_width]; // slide rows down class SlideDown implements Iterator { public void f (Object _n) { Node n = ((Node)_n); changed[n.i] = java.lang.Boolean.TRUE; for (int q = n.j; q > 0 ; q--) { board[n.i][q].set_color(board[n.i][q-1].color); } board[n.i][0].set_color(java.awt.Color.white); } } cells.Sort(new SortJ()).ForEach(new SlideDown()); // slide columns over for (m=board_width-1 ; m >= 0 ; m--) { if (board[m][board_height-1].color == java.awt.Color.white) { for (l = m; l <= board_width-2; l++) { changed[l] = java.lang.Boolean.TRUE; board[l]=board[l+1]; } changed[board_width-1]=java.lang.Boolean.TRUE; board[board_width-1]=new Node[board_height]; for (l=0; lError -- not post method "); return; } */ build_bindings(new FileReader ("sample-input.txt")); int score = fetch_int("SCORE"); System.out.println("score " + score); long seed = fetch_long("SEED"); System.out.println("seed " + seed); List l = fetch_moves(); SameGame s = new SameGame(seed); l.ForEach(new PlayBoard(s)); if (s.score == score) { System.out.println("passed"); } else { System.out.println("match failed"); } System.out.println("SameServer"); } static public void main (String[] argv) throws FileNotFoundException { new SameServer(); } }