C語言課程設(shè)計報告游戲2048_第1頁
C語言課程設(shè)計報告游戲2048_第2頁
C語言課程設(shè)計報告游戲2048_第3頁
C語言課程設(shè)計報告游戲2048_第4頁
C語言課程設(shè)計報告游戲2048_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、 東華理工大學(xué) C語言課程設(shè)計 報告學(xué)院: 國際教育學(xué)院學(xué)院 專業(yè): 電子信息工程 班級: 1420606 學(xué)號: 201420060638 姓名: 鐘天運 1、 課程設(shè)計題目:游戲20482、 課程設(shè)計要求:a) 使用C語言編寫2048這款游戲b) 能夠正常運行,擁有游戲界面。c) 能正常進行游戲從開始到結(jié)束。d) 用戶操作方便3、 設(shè)計思路:a) 游戲介紹:i. 2048是一款簡單的數(shù)字類游戲,界面是一個4*4的方形格子。每個格子里可以為空或者有一個2n的數(shù)值。ii. 用戶可以輸入4種指令,分別是:上下左右,游戲會根據(jù)用戶的指定的方向,將格子中的數(shù)值向?qū)?yīng)方向進行移動,直至移動到最邊上的格

2、子或者有其他數(shù)值占用,如果碰到等大數(shù)值,將會進行合并。此外,成功移動后,會在一個空格子隨機生成一個2或者4iii. 游戲目標(biāo)是合成2048這個數(shù)值或者更大的數(shù)值。b) 實現(xiàn)思路:i. 可以使用二維數(shù)組來保存4*4格子中的數(shù)值ii. 指令,可以通過輸入字符函數(shù),讀取用戶在鍵盤上的方向鍵,進行判斷執(zhí)行對應(yīng)的代碼。iii. 游戲界面,可以使用簡單的特殊制表符,來實現(xiàn),并通過清屏函數(shù)來進行反復(fù)同位置打印界面。iv. 需要判斷游戲結(jié)束的函數(shù),以及記錄游戲分數(shù)和步驟的變量v. 當(dāng)游戲結(jié)束時,能夠詢問 用戶是否重新開始。vi. 隨機生成一個新數(shù),可以調(diào)用隨機函數(shù),使用時間做種子。c) 實現(xiàn)難點:i. 打印游

3、戲界面,要實現(xiàn)靈活能根據(jù)棋盤數(shù)組里面的數(shù)據(jù)靈活打印。ii. 執(zhí)行操作時,數(shù)值的移動和合并。4、 流程圖5、 C語言源代碼/ 游戲2048.c#include "windows.h"#include "time.h"#include "stdio.h"#include "conio.h"#include "string.h"/宏定義常量 方向鍵值/const int LEFT = 75, UP = 72, RIGHT = 77, DOWN = 80;#define LEFT 75#define U

4、P 72#define RIGHT 77#define DOWN 80const char error_str = "您上次輸入的指令無法識別,請重新輸入。"struct boardint place44;long int stepn;long int num;/存儲游戲分數(shù)long int time;int dtk;/direction key 記錄方向鍵,及操作方向int over;int zeronum;/該函數(shù)為游戲運行函數(shù),當(dāng)只是玩游戲的時候。進入該函數(shù),游戲控制函數(shù)。int main()/place數(shù)組為棋盤,其中為零代表空,-1代表不能合并的牌,其他2的倍數(shù)值

5、為本身含義,初始化為全0。struct board board1, board_backup;int newgame(struct board *, int),show(struct board *),operate(struct board *);char str100 = "首次運行游戲"/用于記錄系統(tǒng)返回給用戶的信息,例如:上一步執(zhí)行向左合并,按鍵有誤等newgame(&board1, 0);/調(diào)用函數(shù)為新局初始化,第二個參數(shù)為初始化方式show(&board1);printf("n%snn請從鍵盤上單擊方向鍵,指定下一步操作(ESC鍵退出游

6、戲)n", str);doswitch (_getch()case 224:switch (board1.dtk = _getch()case LEFT:strcpy_s(str, sizeof(str), "您上次輸入的方向鍵為:,已執(zhí)行左向合并。"); board_backup = board1; operate(&board1); break;case UP:strcpy_s(str, sizeof(str), "您上次輸入的方向鍵為:,已執(zhí)行上向合并。"); board_backup = board1; operate(&

