您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關C語言如何實現2048小游戲,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
本文實例為大家分享了C語言實現2048游戲的具體代碼,供大家參考,具體內容如下
滑塊有顏色、有最高分(用到文件)
#include <stdio.h> #include <stdlib.h> #include <conio.h> /*使用getch()函數*/ #include <time.h> #include <windows.h> /*使用Sleep()函數*/ void Menu();//菜單 void Rule_of_game();//游戲規則 void Begin(int max); //開始 void Table();//打印4×4方格 int Random_number1();//產生2或4的隨機數 int Random_number2();//產生0、1、2、3的隨機數 int Get(int *p_cnt, int score);//輸入指令 void Move();//保留上一次的棋盤布局 int If_move();//判斷是否移動 int Over();//判斷是否結束 void Establish_game();//創建用于保存最高分的文件 void Write_max(int score);//向2048游戲-最高記錄寫入最高分 int Read_max();//讀出最高分記錄的文件 void Establish_file();//創建存檔文件 void Write_file(int *p_cnt, int scort);//存檔 int Read_file(int *p_cnt);//讀檔 void again();//是否繼續游戲 int color(int c);//更改顏色 void box_color(int x);//不同數值對應不同顏色 int a[4][4] = {0};// 定義全局的二維數組 int A[4][4]; //保留上一步的棋局 char *name_max = "2048游戲-最高記錄"; char *name_file = "[空白]-2048游戲"; int main() { system("mode con cols=90 lines=30"); system("title 2048超級大大型游戲"); //程序標題 system("color F0");//F 表示背景顏色,0表示前景顏色 Menu(); system("pause"); //暫停,輸入任意鍵繼續 system("cls"); //清屏 again(); //是否繼續游戲 return 0; } void Menu() //菜單 { printf("\t\t╔══════════════════════════════════════════════╗\n"); printf("\t\t║ 歡迎使用由[空白]制作的2048超級大大型游戲 ║\n"); printf("\t\t╟──────────────────────────────────────────────╢\n"); printf("\t\t║請輸入選項: ║\n"); printf("\t\t║ ┌───┐ ║\n"); printf("\t\t║ │ 1 │ 游戲規則 ║\n"); printf("\t\t║ └───┘ ║\n"); printf("\t\t║ ┌───┐ ║\n"); printf("\t\t║ │ 2 │ 開始游戲 ║\n"); printf("\t\t║ └───┘ ║\n"); printf("\t\t║ ┌───┐ ║\n"); printf("\t\t║ │ 3 │ 繼續游戲 ║\n"); printf("\t\t║ └───┘ ║\n"); printf("\t\t║ ┌───┐ ║\n"); printf("\t\t║ │ 4 │ 退出游戲 ║\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();//游戲規則 Menu(); break; case '2': x = 0; system("cls");//清屏 Establish_game(name_file);//創建新的讀檔文件 Establish_game(name_max);//創建新的保存最高記錄的文件 Begin(max); //開始游戲 break; case '3': x = 0; system("cls");//清屏 max = Read_max();//讀取之前的最高記錄 Begin(max); //開始游戲 break; case '4': exit(0); default: printf("輸入了非法選項,請重新選擇!\n"); } } } void Rule_of_game() { system("cls");//清屏 printf("╔══════════════════════════════════════════════════════════════════════════════════╗\n"); printf("║本游戲通過按鍵W、S、A、D(不區分大小寫)四個鍵分別控制滑塊上移、下移、左移和右移。║\n"); printf("║滑塊移動的過程中,如有相鄰且相等數字的滑塊將會相加,并獲得相應的分數。 ║\n"); printf("║當棋盤上的所有位置均有數字,且不能合成,則游戲結束。本游戲未設置游戲成功。 ║\n"); printf("║游戲過程中輸入I即為存檔并退出游戲,輸入O即為讀檔,輸入P則退出游戲。 ║\n"); printf("║“開始游戲”則清除最高記錄及存檔、“繼續游戲”則保存之前的最高記錄,且可以讀檔。 ║\n"); printf("╚══════════════════════════════════════════════════════════════════════════════════╝\n"); system("pause");//暫停 system("cls");//清屏 } 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║ 歡迎使用由[空白]制作的2048超級大大型游戲 ║\n"); printf("\t\t╟──────────────────────────────────────────────╢\n"); printf("\t\t║移動: ┌───┐ 存檔: 讀檔: 退出: ║\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();//打印棋盤 printf("\t\t移動的步數:%d\t當前得分:%d\n\t\t最高記錄:%d\n", cnt-1, score, max); Move();//保留棋盤 score += Get(p_cnt, score);//得分 sign = If_move();//判斷棋盤是否有變動 if(Over() == 0){ if(max < score){//打破記錄 Establish_game(name_max);//清除之前的記錄 Write_max(score);//保存此次記錄 printf("\t\t恭喜您已打破記錄!\n"); } break; } system("cls"); //清屏 } } 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(l == 0){ printf("\t\t\t┃ "); } else { printf("┃ "); } } else{//否則放入與二維數組對應的數據 if(l == 0){ printf("\t\t\t┃"); box_color(a[h][l]);//判斷滑塊的數值,給對應顏色 printf("%5d ", a[h][l]); color(0);//恢復白色背景 } else { printf("┃"); box_color(a[h][l]);//判斷滑塊的數值,給對應顏色 printf("%5d ", a[h][l]); color(0);//恢復白色背景 } } } printf("┃\n"); printf("\t\t\t┃ ┃ ┃ ┃ ┃\n"); } printf("\t\t\t┗━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┛\n"); } int Random_number1()/*隨機生成2 or 4*/ { int s; srand( time(NULL) ); s = ((unsigned)rand() % 2); s = s == 0 ? 2 : 4; return s; } int Random_number2()/*隨機生成二維數組的下標*/ { 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();//輸入字符 switch (ch){ /*滑塊向上移動*/ case 'w': case 'W': /*向上聚集數字*/ 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; } } } } /*豎直方向上,相鄰且相同的數字相加*/ 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]; } } } /*向上聚集數字*/ 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': //存檔當前游戲格局 Establish_file();//創建用于存檔的文件 Write_file(p_cnt, score);//調用存檔函數 break; case 'o': case 'O': sum = Read_file(p_cnt);//讀檔 break; case 'p': case 'P': exit(0);//退出程序 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]){//未進入條件框,說明滑塊沒有發生移動 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){//有空格 over = 1;//游戲繼續 return 1; } } } if(over == 0){//沒有空格 for(h = 0; h < 3; h ++){ for(l = 0; l < 3; l ++){ if(a[h][l] == a[h][l+1]){ over = 1;//游戲繼續 break; } else if(a[h][l] == a[h+1][l]){ over = 1;//游戲繼續 break; } } if(over == 1){ break; } } } return over;//游戲結束 } void Establish_game()//創建文件 { int h; if(h = fopen(name_max, "wb") == NULL){ //函數fopen()返回NULL則創建文件失敗 printf("\t\t創建文件失敗!程序即將自動退出 . . .\n"); Sleep(3000);//睡眠3000毫秒,即停留3秒鐘 exit(0); //退出程序 } } void Write_max(int score)//寫入文件 { /*FILE *fp是指向文件的指針*/ FILE *fp=fopen(name_max,"at+");// at+讀寫打開或著建立一個文本文件;允許讀寫。 if(fp==NULL) //函數fopen()返回NULL則創建文件失敗 { printf("\t\t保存最高分失敗!程序即將自動退出 . . ."); Sleep(3000);//睡眠3000毫秒,即停留3秒鐘 exit(0); //退出程序 } else{ fprintf(fp, "%d", score);//將score的值寫入*pf指向的文件內 } fclose(fp);//關閉*pf指向的文件 } int Read_max()//讀出文件 { int max_score = 0; FILE *fp=fopen(name_max,"at+");// at+讀寫打開或著建立一個文本文件;允許讀寫。 if(fp==NULL) { printf("\t\t讀取失敗!程序即將自動退出 . . ."); Sleep(3000);//睡眠3000毫秒,即停留3秒鐘 exit(0); //退出程序 } else{ fscanf(fp, "%d", &max_score);//從*pf指向的文件內數值賦值給max_score } fclose(fp);//關閉*pf指向的文件 return max_score;//返回最高記錄的值 } void Establish_file()//創建文件 { int h; if(h = fopen(name_file, "wb") == NULL){ //函數fopen()返回NULL則創建文件失敗 printf("\t\t創建文件失敗!程序即將自動退出 . . .\n"); Sleep(3000);//睡眠3000毫秒,即停留3秒鐘 exit(0); //退出程序 } } void Write_file(int *p_cnt, int score) { int h, l; FILE *fp=fopen(name_file,"at+");// at+讀寫打開或著建立一個文本文件;允許讀寫。 if(fp==NULL) { printf("\t\t存檔失敗!程序即將自動退出 . . .\n"); Sleep(3000);//睡眠3000毫秒,即停留3秒鐘 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存檔成功!游戲即將自動退出 . . .\n"); Sleep(3000); //睡眠3000毫秒,即停留3秒鐘 exit(0); fclose(fp);//關閉文件 } int Read_file(int *p_cnt) { int h, l, score = 0; FILE *fp=fopen(name_file,"at+");// at+讀寫打開或著建立一個文本文件;允許讀寫。 if(fp==NULL) { printf("\t\t讀檔失敗!程序即將自動退出 . . .\n"); Sleep(3000); //睡眠3000毫秒,即停留3秒鐘 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); //關閉文件 return score; } void again()//是否繼續游戲 { printf("\t\t╔══════════════════════════════════════════════╗\n"); printf("\t\t║ 您已失敗 ║\n"); printf("\t\t╟──────────────────────────────────────────────╢\n"); printf("\t\t║是否繼續: ║\n"); printf("\t\t║ ┌───┐ ║\n"); printf("\t\t║ │ 1 │ 扶我起來,我還能再來一局! ║\n"); printf("\t\t║ └───┘ ║\n"); printf("\t\t║ ┌───┐ ║\n"); printf("\t\t║ │ 2 │ 不了不了,我要學習! ║\n"); printf("\t\t║ └───┘ ║\n"); printf("\t\t╚══════════════════════════════════════════════╝\n"); if(_getch() == '1'){ system("cls");//清屏 int h, l; for(h = 0; h < 4; h ++){ for(l = 0; l < 4; l ++){ a[h][l] = 0; A[h][l] = 0; } } Menu();//回到菜單 } else { printf("\t\t游戲結束!\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; } }
關于“C語言如何實現2048小游戲”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。