2196f40429a9b6abfb5f0356b73b147be1f7ddae
[sdk] / samples / games / brainstonz / game.ec
1 import Ã"ecere"
2
3 enum Stone { none, black, white };
4
5 int symbols[4][4] =
6 {
7    { 0, 1, 2, 3 },
8    { 4, 5, 6, 1 },
9    { 6, 7, 5, 4 },
10    { 2, 3, 0, 7 }
11 };
12
13 class BrainStonzGame
14 {
15    int movesLeft;
16    movesLeft = 1;
17    Stone turn;
18    bool takeOut;
19    Stone winner;
20    int numStones[Stone];
21    Stone stones[4][4];
22    turn = white;
23    int numPlayers;
24
25    void NewGame()
26    {
27       numStones[black] = 12;
28       numStones[white] = 12;
29       memset(stones, 0, sizeof(stones));
30       turn = white;
31       movesLeft = 1;
32       winner = none;
33    }
34
35    bool ProcessMove(int sx, int sy)
36    {
37       bool played = false;
38       if(takeOut)
39       {
40          Stone opponent = (turn == white) ? black : white;
41          if(stones[sy][sx] == opponent)
42          {
43             numStones[opponent]++;
44             stones[sy][sx] = none;
45             takeOut = false;
46             played = true;
47             
48          }
49       }
50       else if(movesLeft && !stones[sy][sx])
51       {
52          int y, i;
53          int symbol = symbols[sy][sx];
54          if(numStones[turn] > 0)
55             numStones[turn]--;
56          
57          for(y = 0; y < 4; y++)
58          {
59             int x;
60             for(x = 0; x < 4; x++)
61                if((y != sy || x != sx) && symbols[y][x] == symbol)
62                {
63                   if(stones[y][x] == turn)
64                      takeOut = true;
65                   break;
66                }
67          }
68          
69          stones[sy][sx] = turn;
70
71          // Check for win
72          for(i = 0; i < 4; i++)
73          {
74             int j;
75             for(j = 0; j < 4; j++)
76                if(stones[i][j] != turn)
77                   break;
78             if(j == 4)
79                winner = turn;
80
81             for(j = 0; j < 4; j++)
82                if(stones[j][i] != turn)
83                   break;
84             if(j == 4)
85                winner = turn;
86          }
87          for(i = 0; i < 4; i++)
88             if(stones[i][i] != turn)
89                break;
90          if(i == 4)
91             winner = turn;
92
93          for(i = 0; i < 4; i++)
94             if(stones[3-i][i] != turn)
95                break;
96          if(i == 4)
97             winner = turn;
98
99          played = true;
100       }
101       if(played)
102       {
103          if(!takeOut && !--movesLeft && !winner)
104          {
105             turn = (turn == black) ? white : black;
106             movesLeft = 2;
107          }
108       }
109       return played;
110    }
111 }
112
113 BrainStonzGame game { };
114
115 class GameConnection
116 {
117    Stone color;
118
119 public:
120    Stone Join()
121    {
122       if(game.numPlayers < 2)
123       {
124          color = game.numPlayers ? black : white;
125          game.numPlayers++;
126       }
127       return color;
128    }
129     
130    void NewGame()
131    {
132       game.NewGame();
133    }
134
135    bool Click(int x, int y)
136    {
137       if(game.turn == color)
138          return game.ProcessMove(x, y);
139       return false;
140    }
141 }