俄罗斯方块(C语言实现)
文章目錄
- 游戲說明
- 游戲效果展示
- 游戲代碼
- 游戲代碼詳解
- 游戲框架構建
- 隱藏光標
- 光標跳轉
- 初始化界面
- 初始化方塊信息
- 顏色設置
- 畫出方塊
- 空格覆蓋
- 合法性判斷
- 判斷得分與結束
- 游戲主體邏輯函數
- 從文件讀取最高分
- 更新最高分到文件
- 主函數
游戲說明
俄羅斯方塊相信大家都知道,這里就不再介紹什么游戲背景了,我這里對本代碼實現的俄羅斯方塊作一些說明:
除此之外,本游戲還擁有計分系統,可保存玩家的歷史最高記錄。
游戲效果展示
游戲代碼
博友們可以將以下代碼復制到自己的編譯器當中運行:
#include <stdio.h> #include <Windows.h> #include <stdlib.h> #include <time.h> #include <conio.h>#define ROW 29 //游戲區行數 #define COL 20 //游戲區列數#define DOWN 80 //方向鍵:下 #define LEFT 75 //方向鍵:左 #define RIGHT 77 //方向鍵:右#define SPACE 32 //空格鍵 #define ESC 27 //Esc鍵struct Face {int data[ROW][COL + 10]; //用于標記指定位置是否有方塊(1為有,0為無)int color[ROW][COL + 10]; //用于記錄指定位置的方塊顏色編碼 }face;struct Block {int space[4][4]; }block[7][4]; //用于存儲7種基本形狀方塊的各自的4種形態的信息,共28種//隱藏光標 void HideCursor(); //光標跳轉 void CursorJump(int x, int y); //初始化界面 void InitInterface(); //初始化方塊信息 void InitBlockInfo(); //顏色設置 void color(int num); //畫出方塊 void DrawBlock(int shape, int form, int x, int y); //空格覆蓋 void DrawSpace(int shape, int form, int x, int y); //合法性判斷 int IsLegal(int shape, int form, int x, int y); //判斷得分與結束 int JudeFunc(); //游戲主體邏輯函數 void StartGame(); //從文件讀取最高分 void ReadGrade(); //更新最高分到文件 void WriteGrade();int max, grade; //全局變量 int main() { #pragma warning (disable:4996) //消除警告max = 0, grade = 0; //初始化變量system("title 俄羅斯方塊"); //設置cmd窗口的名字system("mode con lines=29 cols=60"); //設置cmd窗口的大小HideCursor(); //隱藏光標ReadGrade(); //從文件讀取最高分到max變量 InitInterface(); //初始化界面InitBlockInfo(); //初始化方塊信息srand((unsigned int)time(NULL)); //設置隨機數生成的起點StartGame(); //開始游戲return 0; }//隱藏光標 void HideCursor() {CONSOLE_CURSOR_INFO curInfo; //定義光標信息的結構體變量curInfo.dwSize = 1; //如果沒賦值的話,隱藏光標無效curInfo.bVisible = FALSE; //將光標設置為不可見HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //獲取控制臺句柄SetConsoleCursorInfo(handle, &curInfo); //設置光標信息 } //光標跳轉 void CursorJump(int x, int y) {COORD pos; //定義光標位置的結構體變量pos.X = x; //橫坐標設置pos.Y = y; //縱坐標設置HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //獲取控制臺句柄SetConsoleCursorPosition(handle, pos); //設置光標位置 } //初始化界面 void InitInterface() {color(7); //顏色設置為白色for (int i = 0; i < ROW; i++){for (int j = 0; j < COL + 10; j++){if (j == 0 || j == COL - 1 || j == COL + 9){face.data[i][j] = 1; //標記該位置有方塊CursorJump(2 * j, i);printf("■");}else if (i == ROW - 1){face.data[i][j] = 1; //標記該位置有方塊printf("■");}elseface.data[i][j] = 0; //標記該位置無方塊}}for (int i = COL; i < COL + 10; i++){face.data[8][i] = 1; //標記該位置有方塊CursorJump(2 * i, 8);printf("■");}CursorJump(2 * COL, 1);printf("下一個方塊:");CursorJump(2 * COL + 4, ROW - 19);printf("左移:←");CursorJump(2 * COL + 4, ROW - 17);printf("右移:→");CursorJump(2 * COL + 4, ROW - 15);printf("加速:↓");CursorJump(2 * COL + 4, ROW - 13);printf("旋轉:空格");CursorJump(2 * COL + 4, ROW - 11);printf("暫停: S");CursorJump(2 * COL + 4, ROW - 9);printf("退出: Esc");CursorJump(2 * COL + 4, ROW - 7);printf("重新開始:R");CursorJump(2 * COL + 4, ROW - 5);printf("最高紀錄:%d", max);CursorJump(2 * COL + 4, ROW - 3);printf("當前分數:%d", grade); } //初始化方塊信息 void InitBlockInfo() {//“T”形for (int i = 0; i <= 2; i++)block[0][0].space[1][i] = 1;block[0][0].space[2][1] = 1;//“L”形for (int i = 1; i <= 3; i++)block[1][0].space[i][1] = 1;block[1][0].space[3][2] = 1;//“J”形for (int i = 1; i <= 3; i++)block[2][0].space[i][2] = 1;block[2][0].space[3][1] = 1;for (int i = 0; i <= 1; i++){//“Z”形block[3][0].space[1][i] = 1;block[3][0].space[2][i + 1] = 1;//“S”形block[4][0].space[1][i + 1] = 1;block[4][0].space[2][i] = 1;//“O”形block[5][0].space[1][i + 1] = 1;block[5][0].space[2][i + 1] = 1;}//“I”形for (int i = 0; i <= 3; i++)block[6][0].space[i][1] = 1;int temp[4][4];for (int shape = 0; shape < 7; shape++) //7種形狀{for (int form = 0; form < 3; form++) //4種形態(已經有了一種,這里每個還需增加3種){//獲取第form種形態for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){temp[i][j] = block[shape][form].space[i][j];}}//將第form種形態順時針旋轉,得到第form+1種形態for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){block[shape][form + 1].space[i][j] = temp[3 - j][i];}}}} } //顏色設置 void color(int c) {switch (c){case 0:c = 13; //“T”形方塊設置為紫色break;case 1:case 2:c = 12; //“L”形和“J”形方塊設置為紅色break;case 3:case 4:c = 10; //“Z”形和“S”形方塊設置為綠色break;case 5:c = 14; //“O”形方塊設置為黃色break;case 6:c = 11; //“I”形方塊設置為淺藍色break;default:c = 7; //其他默認設置為白色break;}SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); //顏色設置//注:SetConsoleTextAttribute是一個API(應用程序編程接口) } //畫出方塊 void DrawBlock(int shape, int form, int x, int y) {for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){if (block[shape][form].space[i][j] == 1) //如果該位置有方塊{CursorJump(2 * (x + j), y + i); //光標跳轉到指定位置printf("■"); //輸出方塊}}} } //空格覆蓋 void DrawSpace(int shape, int form, int x, int y) {for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){if (block[shape][form].space[i][j] == 1) //如果該位置有方塊{CursorJump(2 * (x + j), y + i); //光標跳轉到指定位置printf(" "); //打印空格覆蓋(兩個空格)}}} } //合法性判斷 int IsLegal(int shape, int form, int x, int y) {for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){//如果方塊落下的位置本來就已經有方塊了,則不合法if ((block[shape][form].space[i][j] == 1) && (face.data[y + i][x + j] == 1))return 0; //不合法}}return 1; //合法 } //判斷得分與結束 int JudeFunc() {//判斷是否得分for (int i = ROW - 2; i > 4; i--){int sum = 0; //記錄第i行的方塊個數for (int j = 1; j < COL - 1; j++){sum += face.data[i][j]; //統計第i行的方塊個數}if (sum == 0) //該行沒有方塊,無需再判斷其上的層次(無需再繼續判斷是否得分)break; //跳出循環if (sum == COL - 2) //該行全是方塊,可得分{grade += 10; //滿一行加10分color(7); //顏色設置為白色CursorJump(2 * COL + 4, ROW - 3); //光標跳轉到顯示當前分數的位置printf("當前分數:%d", grade); //更新當前分數for (int j = 1; j < COL - 1; j++) //清除得分行的方塊信息{face.data[i][j] = 0; //該位置得分后被清除,標記為無方塊CursorJump(2 * j, i); //光標跳轉到該位置printf(" "); //打印空格覆蓋(兩個空格)}//把被清除行上面的行整體向下挪一格for (int m = i; m >1; m--){sum = 0; //記錄上一行的方塊個數for (int n = 1; n < COL - 1; n++){sum += face.data[m - 1][n]; //統計上一行的方塊個數face.data[m][n] = face.data[m - 1][n]; //將上一行方塊的標識移到下一行face.color[m][n] = face.color[m - 1][n]; //將上一行方塊的顏色編號移到下一行if (face.data[m][n] == 1) //上一行移下來的是方塊,打印方塊{CursorJump(2 * n, m); //光標跳轉到該位置color(face.color[m][n]); //顏色設置為還方塊的顏色printf("■"); //打印方塊}else //上一行移下來的是空格,打印空格{CursorJump(2 * n, m); //光標跳轉到該位置printf(" "); //打印空格(兩個空格)}}if (sum == 0) //上一行移下來的全是空格,無需再將上層的方塊向下移動(移動結束)return 1; //返回1,表示還需調用該函數進行判斷(移動下來的可能還有滿行)}}}//判斷游戲是否結束for (int j = 1; j < COL - 1; j++){if (face.data[1][j] == 1) //頂層有方塊存在(以第1行為頂層,不是第0行){Sleep(1000); //留給玩家反應時間system("cls"); //清空屏幕color(7); //顏色設置為白色CursorJump(2 * (COL / 3), ROW / 2 - 3);if (grade>max){printf("恭喜你打破最高記錄,最高記錄更新為%d", grade);WriteGrade();}else if (grade == max){printf("與最高記錄持平,加油再創佳績", grade);}else{printf("請繼續加油,當前與最高記錄相差%d", max - grade);}CursorJump(2 * (COL / 3), ROW / 2);printf("GAME OVER");while (1){char ch;CursorJump(2 * (COL / 3), ROW / 2 + 3);printf("再來一局?(y/n):");scanf("%c", &ch);if (ch == 'y' || ch == 'Y'){system("cls");main();}else if (ch == 'n' || ch == 'N'){CursorJump(2 * (COL / 3), ROW / 2 + 5);exit(0);}else{CursorJump(2 * (COL / 3), ROW / 2 + 4);printf("選擇錯誤,請再次選擇");}}}}return 0; //判斷結束,無需再調用該函數進行判斷 } //游戲主體邏輯函數 void StartGame() {int shape = rand() % 7, form = rand() % 4; //隨機獲取方塊的形狀和形態while (1){int t = 0;int nextShape = rand() % 7, nextForm = rand() % 4; //隨機獲取下一個方塊的形狀和形態int x = COL / 2 - 2, y = 0; //方塊初始下落位置的橫縱坐標color(nextShape); //顏色設置為下一個方塊的顏色DrawBlock(nextShape, nextForm, COL + 3, 3); //將下一個方塊顯示在右上角while (1){color(shape); //顏色設置為當前正在下落的方塊DrawBlock(shape, form, x, y); //將該方塊顯示在初始下落位置if (t == 0){t = 15000; //這里t越小,方塊下落越快(可以根據此設置游戲難度)}while (--t){if (kbhit() != 0) //若鍵盤被敲擊,則退出循環break;}if (t == 0) //鍵盤未被敲擊{if (IsLegal(shape, form, x, y + 1) == 0) //方塊再下落就不合法了(已經到達底部){//將當前方塊的信息錄入face當中//face:記錄界面的每個位置是否有方塊,若有方塊還需記錄該位置方塊的顏色。for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){if (block[shape][form].space[i][j] == 1){face.data[y + i][x + j] = 1; //將該位置標記為有方塊face.color[y + i][x + j] = shape; //記錄該方塊的顏色數值}}}while (JudeFunc()); //判斷此次方塊下落是否得分以及游戲是否結束break; //跳出當前死循環,準備進行下一個方塊的下落}else //未到底部{DrawSpace(shape, form, x, y); //用空格覆蓋當前方塊所在位置y++; //縱坐標自增(下一次顯示方塊時就相當于下落了一格了)}}else //鍵盤被敲擊{char ch = getch(); //讀取keycodeswitch (ch){case DOWN: //方向鍵:下if (IsLegal(shape, form, x, y + 1) == 1) //判斷方塊向下移動一位后是否合法{//方塊下落后合法才進行以下操作DrawSpace(shape, form, x, y); //用空格覆蓋當前方塊所在位置y++; //縱坐標自增(下一次顯示方塊時就相當于下落了一格了)}break;case LEFT: //方向鍵:左if (IsLegal(shape, form, x - 1, y) == 1) //判斷方塊向左移動一位后是否合法{//方塊左移后合法才進行以下操作DrawSpace(shape, form, x, y); //用空格覆蓋當前方塊所在位置x--; //橫坐標自減(下一次顯示方塊時就相當于左移了一格了)}break;case RIGHT: //方向鍵:右if (IsLegal(shape, form, x + 1, y) == 1) //判斷方塊向右移動一位后是否合法{//方塊右移后合法才進行以下操作DrawSpace(shape, form, x, y); //用空格覆蓋當前方塊所在位置x++; //橫坐標自增(下一次顯示方塊時就相當于右移了一格了)}break;case SPACE: //空格鍵if (IsLegal(shape, (form + 1) % 4, x, y + 1) == 1) //判斷方塊旋轉后是否合法{//方塊旋轉后合法才進行以下操作DrawSpace(shape, form, x, y); //用空格覆蓋當前方塊所在位置y++; //縱坐標自增(總不能原地旋轉吧)form = (form + 1) % 4; //方塊的形態自增(下一次顯示方塊時就相當于旋轉了)}break;case ESC: //Esc鍵system("cls"); //清空屏幕color(7);CursorJump(COL, ROW / 2);printf(" 游戲結束 ");CursorJump(COL, ROW / 2 + 2);exit(0); //結束程序case 's':case 'S': //暫停system("pause>nul"); //暫停(按任意鍵繼續)break;case 'r':case 'R': //重新開始system("cls"); //清空屏幕main(); //重新執行主函數}}}shape = nextShape, form = nextForm; //獲取下一個方塊的信息DrawSpace(nextShape, nextForm, COL + 3, 3); //將右上角的方塊信息用空格覆蓋} } //從文件讀取最高分 void ReadGrade() {FILE* pf = fopen("俄羅斯方塊最高得分記錄.txt", "r"); //以只讀方式打開文件if (pf == NULL) //打開文件失敗{pf = fopen("俄羅斯方塊最高得分記錄.txt", "w"); //以只寫方式打開文件(文件不存在可以自動創建該文件)fwrite(&grade, sizeof(int), 1, pf); //將max寫入文件(此時max為0),即將最高歷史得分初始化為0}fseek(pf, 0, SEEK_SET); //使文件指針pf指向文件開頭fread(&max, sizeof(int), 1, pf); //讀取文件中的最高歷史得分到max當中fclose(pf); //關閉文件pf = NULL; //文件指針及時置空 } //更新最高分到文件 void WriteGrade() {FILE* pf = fopen("俄羅斯方塊最高得分記錄.txt", "w"); //以只寫方式打開文件if (pf == NULL) //打開文件失敗{printf("保存最高得分記錄失敗\n");exit(0);}fwrite(&grade, sizeof(int), 1, pf); //將本局游戲得分寫入文件當中(更新最高歷史得分)fclose(pf); //關閉文件pf = NULL; //文件指針及時置空 }游戲代碼詳解
游戲框架構建
首先我們定義一下界面的大小,我們這里定義游戲區的行數和列數。
#define ROW 29 //游戲區行數 #define COL 20 //游戲區列數我這里將方塊堆積的區域稱為游戲區,將按鍵提示以及方塊提示的區域稱為提示區。
我們還需要一個結構體,該結構體記錄界面的每個位置是否有方塊,若有方塊還需記錄該位置方塊的顏色。
其次,我們還需要一個結構體,該結構體當中存儲著一個4行4列的二維數組,這個二維數組就用于存儲單個方塊的基本信息。(眾所周知,4行4列的二維數組可以容納下游戲當中的每一種方塊)
而俄羅斯方塊當中有7種基本形狀的方塊,而每種方塊通過旋轉后又可以得到3種方塊,共28種。
因此,我們可以用該結構體定義一個7行4列的二維數組存儲這28個方塊的信息。
struct Block {int space[4][4]; }block[7][4]; //用于存儲7種基本形狀方塊的各自的4種形態的信息,共28種做到這里框架已經基本構建好了,為了提高代碼的可讀性,我們再根據需要用到的按鍵的鍵碼值對其進行宏定義。
#define DOWN 80 //方向鍵:下 #define LEFT 75 //方向鍵:左 #define RIGHT 77 //方向鍵:右#define SPACE 32 //空格鍵 #define ESC 27 //Esc鍵隱藏光標
光標的作用在于提醒使用者,你接下來的輸入將會在該位置出現。但在進行游戲時我們并不需要用到光標,光標在那里一閃一閃的顯然是不行的,這時我們需要將光標隱藏。
//隱藏光標 void HideCursor() {CONSOLE_CURSOR_INFO curInfo; //定義光標信息的結構體變量curInfo.dwSize = 1; //如果沒賦值的話,隱藏光標無效curInfo.bVisible = FALSE; //將光標設置為不可見HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //獲取控制臺句柄SetConsoleCursorInfo(handle, &curInfo); //設置光標信息 }其中,關鍵結構CONSOLE_CURSOR_INFO在其頭文件當中的內容如下:
設置光標信息函數在其頭文件中的聲明如下:
光標跳轉
在屏幕上進行輸出時,我們需要光標先移動到目標位置再進行輸出,因此,光標跳轉函數也是必不可少的。
//光標跳轉 void CursorJump(int x, int y) {COORD pos; //定義光標位置的結構體變量pos.X = x; //橫坐標設置pos.Y = y; //縱坐標設置HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //獲取控制臺句柄SetConsoleCursorPosition(handle, pos); //設置光標位置 }其中,關鍵結構COORD在其頭文件當中的內容如下:
設置光標位置函數在其頭文件中的聲明如下:
初始化界面
初始化界面完成基本信息的打印,包括由白色方塊構成的邊界和按鍵提示語句。
對照最終效果圖片,看著代碼很好理解,但是需要注意兩點:
例如,想要將光標跳轉到 i 行 j 列(這里所說的行和列都是以一個方塊為單位),就等價于讓光標跳轉到坐標(2*j,i)處。
//初始化界面 void InitInterface() {color(7); //顏色設置為白色for (int i = 0; i < ROW; i++){for (int j = 0; j < COL + 10; j++){if (j == 0 || j == COL - 1 || j == COL + 9){face.data[i][j] = 1; //標記該位置有方塊CursorJump(2 * j, i);printf("■");}else if (i == ROW - 1){face.data[i][j] = 1; //標記該位置有方塊printf("■");}elseface.data[i][j] = 0; //標記該位置無方塊}}for (int i = COL; i < COL + 10; i++){face.data[8][i] = 1; //標記該位置有方塊CursorJump(2 * i, 8);printf("■");}CursorJump(2 * COL, 1);printf("下一個方塊:");CursorJump(2 * COL + 4, ROW - 19);printf("左移:←");CursorJump(2 * COL + 4, ROW - 17);printf("右移:→");CursorJump(2 * COL + 4, ROW - 15);printf("加速:↓");CursorJump(2 * COL + 4, ROW - 13);printf("旋轉:空格");CursorJump(2 * COL + 4, ROW - 11);printf("暫停: S");CursorJump(2 * COL + 4, ROW - 9);printf("退出: Esc");CursorJump(2 * COL + 4, ROW - 7);printf("重新開始:R");CursorJump(2 * COL + 4, ROW - 5);printf("最高紀錄:%d", max);CursorJump(2 * COL + 4, ROW - 3);printf("當前分數:%d", grade); }初始化方塊信息
上面說到俄羅斯方塊有7種基本形狀,便是以下7種:
我們先將這7種基本形狀的方塊信息存儲在各自的第0種形態處,如下:
然后取第0種形態順時針旋轉后得到第1種形態,取第1種形態順時針旋轉后得到第2種形態,取第2種形態順時針旋轉后得到第3種形態。這7種形狀都按此方法操作,最終得到全部28種方塊信息,如下:
在旋轉過程中,一個方塊順時針旋轉一次后其位置變換規律如下:
顏色設置
這里的顏色設置函數所接收的參數c(0~6),代表7種形狀的方塊,每種方塊對應自己的顏色,所對應的顏色可以自己設置。
設置顏色函數在其頭文件中的聲明如下:
畫出方塊
方塊的信息有了,接下來就是將方塊在屏幕上顯示出來。該函數的作用是,將第shape種形狀的第form種形態的方塊打印在屏幕的指定位置處。
所給x和y,指的是方塊信息當中第一行第一列的方塊的打印位置。
空格覆蓋
無論是游戲區方塊的移動,還是提示區右上角下一個方塊的顯示,都需要方塊位置的變換,而在變化之前肯定是要先將之前打印的方塊用空格進行覆蓋,然后再打印變化后的方塊。
在覆蓋方塊時特別需要注意的是,要覆蓋一個小方塊需要用兩個空格。
//空格覆蓋 void DrawSpace(int shape, int form, int x, int y) {for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){if (block[shape][form].space[i][j] == 1) //如果該位置有方塊{CursorJump(2 * (x + j), y + i); //光標跳轉到指定位置printf(" "); //打印空格覆蓋(兩個空格)}}} }合法性判斷
其實在方塊移動過程中,無時無刻都在判斷方塊下一次變化后的位置是否合法,只有合法才會允許該變化的進行。
所謂非法,就是指該方塊進行了該變化后落在了本來就有方塊的位置。
//合法性判斷 int IsLegal(int shape, int form, int x, int y) {for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){//如果方塊落下的位置本來就已經有方塊了,則不合法if ((block[shape][form].space[i][j] == 1) && (face.data[y + i][x + j] == 1))return 0; //不合法}}return 1; //合法 }判斷得分與結束
判斷得分:
從下往上判斷,若某一行方塊全滿,則將改行方塊數據清空,并將該行上方的方塊全部下移,下移結束后返回1,表示還需再次調用該函數進行判斷,因為被下移的行并沒有進行判斷,可能還存在滿行。
判斷結束:
游戲主體邏輯函數
主體邏輯:
注意: 這里只是概括性的說明了俄羅斯方塊的主體邏輯,代碼當中還有大量注釋以供大家理解。
從文件讀取最高分
首先需要使用fopen函數打開“俄羅斯方塊最高記錄.txt”文件,若是第一次運行該代碼,則會自動創建該文件,并將歷史最高記錄設置為0,之后讀取文件當中的歷史最高記錄存儲在max變量當中,并關閉文件即可。
//從文件讀取最高分 void ReadGrade() {FILE* pf = fopen("俄羅斯方塊最高得分記錄.txt", "r"); //以只讀方式打開文件if (pf == NULL) //打開文件失敗{pf = fopen("俄羅斯方塊最高得分記錄.txt", "w"); //以只寫方式打開文件(文件不存在可以自動創建該文件)fwrite(&grade, sizeof(int), 1, pf); //將max寫入文件(此時max為0),即將最高歷史得分初始化為0}fseek(pf, 0, SEEK_SET); //使文件指針pf指向文件開頭fread(&max, sizeof(int), 1, pf); //讀取文件中的最高歷史得分到max當中fclose(pf); //關閉文件pf = NULL; //文件指針及時置空 }更新最高分到文件
首先使用fopen函數打開“俄羅斯方塊最高記錄.txt”,然后將本局游戲的分數grade寫入文件當中即可(覆蓋式)。
//更新最高分到文件 void WriteGrade() {FILE* pf = fopen("俄羅斯方塊最高得分記錄.txt", "w"); //以只寫方式打開文件if (pf == NULL) //打開文件失敗{printf("保存最高得分記錄失敗\n");exit(0);}fwrite(&grade, sizeof(int), 1, pf); //將本局游戲得分寫入文件當中(更新最高歷史得分)fclose(pf); //關閉文件pf = NULL; //文件指針及時置空 }主函數
主函數里面就是依次調用以上函數,但有三點需要說明:
總結
以上是生活随笔為你收集整理的俄罗斯方块(C语言实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 转: Jenkins+Gradle实
- 下一篇: 安卓APP_ 四大基本组件(1)—— A