C language 2048 small game

  • 2020-06-03 07:56:00
  • OfStack

This article shares the specific code of C language 2048 game for your reference. The specific content is as follows

The slider has color and the highest score (using the file)


#include <stdio.h>
#include <stdlib.h>
#include <conio.h> /* use getch() function */
#include <time.h>
#include <windows.h> /* use Sleep() function */ 

void Menu();// The menu 
void Rule_of_game();// The rules of the game  
void Begin(int max); // start  
void Table();// print 4 x 4 grid  
int Random_number1();// produce 2 or 4 The random number  
int Random_number2();// produce 0 , 1 , 2 , 3 The random number  
int Get(int *p_cnt, int score);// Input order  
void Move();// Keep on 1 Secondary checkerboard layout  
int If_move();// Decide whether to move or not  
int Over();// Judge whether it's over  
void Establish_game();// Create a file to save the highest score  
void Write_max(int score);// to 2048 The game - The highest record is written as the highest score  
int Read_max();// Read the file where the highest score was recorded 
void Establish_file();// Create archive file  
void Write_file(int *p_cnt, int scort);// The archive  
int Read_file(int *p_cnt);// Read the file  
void again();// Whether to continue the game 
int color(int c);// Change the color 
void box_color(int x);// Different values correspond to different colors  

int a[4][4] = {0};//  Define global 2 Dimensional array  
int A[4][4]; // Keep on 1 The step chess  
char *name_max = "2048 The game - The previous record ";
char *name_file = "[ blank ]-2048 The game ";

int main() {
 system("mode con cols=90 lines=30");
 system("title 2048 Super big games "); // Program title  
 system("color F0");//F  Represents the background color, 0 Foreground color  
 Menu();
 system("pause"); // Pause and enter any key to continue  
 system("cls"); // Clear the screen  
 again(); // Whether to continue the game 
 return 0;
}

void Menu() // The menu  
{
 printf("\t\t  �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �  \n"); 
 printf("\t\t �   Welcome to use by [ blank ] To make the 2048 Super big games   � \n");
 printf("\t\t  �  ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─  �  \n");
 printf("\t\t Please enter the options:   � \n");
 printf("\t\t �   ┌ ─ ─ ─ ┐   � \n");
 printf("\t\t �   │  1  │   The rules of the game   � \n");
 printf("\t\t �   └ ─ ─ ─ ┘   � \n");
 printf("\t\t �   ┌ ─ ─ ─ ┐   � \n");
 printf("\t\t �   │  2  │   Start the game   � \n");
 printf("\t\t �   └ ─ ─ ─ ┘   � \n");
 printf("\t\t �   ┌ ─ ─ ─ ┐   � \n");
 printf("\t\t �   │  3  │   To continue the game   � \n");
 printf("\t\t �   └ ─ ─ ─ ┘   � \n");
 printf("\t\t �   ┌ ─ ─ ─ ┐   � \n");
 printf("\t\t �   │  4  │   Quit the game   � \n");
 printf("\t\t �   └ ─ ─ ─ ┘   � \n");
 printf("\t\t  �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �  \n");
 int x = 1, max = 0;
 while(x){
 switch(getch()){
 case '1':
 x = 0;
 Rule_of_game();// The rules of the game 
 Menu();
 break; 
 case '2':
 x = 0;
 system("cls");// Clear the screen 
 Establish_game(name_file);// Create a new read file  
 Establish_game(name_max);// Create a new file that holds the highest record  
 Begin(max); // Start the game  
 break;
 case '3':
 x = 0;
 system("cls");// Clear the screen 
 max = Read_max();// Read the previous record  
 Begin(max); // Start the game  
 break;
 case '4':
 exit(0); 
 default:
 printf(" Illegal option entered, please select again! \n");
 }
 }
}

