2048

俗气的2048

新手教学向,没有任何优化和程序设计在里边
整个程序设计是这样的。首先读入文件。然后用execute()函数控制整个运算流程。按键按下后,首先调用trans()函数把所有的字符向该方向移动紧密,然后调用addup()函数把临近相同的处理掉,然后调用trans()函数把处理后的向同一个方向移动。
init()函数是这样的,如果type是1,那么在判定是不是可以继续游戏之后要在是0的位置随机生成2,如果type是0,那么直判定是不是可以继续。
init()其中的随机生成写的比较难懂,可以仔细分析一下就不难明白了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <iostream>
#include <fstream>
#define NUM 4

using namespace std;

/*****************************
* output the Map
*****************************/

void output(int Map[NUM][NUM]){
int i,j;
for(i = 0;i < NUM;++ i){
for(j = 0;j < NUM;++ j){
cout << Map[i][j] << '\t';
}
cout << endl;
}
}

/********************************************
* Transfer every cell to the right direction
* @para Map:The Map
* type: The direction
********************************************/
void trans(int Map[NUM][NUM], char type){
int i,j,k;
if(type == 'w'){
for(i = 0;i < NUM - 1;++ i){
for(j = 0;j < NUM;++ j){
if(!Map[i][j]) {
for(k = i + 1;k < NUM;++ k){
if(Map[k][j]){
Map[i][j] = Map[k][j];
Map[k][j] = 0;
k = NUM;
}
}
}
}
}
}
if(type == 'd'){
for(i = 0;i < NUM;++ i){
for(j = NUM - 1;j > 0;-- j){
for(k = j - 1;k >= 0;-- k){
if(!Map[i][j]){
if(Map[i][k]){
Map[i][j] = Map[i][k];
Map[i][k] = 0;
k = -1;
}
}
}
}
}
}
if(type == 's'){
for(i = NUM - 1;i > 0;-- i){
for(j = 0;j < NUM;++ j)
if(!Map[i][j]) {
for(k = i - 1;k >= 0;-- k){
if(Map[k][j]){
Map[i][j] = Map[k][j];
Map[k][j] = 0;
k = -1;
}
}
}
}
}
if(type == 'a'){
for(i = 0;i < NUM;++ i){
for(j = 0;j < NUM - 1;++ j)
if(!Map[i][j]){
for(k = j + 1;k < NUM;++ k){
if(Map[i][k]){
Map[i][j] = Map[i][k];
Map[i][k] = 0;
k = NUM;
}
}
}
}
}
}

/********************************************
* get new cell
* @para Map:The Map
* type:
* 1 : check the Map and add a new cell
* 0 : only check the Map
********************************************/
bool init(int Map[NUM][NUM], int type){
int flag[NUM * NUM];
memset(flag,0,sizeof(flag));
int i,j,cnt = 0;
for(i = 0;i < NUM;++ i){
for(j = 0;j < NUM;++ j){
if(!Map[i][j]) flag[cnt ++] = i * 4 + j;
}
}
if(!type) return cnt;
if(cnt){
int rnd = rand() % cnt;
rnd = flag[rnd];
Map[rnd / 4][rnd % 4] = 2;
return true;
}
return false;
}

/********************************************
* if a cell is equal to the next one, add up them
* @para Map:The Map
* type: the direction
********************************************/

void addup(int Map[NUM][NUM],char type){
int i,j,dir;
if(type == 'a'){
for(i = 0;i < NUM;++ i){
for(j = 0;j < NUM - 1;++ j){
if(Map[i][j] == Map[i][j + 1]){
Map[i][j] <<= 1;
Map[i][j + 1] = 0;
}
}
}
}else if(type == 'w'){
for(i = 0;i < NUM - 1;++ i){
for(j = 0;j < NUM;++ j){
if(Map[i][j] == Map[i + 1][j]){
Map[i][j] <<= 1;
Map[i + 1][j] = 0;
}
}
}
}else if(type == 'd'){
for(i = NUM - 1;i >= 0;-- i){
for(j = NUM - 1;j > 0;-- j){
if(Map[i][j] == Map[i][j - 1]){
Map[i][j] <<= 1;
Map[i][j - 1] = 0;
}
}
}
}else if(type == 's'){
for(i = NUM - 1;i > 0;-- i){
for(j = NUM - 1;j >= 0;-- j){
if(Map[i][j] == Map[i - 1][j]){
Map[i][j] <<= 1;
Map[i - 1][j] = 0;
}
}
}
}
}

bool execute(int Map[NUM][NUM],char type){
int i,j,k;
if(type != 'w' && type != 's' && type != 'a' && type != 'd'){
if(type == 10) ;
else printf("Input error\n");
return true;
}

trans(Map,type);

addup(Map,type);

trans(Map,type);

if(init(Map,1)){
output(Map);
return true;
}
output(Map);
printf("Game over\n");
return false;
}

int main(){
int i,j;
int Map[NUM][NUM];
char inputFile[20];
char input;
srand((unsigned)time(NULL));
cout << "Please input the path of the configuration file:" << endl;
cin >> inputFile;
ifstream file(inputFile);
memset(Map,0,NUM * NUM * sizeof(int));
if(file == NULL){
Map[NUM - 1][NUM - 1] = 2;
cout << "Configuration file not found, the map are initialed as the default one" << endl;
output(Map);
}else{
for(i = 0;i < 4;++ i)
for(j = 0;j < 4;++ j)
file >> Map[i][j];
if(!init(Map,0)) {
output(Map);
cout << "Game over!" << endl;
return 0;
}
cout << "The map are initialed" << endl;
output(Map);
}
do{
cin >> input;
}while(execute(Map,input));

return 0;
}

Contents
,