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

下載本文檔

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

文檔簡(jiǎn)介

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

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

3、戲界面,要實(shí)現(xiàn)靈活能根據(jù)棋盤數(shù)組里面的數(shù)據(jù)靈活打印。ii. 執(zhí)行操作時(shí),數(shù)值的移動(dòng)和合并。4、 流程圖5、 C語(yǔ)言源代碼/ 游戲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 = "您上次輸入的指令無(wú)法識(shí)別,請(qǐng)重新輸入。"struct boardint place44;long int stepn;long int num;/存儲(chǔ)游戲分?jǐn)?shù)long int time;int dtk;/direction key 記錄方向鍵,及操作方向int over;int zeronum;/該函數(shù)為游戲運(yùn)行函數(shù),當(dāng)只是玩游戲的時(shí)候。進(jìn)入該函數(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 = "首次運(yùn)行游戲"/用于記錄系統(tǒng)返回給用戶的信息,例如:上一步執(zhí)行向左合并,按鍵有誤等newgame(&board1, 0);/調(diào)用函數(shù)為新局初始化,第二個(gè)參數(shù)為初始化方式show(&board1);printf("n%snn請(qǐng)從鍵盤上單擊方向鍵,指定下一步操作(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請(qǐng)從鍵盤上單擊方向鍵,指定下一步操作(ESC鍵退出游戲)n", str);if (board1.over)printf("n游戲結(jié)束,是否重新開(kāi)始?(y重新開(kāi)始/n或ECS退出/其他鍵無(wú)效)");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ù),包括棋盤的打印,分?jǐn)?shù),等信息int show(struct board * pboard)int

10、i, j, x, len,numlen(int);printf("游戲2048游戲運(yùn)行時(shí)間:%ld Sn", time(NULL) - (*pboard).time);printf("游戲分?jǐn)?shù):%ld", (*pboard).num);printf(" 已執(zhí)行步驟數(shù):%ldn", (*pboard).stepn);/開(kāi)始繪制棋盤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,輸入六個(gè)空格else/打印值時(shí)。調(diào)用numlen判斷值的位數(shù),控制數(shù)值前后的空格數(shù)量,最長(zhǎng)為6,若為奇數(shù),前面空格比后面多一個(gè)。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ù),用于求一個(gè)整數(shù)長(zhǎng)度。int numlen(int a)int i, n = 1;for (i = 1; i < 11; +i)n *= 10;if (a = a%n)return i;return 0;/開(kāi)始新的游戲,將棋盤和數(shù)據(jù)初始化

13、,或者載入棋盤,第二個(gè)參數(shù)決定初始化方案,默認(rèn)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)前時(shí)間為開(kāi)始時(shí)間(*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)體中對(duì)應(yīng)按鍵值的方向的操作,并增加分?jǐn)?shù)和操作次數(shù)。int operate(struct board * pboard)int i, j, t, shun = -1, alter = 0,/alter變量是用來(lái)判斷執(zhí)行步驟的時(shí)候是否改變了棋局。shun用來(lái)記錄已經(jīng)進(jìn)行合并的值對(duì)應(yīng)的I或J,用來(lái)避免該值再次合并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;/計(jì)算place數(shù)組中有多少個(gè)零,即多少個(gè)空位,返回值等同于 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í),進(jìn)行新的數(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論