void Rule_of_game()
{ 
 system("cls");// Clear the screen  
 printf("  �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �  \n"); 
 printf(" The game is played by pressing the button W , S , A , D (Case insensitive) 4 The keys control the slider up, down, left and right.  �  \n");
 printf(" As the slider moves, if there are adjacent and equal Numbers of the slider will be added and the corresponding score will be obtained.   � \n");
 printf(" The game ends when all positions on the board have Numbers that cannot be combined. This game has not been set up successfully.   � \n");
 printf(" Input during the game I To save and exit the game, enter O Is read file, input P Quit the game.   � \n");
 printf(" The "Start game" will clear the record and save. The "Continue game" will save the previous record and read the file.   � \n"); 
 printf("  �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �  \n");
 system("pause");// suspended  
 system("cls");// Clear the screen  
}

void Begin(int max)
{
 int score = 0;
 int sign = 1;
 int h, l, cnt = 0;
 int *p_cnt = &cnt;
 while(1) {
 printf("\t\t  �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �  \n"); 
 printf("\t\t �   Welcome to use by [ blank ] To make the 2048 Super big games   � \n");
 printf("\t\t  �  ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─  �  \n");
 printf("\t\t  �  mobile:   ┌ ─ ─ ─ ┐   Archive:   Read the file:   Exit:   � \n");
 printf("\t\t �   │  W  │   � \n"); 
 printf("\t\t �   ┌ ─ ─ ─ ┼ ─ ─ ─ ┼ ─ ─ ─ ┐   ┌ ─ ─ ─ ┐   ┌ ─ ─ ─ ┐   ┌ ─ ─ ─ ┐   � \n");
 printf("\t\t �   │  A  │  S  │  D  │   │  I  │   │  O  │   │  P  │   � \n");
 printf("\t\t �   └ ─ ─ ─ ┴ ─ ─ ─ ┴ ─ ─ ─ ┘   └ ─ ─ ─ ┘   └ ─ ─ ─ ┘   └ ─ ─ ─ ┘   � \n");
 printf("\t\t  �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �  \n");
 while(1){
 if(sign == 1){
 h = Random_number2();
 l = Random_number2();
 if(a[h][l] == 0){
 a[h][l] = Random_number1();
 cnt ++;
 break;
 }
 }
 else{
 break;
 }

 }
 Table();// Printed board  
 printf("\t\t Number of steps taken: %d\t Current score: %d\n\t\t Highest record: %d\n", cnt-1, score, max);
 Move();// Keep the board  
 score += Get(p_cnt, score);// score 
 sign = If_move();// Determine if the board has changed  
 if(Over() == 0){ 
 if(max < score){// To break the record  
 Establish_game(name_max);// Clear previous records  
 Write_max(score);// Save this record 
 printf("\t\t Congratulations on breaking the record! \n"); 
 } 
 break;
 } 
 system("cls"); // Clear the screen 
 }
}

void Table()
{
 int h, l;
 for(h = 0; h < 4; h ++){
 if(h == 0){
 printf("\t\t\t ┏ ━ ━ ━ ━ ━ ━ ┳ ━ ━ ━ ━ ━ ━ ┳ ━ ━ ━ ━ ━ ━ ┳ ━ ━ ━ ━ ━ ━ ┓ \n");
 }
 else {
 printf("\t\t\t ┣ ━ ━ ━ ━ ━ ━ ╋ ━ ━ ━ ━ ━ ━ ╋ ━ ━ ━ ━ ━ ━ ╋ ━ ━ ━ ━ ━ ━ ┫ \n");
 }
 printf("\t\t\t ┃   ┃   ┃   ┃   ┃ \n");
 for(l = 0; l < 4; l ++){
 if(a[h][l] == 0){// if 2 If the position of the dimension array corresponding to the checkerboard is zero, no data is put in  
 if(l == 0){
 printf("\t\t\t ┃  ");
 }
 else {
 printf(" ┃  ");
 }
 }
 else{// Otherwise put in 2 Dimensional array corresponding data  
 if(l == 0){
 printf("\t\t\t ┃ ");
 box_color(a[h][l]);// Judge the value of the slider and give the corresponding color  
 printf("%5d ", a[h][l]);
 color(0);// Restore white background  
 }
 else {
 printf(" ┃ ");
 box_color(a[h][l]);// Judge the value of the slider and give the corresponding color  
 printf("%5d ", a[h][l]); 
 color(0);// Restore white background  
 }
 }
 }
 printf(" ┃ \n");
 printf("\t\t\t ┃   ┃   ┃   ┃   ┃ \n");
 }
 printf("\t\t\t ┗ ━ ━ ━ ━ ━ ━ ┻ ━ ━ ━ ━ ━ ━ ┻ ━ ━ ━ ━ ━ ━ ┻ ━ ━ ━ ━ ━ ━ ┛ \n");
}

