├── README.md └── game_2048.c /README.md: -------------------------------------------------------------------------------- 1 | # game_2048 2 | 在实验楼学习的C语言项目,2048小游戏。 3 | -------------------------------------------------------------------------------- /game_2048.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | int a[4][4] = {0}; 9 | int empty; 10 | int old_y, old_x; 11 | 12 | void draw(); 13 | void play(); 14 | void init(); 15 | void draw_one(int y, int x); 16 | void cnt_value(int *new_y, int *new_x); 17 | int game_over(); 18 | int cnt_one(int y, int x); 19 | 20 | int main() 21 | { 22 | init(); 23 | play(); 24 | endwin(); 25 | 26 | return 0; 27 | } 28 | 29 | void init() 30 | { 31 | int x, y; 32 | 33 | initscr(); 34 | cbreak(); 35 | noecho(); 36 | curs_set(0); 37 | 38 | empty = 15; 39 | srand(time(0)); 40 | x = rand() % 4; 41 | y = rand() % 4; 42 | a[y][x] = 2; 43 | draw(); 44 | } 45 | 46 | void draw() 47 | { 48 | int n, m, x, y; 49 | char c[4] = {'0', '0', '0', '0'}; 50 | clear(); 51 | 52 | for(n = 0; n < 9; n += 2) 53 | { 54 | for(m = 0; m < 21; m++) 55 | { 56 | move(n, m); 57 | addch('-'); 58 | refresh(); 59 | } 60 | } 61 | for(m = 0; m < 22; m +=5) 62 | { 63 | for(n = 1; n < 8; n++) 64 | { 65 | move(n, m); 66 | addch('|'); 67 | refresh(); 68 | } 69 | } 70 | for(y = 0; y < 4; y++) 71 | { 72 | for(x = 0; x < 4; x++) 73 | { 74 | draw_one(y, x); 75 | } 76 | } 77 | } 78 | 79 | void draw_one(int y, int x) 80 | { 81 | int i, m, k, j; 82 | char c[5] = {0x00}; 83 | i = a[y][x]; 84 | m = 0; 85 | while(i > 0) 86 | { 87 | j = i % 10; 88 | c[m++] = j + '0'; 89 | i = i / 10; 90 | } 91 | m = 0; 92 | k = (x + 1) * 5 - 1; 93 | while(c[m] != 0x00) 94 | { 95 | move(2*y+1, k); 96 | addch(c[m++]); 97 | k--; 98 | } 99 | } 100 | 101 | void play() 102 | { 103 | int x, y, i, new_x, new_y, temp; 104 | int old_empty, move; 105 | char ch; 106 | 107 | while(1) 108 | { 109 | move = 0; 110 | old_empty = empty; 111 | ch = getch(); 112 | switch(ch) { 113 | case 97: 114 | case 104: 115 | case 68: 116 | for(y = 0; y < 4; y++) 117 | for(x = 0; x < 4; ) 118 | { 119 | if(a[y][x] == 0) 120 | { 121 | x++; 122 | continue; 123 | } 124 | else 125 | { 126 | for(i = x + 1; i < 4; i++) 127 | { 128 | if(a[y][i] == 0) 129 | { 130 | continue; 131 | } 132 | else 133 | { 134 | if(a[y][x] == a[y][i]) 135 | { 136 | a[y][x] += a[y][i]; 137 | a[y][i] = 0; 138 | empty++; 139 | break; 140 | } 141 | else 142 | { 143 | break; 144 | } 145 | } 146 | } 147 | x = i; 148 | } 149 | } 150 | for(y = 0; y < 4; y++) 151 | for(x = 0; x < 4; x++) 152 | { 153 | if(a[y][x] == 0) 154 | { 155 | continue; 156 | } 157 | else 158 | { 159 | for(i = x; (i > 0) && (a[y][i-1] == 0); i--) 160 | { 161 | a[y][i-1] = a[y][i]; 162 | a[y][i] = 0; 163 | move = 1; 164 | } 165 | } 166 | } 167 | break; 168 | case 100: 169 | case 108: 170 | case 67: 171 | for(y = 0; y < 4; y++) 172 | for(x = 3; x >= 0; ) 173 | { 174 | if(a[y][x] == 0) 175 | { 176 | x--; 177 | continue; 178 | } 179 | else 180 | { 181 | for(i = x - 1; i >= 0; i--) 182 | { 183 | if(a[y][i] == 0) 184 | { 185 | continue; 186 | } 187 | else if(a[y][x] == a[y][i]) 188 | { 189 | a[y][x] += a[y][i]; 190 | a[y][i] = 0; 191 | empty++; 192 | break; 193 | } 194 | else 195 | { 196 | break; 197 | } 198 | } 199 | x = i; 200 | } 201 | } 202 | for(y = 0; y < 4; y++) 203 | for(x = 3; x >= 0; x--) 204 | { 205 | if(a[y][x] == 0) 206 | { 207 | continue; 208 | } else 209 | { 210 | for(i = x; (i < 3) && (a[y][i+1] == 0); i++) 211 | { 212 | a[y][i+1] = a[y][i]; 213 | a[y][i] = 0; 214 | move = 1; 215 | } 216 | } 217 | } 218 | break; 219 | case 119: 220 | case 107: 221 | case 65: 222 | for(x = 0; x < 4; x++) 223 | for(y = 0; y < 4; ) 224 | { 225 | if(a[y][x] == 0) 226 | { 227 | y++; 228 | continue; 229 | } 230 | else 231 | { 232 | for(i = y + 1; i < 4; i++) 233 | { 234 | if(a[i][x] == 0) 235 | { 236 | continue; 237 | } 238 | else if(a[y][x] == a[i][x]) 239 | { 240 | a[y][x] += a[i][x]; 241 | a[i][x] = 0; 242 | empty++; 243 | break; 244 | } else 245 | { 246 | break; 247 | } 248 | } 249 | y = i; 250 | } 251 | } 252 | for(x = 0; x < 4; x++) 253 | for(y = 0; y < 4; y++) 254 | { 255 | if(a[y][x] == 0) 256 | { 257 | continue; 258 | } 259 | else 260 | { 261 | for(i = y; (i > 0) && (a[i-1][x] == 0); i--) 262 | { 263 | a[i-1][x] = a[i][x]; 264 | a[i][x] = 0; 265 | move = 1; 266 | } 267 | } 268 | } 269 | break; 270 | case 115: 271 | case 106: 272 | case 66: 273 | for(x = 0; x < 4; x++) 274 | for(y = 3; y >= 0; ) 275 | { 276 | if(a[y][x] == 0) 277 | { 278 | y--; 279 | continue; 280 | } 281 | else 282 | { 283 | for(i = y - 1; i >= 0; i--) 284 | { 285 | if(a[i][x] == 0) 286 | { 287 | continue; 288 | } 289 | else if(a[y][x] == a[i][x]) 290 | { 291 | a[y][x] += a[i][x]; 292 | a[i][x] = 0; 293 | empty++; 294 | break; 295 | } 296 | else 297 | { 298 | break; 299 | } 300 | } 301 | y = i; 302 | } 303 | } 304 | for(x = 0; x < 4; x++) 305 | for(y = 3; y >= 0; y--) 306 | { 307 | if(a[y][x] == 0) 308 | { 309 | continue; 310 | } 311 | else 312 | { 313 | for(i = y; (i < 3) && (a[i+1][x] == 0); i++) 314 | { 315 | a[i+1][x] = a[i][x]; 316 | a[i][x] = 0; 317 | move = 1; 318 | } 319 | } 320 | } 321 | break; 322 | case 'Q': 323 | case 'q': 324 | game_over(); 325 | break; 326 | default: 327 | continue; 328 | break; 329 | } 330 | if(empty <= 0) 331 | game_over(); 332 | if((empty != old_empty) || (move == 1)) 333 | { 334 | do{ 335 | new_x = rand() % 4; 336 | new_y = rand() % 4; 337 | }while(a[new_y][new_x] != 0); 338 | 339 | cnt_value(&new_y, &new_x); 340 | 341 | do { 342 | temp = rand() % 4; 343 | }while(temp == 0 || temp == 2); 344 | a[new_y][new_x] = temp + 1; 345 | empty--; 346 | } 347 | draw(); 348 | } 349 | } 350 | 351 | int cnt_one(int y, int x) 352 | { 353 | int value = 1; 354 | 355 | if(y - 1 > 0) 356 | a[y-1][x] ? 0 : value++; 357 | if(y + 1 < 4) 358 | a[y+1][x] ? 0 : value++; 359 | if(x - 1 >= 0) 360 | a[y][x-1] ? 0 : value++; 361 | if(x + 1 < 4) 362 | a[y][x+1] ? 0 : value++; 363 | if(y - 1 >= 0 && x - 1 >= 0) 364 | a[y-1][x-1] ? 0 : value++; 365 | if(y - 1 >= 0 && x + 1 < 4) 366 | a[y-1][x+1] ? 0 : value++; 367 | if(y + 1 < 4 && x - 1 >= 0) 368 | a[y+1][x-1] ? 0 : value++; 369 | if(y + 1 < 4 && x + 1 < 4) 370 | a[y+1][x+1] ? 0 : value++; 371 | 372 | return value; 373 | } 374 | 375 | void cnt_value(int *new_y, int *new_x) 376 | { 377 | int max_x, max_y, x, y, value; 378 | int max = 0; 379 | 380 | max = cnt_one(*new_y, *new_x); 381 | for(y = 0; y < 4; y++) 382 | for(x = 0; x < 4; x++) 383 | { 384 | if(!a[y][x]) 385 | { 386 | value = cnt_one(y, x); 387 | if(value > max && old_y != y && old_x != x) 388 | { 389 | *new_y = y; 390 | *new_x = x; 391 | old_x = x; 392 | old_y = y; 393 | break; 394 | } 395 | } 396 | } 397 | } 398 | 399 | int game_over() 400 | { 401 | sleep(1); 402 | endwin(); 403 | exit(0); 404 | } 405 | --------------------------------------------------------------------------------