2048小游戏(C语言版)

  1 #include <climits>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <stack>
  5 #include <string>
  6 #include <map>
  7 #include <vector>
  8 #include <cmath>
  9 
 10 
 11 /*
 12 玩法说明:编译运行后,输入一个整数n,表示自己想玩的游戏中是n*n的表格,现在手机上或者电脑上一般都是4*4的,所以我们可以输入4,回车就可以开始游戏了。
 13 
 14 游戏开始后a s d w表示方向左 下 右 上四个方向。 
 15 
 16 正如真实版的2048一样,会输出两个表格,move 表格显示按输入方向平移后的结果,fill 表格显示又随机填充一个格子后的表格
 17 */
 18 using namespace std;
 19 
 20 const int MAXX = 10;
 21 
 22 int box[MAXX][MAXX];
 23 
 24 void moveLeft(int n, bool &ret){
 25     for (int i = 0; i < n; ++i){
 26         for (int j = 0; j < n; ++j){
 27             int k;
 28             for (k = j - 1; k >= 0; --k){
 29                 if (box[i][k] != -1){
 30                     break;
 31                 }
 32             }
 33             box[i][k + 1] = box[i][j];
 34 
 35             if ((k + 1) != j){
 36                 box[i][j] = -1;
 37                 ret = true;
 38             }
 39         }
 40     }
 41 }
 42 
 43 void mergeLeft(int n, bool &ret){
 44     for (int i = 0; i < n; ++i){
 45         for (int j = 0; j < n - 1; ++j){
 46             if (box[i][j] == -1)continue;
 47 
 48             if (box[i][j] == box[i][j + 1]){
 49                 box[i][j] *= 2;
 50                 box[i][j + 1] = -1;
 51                 ret = true;
 52                 ++j;
 53             }
 54         }
 55     }
 56 }
 57 
 58 bool left(int n){
 59     bool ret = false;
 60     moveLeft(n, ret);
 61     mergeLeft(n, ret);
 62     moveLeft(n, ret);
 63     return ret;
 64 }
 65 
 66 void moveRight(int n, bool &ret){
 67     for (int i = 0; i < n; ++i){
 68         for (int j = n - 1; j >= 0; --j){
 69             if (box[i][j] == -1)continue;
 70 
 71             int k;
 72             for (k = j + 1; k < n; ++k){
 73                 if (box[i][k] != -1){
 74                     break;
 75                 }
 76             }
 77 
 78             box[i][k - 1] = box[i][j];
 79             if ((k - 1) != j){
 80                 box[i][j] = -1;
 81                 ret = true;
 82             }
 83         }
 84     }
 85 }
 86 
 87 void mergeRight(int n, bool &ret){
 88     for (int i = 0; i < n; ++i){
 89         for (int j = n - 1; j >0; --j){
 90             if (box[i][j] == -1)continue;
 91 
 92             if (box[i][j] == box[i][j - 1]){
 93                 box[i][j] *= 2;
 94                 box[i][j - 1] = -1;
 95                 ret = true;
 96                 --j;
 97             }
 98         }
 99     }
100 }
101 
102 bool right(int n){
103     bool ret = false;
104     moveRight(n, ret);
105     mergeRight(n, ret);
106     moveRight(n, ret);
107     return ret;
108 }
109 
110 void moveUp(int n, bool &ret){
111     for (int j = 0; j < n; ++j){
112         for (int i = 0; i < n; ++i){
113             int k;
114             for (k = i - 1; k >= 0; --k){
115                 if (box[k][j] != -1){
116                     break;
117                 }
118             }
119             box[k + 1][j] = box[i][j];
120 
121             if ((k + 1) != i){
122                 box[i][j] = -1;
123                 ret = true;
124             }
125         }
126     }
127 }
128 
129 void mergeUp(int n, bool &ret){
130     for (int j = 0; j < n; ++j){
131         for (int i = 0; i < n - 1; ++i){
132             if (box[i][j] == -1)continue;
133 
134             if (box[i][j] == box[i + 1][j]){
135                 box[i][j] *= 2;
136                 box[i + 1][j] = -1;
137                 ret = true;
138                 ++i;
139             }
140         }
141     }
142 }
143 
144 bool up(int n){
145     bool ret = false;
146     moveUp(n, ret);
147     mergeUp(n, ret);
148     moveUp(n, ret);
149     return ret;
150 }
151 
152 void moveDown(int n, bool &ret){
153     for (int j = 0; j < n; ++j){
154         for (int i = n - 1; i >= 0; --i){
155             if (box[i][j] == -1)continue;
156 
157             int k;
158             for (k = i + 1; k < n; ++k){
159                 if (box[k][j] != -1)break;
160             }
161 
162             box[k - 1][j] = box[i][j];
163 
164             if ((k - 1) != i){
165                 box[i][j] = -1;
166                 ret = true;
167             }
168         }
169     }
170 }
171 
172 void mergeDown(int n, bool &ret){
173     for (int j = 0; j < n; ++j){
174         for (int i = n - 1; i > 0; --i){
175             if (box[i][j] == -1)continue;
176 
177             if (box[i][j] == box[i - 1][j]){
178                 box[i][j] *= 2;
179                 box[i - 1][j] = -1;
180                 ret = true;
181                 --i;
182             }
183         }
184     }
185 }
186 
187 bool down(int n){
188     bool ret = false;
189     moveDown(n, ret);
190     mergeDown(n, ret);
191     moveDown(n, ret);
192     return ret;
193 }
194 
195 void line(int n){
196     for (int i = 0; i < n; ++i){
197         printf("--------");
198     }
199     printf("-");
200     printf("\n");
201 }
202 
203 void print(int n){
204     for (int i = 0; i < n; ++i){
205         line(n);
206         for (int j = 0; j < n; ++j){
207             printf("|");
208             if (box[i][j] == -1){
209                 printf("\t");
210                 continue;
211             }
212 
213             printf("%2d\t", box[i][j]);
214         }
215         printf("|");
216         printf("\n");
217     }
218     line(n);
219 }
220 
221 bool isFull(int n){
222     bool mark = true;
223     for (int i = 0; i < n; ++i){
224         for (int j = 0; j < n; ++j){
225             if (box[i][j] == -1){
226                 mark = false;
227                 return mark;
228             }
229         }
230     }
231     return mark;
232 }
233 
234 bool isOver(int n){
235     if (!isFull(n)){
236         return false;
237     }
238     for (int i = 0; i < n; ++i){
239         for (int j = 0; j < n; ++j){
240             if (box[i][j] == box[i][j + 1] || box[i][j] == box[i + 1][j]){
241                 return false;
242             }
243         }
244     }
245     return true;
246 }
247 
248 void fillBox(int n){
249     int i, j, num;
250 
251     if (isFull(n)){
252         return;
253     }
254 
255     while (true){
256         i = rand() % n;
257         j = rand() % n;
258         num = rand() % 2 == 0 ? 2 : 4;
259 
260         if (box[i][j] == -1){
261             box[i][j] = num;
262             break;
263         }
264     }
265 }
266 
267 int main(){
268     //freopen("in.txt", "r", stdin);
269     memset(box, -1, sizeof(box));
270 
271     int n;
272     bool mark;
273     scanf("%d%*c", &n);
274 
275     fillBox(n);
276     fillBox(n);
277     print(n);
278 
279     while (true){
280         char ch;
281         scanf("%c%*c", &ch);
282         if (ch == 'a'){
283             mark = left(n);
284         }
285         else if (ch == 'd'){
286             mark = right(n);
287         }
288         else if (ch == 'w'){
289             mark = up(n);
290         }
291         else if (ch == 's'){
292             mark = down(n);
293         }
294         else{
295             continue;
296         }
297         system("cls");
298         printf("Move:\n");
299         print(n);
300         if (!mark){
301             continue;
302         }
303         fillBox(n);
304         printf("Fill:\n");
305         print(n);
306 
307         if (isOver(n)){
308             printf("\n\nGame Over!\n\n");
309             break;
310         }
311     }
312     
313     
314     return 0;
315 }

 

posted @ 2014-08-04 20:01  HuijunZhang  阅读(644)  评论(0编辑  收藏  举报
中国