7、;board1); break;case RIGHT:strcpy_s(str, sizeof(str), "您上次輸入的方向鍵為:,已執(zhí)行右向合并。"); board_backup = board1; operate(&board1); break;case DOWN:strcpy_s(str, sizeof(str), "您上次輸入的方向鍵為:,已執(zhí)行下向合并。"); board_backup = board1; operate(&board1); break;default:strcpy_s(str, sizeof(str), er

8、ror_str);break;case 27:exit(27);default:strcpy_s(str, sizeof(str), error_str);system("cls");show(&board1);printf("n%snn請從鍵盤上單擊方向鍵,指定下一步操作(ESC鍵退出游戲)n", str);if (board1.over)printf("n游戲結(jié)束,是否重新開始?(y重新開始/n或ECS退出/其他鍵無效)");while (1)str99 = _getch();if (str99 = 'y'

9、)newgame(&board1, 0);show(&board1);break;else if (str99 = 'c')change(&board1, &board_backup);break;else if (str99 = 'n' | str99 = 27)break; while (!board1.over);printf("n按任意鍵退出");_getch();return 0;/該函數(shù)為主要打印函數(shù),包括棋盤的打印,分數(shù),等信息int show(struct board * pboard)int

10、i, j, x, len,numlen(int);printf("游戲2048游戲運行時間:%ld Sn", time(NULL) - (*pboard).time);printf("游戲分數(shù):%ld", (*pboard).num);printf(" 已執(zhí)行步驟數(shù):%ldn", (*pboard).stepn);/開始繪制棋盤printf("n n");for (i = 0; i < 7; +i)if (i % 2 = 0)printf("");for (j = 0; j < 8;

11、 +j)if (j % 2 = 0)if (*pboard).placei / 2j / 2 = 0)printf(" ");/如果值為0,輸入六個空格else/打印值時。調(diào)用numlen判斷值的位數(shù),控制數(shù)值前后的空格數(shù)量,最長為6,若為奇數(shù),前面空格比后面多一個。len = numlen(*pboard).placei / 2j / 2);for (x = 0; x < (6 - len + 1) / 2; +x)printf(" ");printf("%d", (*pboard).placei / 2j / 2);for

12、(x = 0; x < (6 - len) / 2; +x)printf(" ");elseprintf("");elseprintf(" nn ");printf("n");printf(" nn");return 0;/這是show函數(shù)的附屬函數(shù),用于求一個整數(shù)長度。int numlen(int a)int i, n = 1;for (i = 1; i < 11; +i)n *= 10;if (a = a%n)return i;return 0;/開始新的游戲,將棋盤和數(shù)據(jù)初始化

13、,或者載入棋盤,第二個參數(shù)決定初始化方案,默認0int newgame(struct board * pboard, int project)int i, j, t;(*pboard).stepn = 0;(*pboard).num = 0;(*pboard).time = (long int)time(NULL);/取當(dāng)前時間為開始時間(*pboard).dtk = 0;(*pboard).over = 0;(*pboard).zeronum = 14;for (i = 0; i < 4; +i)for (j = 0; j < 4; +j)(*pboard).placeij =

14、0;doi = (int)(rand() / 32768.0 * 4);j = (int)(rand() / 32768.0 * 4); while (*pboard).placeij);t = 2 * (int)(rand() / 32768.0 * 2) + 1);(*pboard).placeij = t;doi = (int)(rand() / 32768.0 * 4);j = (int)(rand() / 32768.0 * 4); while (*pboard).placeij);t = 2 * (int)(rand() / 32768.0 * 2) + 1);(*pboard).