int Random_number1()/* Randomly generated 2 or 4*/
{ 
 int s;
 srand( time(NULL) ); 
 s = ((unsigned)rand() % 2);
 s = s == 0 ? 2 : 4;
 return s;
}

int Random_number2()/* Randomly generated 2 The subscript of a dimension array */
{ 
 int x;
 x = ((unsigned)rand() % 4);
 return x;
}

int Get(int *p_cnt, int score)
{
 int h, l, t, sum = 0;
 char ch;
 ch = getch();// The input character  
 switch (ch){
 /* The slider moves up */ 
 case 'w':
 case 'W':
 /* Upward aggregation */
 for(l = 0; l < 4; l ++){
 for(t = 0; t < 4; t ++){
 for(h = 3; h > 0; h --){
 if(a[h-1][l] == 0){
 a[h-1][l] = a[h][l];
 a[h][l] = 0;
 }
 }
 }
 }
 /* In the vertical direction, add up Numbers that are adjacent and identical */ 
 for(l = 0; l < 4; l ++){
 for(h = 0; h < 3; h ++){
 if(a[h][l] == a[h+1][l]){
 a[h][l] += a[h+1][l];
 a[h+1][l] = 0;
 sum += a[h][l];
 }
 }
 }
 /* Upward aggregation */ 
 for(l = 0; l < 4; l ++){
 for(t = 0; t < 4; t ++){
 for(h = 3; h > 0; h --){
 if(a[h-1][l] == 0){
 a[h-1][l] = a[h][l];
 a[h][l] = 0;
 }
 }
 }
 }
 break;
 case 's':
 case 'S':
 for(l = 0; l < 4; l ++){
 for(t = 0; t < 4; t ++){
 for(h = 0; h < 3; h ++){
 if(a[h+1][l] == 0){
 a[h+1][l] = a[h][l];
 a[h][l] = 0;
 }
 }
 }
 }
 for(l = 0; l < 4; l ++){
 for(h = 3; h > 0; h --){
 if(a[h][l] == a[h-1][l]){
 a[h][l] += a[h-1][l];
 a[h-1][l] = 0;
 sum += a[h][l];
 }
 }
 }
 for(l = 0; l < 4; l ++){
 for(t = 0; t < 4; t ++){
 for(h = 0; h < 3; h ++){
 if(a[h+1][l] == 0){
 a[h+1][l] = a[h][l];
 a[h][l] = 0;
 }
 }
 }
 }
 break;
 case 'a':
 case 'A':
 for(h = 0; h < 4; h ++){
 for(t = 0; t < 4; t ++){
 for(l = 3; l > 0; l --){
 if(a[h][l-1] == 0){
 a[h][l-1] = a[h][l];
 a[h][l] = 0;
 }
 }
 }
 }
 for(h = 0; h < 4; h ++){
 for(l = 0; l < 3; l ++){
 if(a[h][l] == a[h][l+1]){
 a[h][l] += a[h][l+1];
 a[h][l+1] = 0;
 sum += a[h][l];
 }
 }
 }
 for(h = 0; h < 4; h ++){
 for(t = 0; t < 4; t ++){
 for(l = 3; l > 0; l --){
 if(a[h][l-1] == 0){
 a[h][l-1] = a[h][l];
 a[h][l] = 0;
 }
 }
 }
 }
 break;
 case 'd':
 case 'D':
 for(h = 0; h < 4; h ++){
 for(t = 0; t < 4; t ++){
 for(l = 0; l < 3; l ++){
 if(a[h][l+1] == 0){
 a[h][l+1] = a[h][l];
 a[h][l] = 0;
 }
 }
 }
 }
 for(h = 0; h < 4; h ++){
 for(l = 3; l > 0; l --){
 if(a[h][l] == a[h][l-1]){
 a[h][l] += a[h][l-1];
 a[h][l-1] = 0;
 sum += a[h][l];
 }
 }
 }
 for(h = 0; h < 4; h ++){
 for(t = 0; t < 4; t ++){
 for(l = 0; l < 3; l ++){
 if(a[h][l+1] == 0){
 a[h][l+1] = a[h][l];
 a[h][l] = 0;
 }
 }
 }
 }
 break;
 case 'i':
 case 'I': // Save the current game layout  
 Establish_file();// Create a file for the archive  
 Write_file(p_cnt, score);// Call archive function  
 break;
 case 'o':
 case 'O':
 sum = Read_file(p_cnt);// Read the file 
 break;
 case 'p':
 case 'P':
 exit(0);// Exit the program  
 default:
 break;
 }

 return sum;
}

