你还在照着书打吗?不!我不允许!直接复制!!!————大作业救星
在游戏中,使用w、s、a、d来控制上下左右移动,q键退出游戏。游戏的目标是通过合并相同数字的方块来达到2048
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <time.h> #define SIZE 4 int board[SIZE][SIZE] = {0}; int i; int j; void drawBoard() { system("cls"); for ( i = 0; i < SIZE; i++) { for ( j = 0; j < SIZE; j++) { printf("%4d", board[i][j]); } printf("\n"); } } void generateNewNumber() { int emptyCells[SIZE * SIZE][2] = {0}; int numEmptyCells = 0; for ( i = 0; i < SIZE; i++) { for ( j = 0; j < SIZE; j++) { if (board[i][j] == 0) { emptyCells[numEmptyCells][0] = i; emptyCells[numEmptyCells][1] = j; numEmptyCells++; } } } if (numEmptyCells > 0) { int index = rand() % numEmptyCells; int x = emptyCells[index][0]; int y = emptyCells[index][1]; board[x][y] = (rand() % 2 + 1) * 2; } } void moveLeft() { for ( i = 0; i < SIZE; i++) { int merged[SIZE] = {0}; int mergeIndex = 0; for ( j = 1; j < SIZE; j++) { if (board[i][j] != 0) { if (board[i][j] == board[i][mergeIndex] && merged[mergeIndex] == 0) { board[i][mergeIndex] *= 2; board[i][j] = 0; merged[mergeIndex] = 1; } else if (board[i][mergeIndex] == 0) { board[i][mergeIndex] = board[i][j]; board[i][j] = 0; } else { mergeIndex++; board[i][mergeIndex] = board[i][j]; if (mergeIndex != j) { board[i][j] = 0; } } } } } } void moveRight() { for ( i = 0; i < SIZE; i++) { int merged[SIZE] = {0}; int mergeIndex = SIZE - 1; for (j = SIZE - 2; j >= 0; j--) { if (board[i][j] != 0) { if (board[i][j] == board[i][mergeIndex] && merged[mergeIndex] == 0) { board[i][mergeIndex] *= 2; board[i][j] = 0; merged[mergeIndex] = 1; } else if (board[i][mergeIndex] == 0) { board[i][mergeIndex] = board[i][j]; board[i][j] = 0; } else { mergeIndex--; board[i][mergeIndex] = board[i][j]; if (mergeIndex != j) { board[i][j] = 0; } } } } } } void moveUp() { for ( j = 0; j < SIZE; j++) { int merged[SIZE] = {0}; int mergeIndex = 0; for ( i = 1; i < SIZE; i++) { if (board[i][j] != 0) { if (board[i][j] == board[mergeIndex][j] && merged[mergeIndex] == 0) { board[mergeIndex][j] *= 2; board[i][j] = 0; merged[mergeIndex] = 1; } else if (board[mergeIndex][j] == 0) { board[mergeIndex][j] = board[i][j]; board[i][j] = 0; } else { mergeIndex++; board[mergeIndex][j] = board[i][j]; if (mergeIndex != i) { board[i][j] = 0; } } } } } } void moveDown() { for ( j = 0; j < SIZE; j++) { int merged[SIZE] = {0}; int mergeIndex = SIZE - 1; for ( i = SIZE - 2; i >= 0; i--) { if (board[i][j] != 0) { if (board[i][j] == board[mergeIndex][j] && merged[mergeIndex] == 0) { board[mergeIndex][j] *= 2; board[i][j] = 0; merged[mergeIndex] = 1; } else if (board[mergeIndex][j] == 0) { board[mergeIndex][j] = board[i][j]; board[i][j] = 0; } else { mergeIndex--; board[mergeIndex][j] = board[i][j]; if (mergeIndex != i) { board[i][j] = 0; } } } } } } int checkGameOver() { for ( i = 0; i < SIZE; i++) { for ( j = 0; j < SIZE; j++) { if (board[i][j] == 0) { return 0; } if (i < SIZE - 1 && board[i][j] == board[i + 1][j]) { return 0; } if (j < SIZE - 1 && board[i][j] == board[i][j + 1]) { return 0; } } } return 1; } int main() { srand(time(NULL)); generateNewNumber(); generateNewNumber(); while (1) { drawBoard(); if (checkGameOver()) { printf("Game over!\n"); break; } char move = getch(); switch (move) { case 'w': moveUp(); break; case 's': moveDown(); break; case 'a': moveLeft(); break; case 'd': moveRight(); break; case 'q': exit(0); } generateNewNumber(); } return 0; }