15、placeij = t;return 0;/主要操作函數(shù),調(diào)用該函數(shù),將執(zhí)行結(jié)構(gòu)體中對應(yīng)按鍵值的方向的操作,并增加分數(shù)和操作次數(shù)。int operate(struct board * pboard)int i, j, t, shun = -1, alter = 0,/alter變量是用來判斷執(zhí)行步驟的時候是否改變了棋局。shun用來記錄已經(jīng)進行合并的值對應(yīng)的I或J,用來避免該值再次合并randget(struct board *),calczeronum(struct board *);switch (*pboard).dtk)case UP:for (j = 0; j < 4; +j,

16、 shun = -1)for (i = 1; i < 4; +i)if (*pboard).placeij != 0)for (t = i - 1; t >= 0; -t)if (*pboard).placetj != 0)if (*pboard).placetj = (*pboard).placeij && shun != t)(*pboard).num += (*pboard).placetj *= 2;(*pboard).placeij = 0;shun = t;alter = 1;else if (t + 1 != i)(*pboard).placet +

17、1j = (*pboard).placeij;(*pboard).placeij = 0;alter = 1;break;else if (t = 0)(*pboard).placetj = (*pboard).placeij;(*pboard).placeij = 0;alter = 1;break;break;case DOWN:for (j = 0; j < 4; +j, shun = -1)for (i = 2; i >= 0; -i)if (*pboard).placeij != 0)for (t = i + 1; t < 4; +t)if (*pboard).pl

18、acetj != 0)if (*pboard).placetj = (*pboard).placeij && shun != t)(*pboard).num += (*pboard).placetj *= 2;(*pboard).placeij = 0;shun = t;alter = 1;else if (t - 1 != i)(*pboard).placet - 1j = (*pboard).placeij;(*pboard).placeij = 0;alter = 1;break;else if (t = 3)(*pboard).placetj = (*pboard).p

19、laceij;(*pboard).placeij = 0;alter = 1;break;break;case RIGHT:for (i = 0; i < 4; +i, shun = -1)for (j = 2; j >= 0; -j)if (*pboard).placeij != 0)for (t = j + 1; t < 4; +t)if (*pboard).placeit != 0)if (*pboard).placeit = (*pboard).placeij && shun != t)(*pboard).num += (*pboard).placei

20、t *= 2;(*pboard).placeij = 0;shun = t;alter = 1;else if (t - 1 != j)(*pboard).placeit - 1 = (*pboard).placeij;(*pboard).placeij = 0;alter = 1;break;else if (t = 3)(*pboard).placeit = (*pboard).placeij;(*pboard).placeij = 0;alter = 1;break;break;case LEFT:for (i = 0; i < 4; +i, shun = -1)for (j =

21、1; j < 4; +j)if (*pboard).placeij != 0)for (t = j - 1; t >= 0; -t)if (*pboard).placeit != 0)if (*pboard).placeit = (*pboard).placeij && shun != t)(*pboard).num += (*pboard).placeit *= 2;(*pboard).placeij = 0;shun = t;alter = 1;else if (t + 1 != j)(*pboard).placeit + 1 = (*pboard).place

22、ij;(*pboard).placeij = 0;alter = 1;break;else if (t = 0)(*pboard).placeit = (*pboard).placeij;(*pboard).placeij = 0;alter = 1;break;break;default:return -1;if (alter)+(*pboard).stepn;return randget(pboard);return 1;/計算place數(shù)組中有多少個零,即多少個空位,返回值等同于 board1.zeronumint calczeronum(struct board * pboard)in

23、t i, j;for (*pboard).zeronum = 0, i = 0; i < 4; +i)for (j = 0; j < 4; +j)if (*pboard).placeij = 0)+(*pboard).zeronum;return (*pboard).zeronum;/新數(shù)生成函數(shù)。每次有效執(zhí)行 操作函數(shù) 時,進行新的數(shù)生成int randget(struct board * pboard)int i, j, t, x,ifover(struct board *);calczeronum(pboard);t = (int)(rand() / 32768.0 * (*pboard).zeronum) + 1;for (x = 0, i = 0; i < 4; +i)for (j = 0; j < 4; +j)if (*pboa

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論