void Move()
{
 int h, l;
 for(h = 0; h < 4; h ++){
 for(l = 0; l < 4; l ++){
 A[h][l] = a[h][l];
 }
 }
}

int If_move()
{
 int h, l, sign = 0;
 for(h = 0; h < 4; h ++){
 for(l = 0; l < 4; l ++){
 if(a[h][l] != A[h][l]){// The condition box is not entered, indicating that the slider has not moved  
 sign = 1;
 goto out;
 }
 }
 }
 out:
 return sign;
}

int Over()
{
 int over = 0;
 int h, l;
 for(h = 0; h < 4; h ++){
 for(l = 0; l < 4; l ++){
 if(a[h][l] == 0){// The space  
 over = 1;// The game continue  
 return 1; 
 }
 }
 }
 if(over == 0){// There is no space  
 for(h = 0; h < 3; h ++){
 for(l = 0; l < 3; l ++){
 if(a[h][l] == a[h][l+1]){
 over = 1;// The game continue  
 break;
 }
 else if(a[h][l] == a[h+1][l]){
 over = 1;// The game continue  
 break;
 }
 }
 if(over == 1){
 break;
 } 
 }
 }
 return over;// Game over  
}

void Establish_game()// Create a file  
{
 int h;
 if(h = fopen(name_max, "wb") == NULL){ // function fopen() return NULL Fails to create the file  
 printf("\t\t File creation failed! The program will exit automatically  . . .\n");
 Sleep(3000);// sleep 3000 Milliseconds, that is, stay 3 seconds  
 exit(0); // Exit the program 
 }
}

void Write_max(int score)// Written to the file  
{
 /*FILE *fp Is a pointer to a file */ 
 FILE *fp=fopen(name_max,"at+");// at+ Read/write opens or creates 1 A text file; Allow reading and writing. 
 if(fp==NULL) // function fopen() return NULL Fails to create the file 
 {
 printf("\t\t Failed to save the highest score! The program will exit automatically  . . .");
 Sleep(3000);// sleep 3000 Milliseconds, that is, stay 3 seconds  
 exit(0); // Exit the program 
 }
 else{
 fprintf(fp, "%d", score);// will score The value of the write *pf Point to the file  
 }
 fclose(fp);// Shut down *pf File to point to  
}

int Read_max()// Read the file  
{
 int max_score = 0;
 FILE *fp=fopen(name_max,"at+");// at+ Read/write opens or creates 1 A text file; Allow reading and writing. 
 if(fp==NULL)
 {
 printf("\t\t Read failed! The program will exit automatically  . . .");
 Sleep(3000);// sleep 3000 Milliseconds, that is, stay 3 seconds  
 exit(0); // Exit the program 
 }
 else{
 fscanf(fp, "%d", &max_score);// from *pf Points to a value in the file max_score
 }
 fclose(fp);// Shut down *pf File to point to 

 return max_score;// Returns the highest recorded value  
}

void Establish_file()// Create a file  
{
 int h;
 if(h = fopen(name_file, "wb") == NULL){ // function fopen() return NULL Fails to create the file  
 printf("\t\t File creation failed! The program will exit automatically  . . .\n");
 Sleep(3000);// sleep 3000 Milliseconds, that is, stay 3 seconds  
 exit(0); // Exit the program 
 }
}

void Write_file(int *p_cnt, int score) 
{
 int h, l;
 FILE *fp=fopen(name_file,"at+");// at+ Read/write opens or creates 1 A text file; Allow reading and writing. 
 if(fp==NULL)
 {
 printf("\t\t Archive failed! The program will exit automatically  . . .\n");
 Sleep(3000);// sleep 3000 Milliseconds, that is, stay 3 seconds  
 exit(0);
 }
 else{
 for(h = 0; h < 4; h ++){
 for(l = 0; l < 4; l ++){
 fprintf(fp, "%d ", a[h][l]);
 }
 }
 }
 fprintf(fp, "%d ", score);
 fprintf(fp, "%d ", *p_cnt-1);
 printf("\t\t Archive successful! The game will exit automatically  . . .\n");
 Sleep(3000); // sleep 3000 Milliseconds, that is, stay 3 seconds  
 exit(0);
 fclose(fp);// Close the file  
}

int Read_file(int *p_cnt)
{
 int h, l, score = 0;
 FILE *fp=fopen(name_file,"at+");// at+ Read/write opens or creates 1 A text file; Allow reading and writing. 
 if(fp==NULL)
 {
 printf("\t\t Failed to read file! The program will exit automatically  . . .\n");
 Sleep(3000); // sleep 3000 Milliseconds, that is, stay 3 seconds  
 exit(0);
 }
 else{
 for(h = 0; h < 4; h ++){
 for(l = 0; l < 4; l ++){
 fscanf(fp, "%d ", &a[h][l]);
 }
 }
 }
 fscanf(fp, "%d ", &score);
 fscanf(fp, "%d ", p_cnt);
 fclose(fp); // Close the file  

 return score;
} 

void again()// Whether to continue the game  
{
 printf("\t\t  �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �  \n"); 
 printf("\t\t �   You have failed   � \n");
 printf("\t\t  �  ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─  �  \n");
 printf("\t\t Whether or not to continue:   � \n");
 printf("\t\t �   ┌ ─ ─ ─ ┐   � \n");
 printf("\t\t �   │  1  │   Help me up, I can come again 1 Bureau!   � \n");
 printf("\t\t �   └ ─ ─ ─ ┘   � \n");
 printf("\t\t �   ┌ ─ ─ ─ ┐   � \n");
 printf("\t\t �   │  2  │   No, no, I want to study!   � \n");
 printf("\t\t �   └ ─ ─ ─ ┘   � \n");
 printf("\t\t  �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �   �  \n");
 if(_getch() == '1'){
 system("cls");// Clear the screen 
 int h, l;
 for(h = 0; h < 4; h ++){
 for(l = 0; l < 4; l ++){
 a[h][l] = 0;
 A[h][l] = 0;
 }
 }
 Menu();// Back to the menu  
 }
 else {
 printf("\t\t Game over! \n");
 } 
}

int color(int c)
{
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
 BACKGROUND_INTENSITY |
 BACKGROUND_BLUE |
 BACKGROUND_RED |
 BACKGROUND_GREEN |
 c);
 return 0;
}

void box_color(int x)
{
 switch(x){
 case 2:
 color(8);
 break;
 case 4:
 color(0);
 break;
 case 8:
 color(2);
 break;
 case 16:
 color(6);
 break;
 case 32:
 color(10);
 break;
 case 64:
 color(3);
 break;
 case 128:
 color(9);
 break;
 case 256:
 color(11);
 break;
 case 512:
 color(5);
 break;
 case 1024:
 color(13);
 break;
 case 2048:
 color(12);
 break;
 default :
 color(4);
 break;
 }
}

Related articles: