第一篇:C語言程序設計掃雷游戲
C語言程序設計報告
題目: 掃雷小游戲設計
電子通信與物理學院 日期:2018年7月 12 日
指導教師評語
目錄
1.課程設計內(nèi)容...........................................................................................................1 2.課程設計目的...........................................................................................................1 3.背景知識..................................................................................................................1 4.工具/準備工作..........................................................................................................3 5.設計步驟、方法.....................................................................................................3
5.1........................................................................................................................3 5.2定義全局變量..................................................................................................4 5.3挖雷部分函數(shù)的分析.......................................................................................5 6.設計結果及分析.....................................................................................................11 7.設計結論...............................................................................................................16 8.參考文獻...............................................................................................................17 附錄...........................................................................................................................17
1.課程設計內(nèi)容
在計算機逐步滲入社會生活各個層面的今天,計算機已經(jīng)成為人們?nèi)粘I畹囊环?,越來越多的人使用計算機辦公、娛樂等等。
掃雷游戲是Windows操作系統(tǒng)自帶的一款小游戲,在過去的幾年里,Windows操作系統(tǒng)歷經(jīng)數(shù)次換代更新,變得越來越龐大、復雜,功能也越來越強大,但是這款小游戲依然保持原來的容貌,可見這款小游戲受到越來越多人的喜愛。我利用C-free編寫了與它功能相仿的挖地雷游戲,寓學于樂。
即:設計一個功能與Windows中的挖雷游戲相同的小游戲。
2.課程設計目的
1.培養(yǎng)學生綜合運用所學知識獨立完成課題的能力。
2.試學生更深入地理解和掌握該課程中的有關基本概念,程序設計思想和方法。3.提高對工作認真負責、一絲不茍,對同學團結友愛,協(xié)作攻關的基本素質(zhì)。4.培養(yǎng)勇于探索、嚴謹推理、實事求是、有錯必改,用實踐來檢驗理論,全方位考慮問題等科學技術人員應具有的素質(zhì)。
5.培養(yǎng)從資料文獻、科學實驗中獲得知識的能力,提高從別人經(jīng)驗中找到解決問題的新途徑的悟性,初步培養(yǎng)工程意識和創(chuàng)新能力。
6.對掌握知識的深度、運用理論去處理問題的能力、實驗能力、課程設計能力、書面及口頭表達能力進行考核
3.背景知識
游戲區(qū)包括雷區(qū)、地雷計數(shù)器(位于左上角,記錄剩余地雷數(shù))和計時器(位于 右上角,記錄游戲時間),確定大小的矩形雷區(qū)中隨機布置一定數(shù)量的地雷(初級為9*9個方塊10個雷,中級為16*16個方塊40個雷,高級為16*30個方塊99個雷,自定義級別可以自己設定雷區(qū)大小和雷數(shù),但是雷區(qū)大小不能超過24*30),玩家需要盡快找出雷區(qū)中的所有不是地雷的方塊,而不許踩到地雷。
游戲的基本操作包括左鍵單擊(Left Click)、右鍵單擊(Right Click)、雙擊(Chording)三種。其中左鍵用于打開安全的格子,推進游戲進度;右鍵用于標記地雷,以輔助判斷,或為接下來的雙擊做準備;雙擊在一個數(shù)字周圍的地雷標記完時,相當于對數(shù)字周圍未打開的方塊均進行一次左鍵單擊操作:
左鍵單擊:在判斷出不是雷的方塊上按下左鍵,可以打開該方塊。如果方塊上出現(xiàn)數(shù)字,則該數(shù)字表示其周圍3×3區(qū)域中的地雷數(shù)(一般為8個格子,對于邊塊為5個格子,對于角塊為3個格子。所以掃雷中最大的數(shù)字為8);如果方塊上為空(相當于0),則可以遞歸地打開與空相鄰的方塊;如果不幸觸雷,則游戲結束。
雙擊:同時按下左鍵和右鍵完成雙擊。當雙擊位置周圍已標記雷數(shù)等于該位置數(shù)字時操作有效,相當于對該數(shù)字周圍未打開的方塊均進行一次左鍵單擊操作。地雷未標記完全時使用雙擊無效。若數(shù)字周圍有標錯的地雷,則游戲結束,標錯的地雷上會顯示一個“ ×”(見下圖)
掃雷的設計原理: 掃雷游戲分為幾個步驟: 第一步,使用二維數(shù)組表示地圖; 第二步,隨機生成幾個地雷;
第三步,點擊方格的反應,計算每個非雷區(qū)方格點開后的數(shù)字; 第四步,當方格數(shù)字為0的情況; 第五步,當方格為地雷的情況。
第一步地圖的大小和第二步地雷的數(shù)量都應該是程序中給定的,或者玩家輸入的。這個是多少自己決定吧。第三步,計算非雷區(qū)方格點開后的數(shù)字就把這個方格在二維數(shù)組中周圍八個方向的方格是否是地雷都檢查一遍,一定要注意不要越出數(shù)組邊界。這個數(shù)字可以在游戲初始化時全都計算好,也可以在玩家點擊的時候再計算。點 擊非雷區(qū)方格,顯示數(shù)字,這個方格標記為“已點過”。第四步,當方格數(shù)字為0時,這里要用到遞歸調(diào)用,就是讓程序自動“點擊”這個數(shù)字為0方格周圍的八個方格,然后再看結果,如果不是0,就停止,如果是0,依然遞歸調(diào)用,直到?jīng)]有0為止,或者直到點遍所有方格為止,一定要注意不要越出數(shù)組邊界。第五步,很簡單,宣布玩家死亡就可以了。
4.準備工作
查閱相關資料,了解掃雷的的玩法,了解掃雷的設計思想方法。借鑒他人寫過的程序,從中找到突破口。從程序中了解需要的各種函數(shù)準備,再進一步獲悉該函數(shù)的功能與使用方法。
對自己要設計的挖地雷游戲進行功能分析,大致如下:
總體游戲過程分析:在屏幕上顯示一個游戲界面,雷區(qū)范圍內(nèi)預先埋設了一定數(shù)量的隨機分布的地雷(用數(shù)字9代替地雷);玩家通過從鍵盤中輸入(行數(shù)X,列數(shù)Y)↙進行點擊;若能點中所有非雷區(qū),則游戲勝利;否則踩雷,游戲失敗。簡易版掃雷游戲要具備以下功能:
1)開局:首先選擇游戲等級,然后生成不同等級的雷區(qū)界面。游戲等級分 為三級:各等級行列數(shù)為———:簡單:10×
10、普通:15×
15、困難:20×20;雷區(qū)每個*號下面或埋藏有1個地雷,或者沒有地雷;
2)挖雷:從鍵盤中輸入(行數(shù)X,列數(shù)Y),并按回車鍵,可挖開它;若所揭方塊下有9,則踩雷,此時所有含地雷的塊都出現(xiàn)9,該局游戲失??;如果方塊上出現(xiàn)數(shù)字,它代表 在它周圍的8個方塊中共有多少顆地雷;
3)輸入:通過鍵盤輸入相關指示信息; 4)輸出:提示游戲失敗,是否繼續(xù)再來一遍;
5.設計步驟、方法 5.1主函數(shù)第一步,寫出主程序的基本框架,確定各子模塊名字和參數(shù)。具體的函數(shù)流程如圖5-3 所示:
定義使用到的常數(shù)、全局變量、函數(shù)原型說明。然后初始化圖形系統(tǒng),調(diào)用游戲控制函數(shù),游戲只接受鍵盤,通過鼠標結束游戲,關閉系統(tǒng),退出游戲。
主控模塊的各子模塊說明:
void InitialValue_game()用于棋盤初始化; InitialMine_game()用于棋盤的隨機布雷; void print_game()用于打印棋盤; int judge_game()用于判斷游戲是否結束; int openmap()用于點開地圖;
5.2定義全局變量
#include
5.3挖雷部分函數(shù)的分析
void InitialValue_game(struct Games *g){ int i,j;for(i=0;i InitialMine_game(struct Games *g){ 5 int i,j,next1,next2;int sum=0;srand((unsigned)time(NULL));while(1){ i=rand()%x;j=rand()%y;if((*g).game_int[i][j]==9)continue;(*g).game_int[i][j]=9;++sum;for(next1=-1;next1<2;next1++){ for(next2=-1;next2<2;next2++){ if(-1 void print_game(struct Games *g,int Logo){ int i,j;int a[s];for(i=0;i int judge_game(struct Games *g){ int sum=0;int i,j;for(i=0;i 運行第一步: 按ENTER鍵進入: 11 選擇游戲難度(簡單、普通、困難、任意),按ENTER鍵進入: 簡單難度: 普通難度: 困難難度: 任意難度: 游戲界面,開始從鍵盤輸入數(shù)字,格式為(行數(shù)X,列數(shù)Y),點擊Enter鍵: 游戲結束頁面: 7.設計結論 一學期結束了,對C語言也有了一些認識,不過自我感覺學得不太好,好在還是學到了知識: 了解了C的發(fā)展以及編程的基本步驟,學會了Printf輸出語句,C語言的運算,知道了有哪幾種數(shù)據(jù)類型,還有我覺得經(jīng)常用的if語句,if--eles語句,for循環(huán),while 語句,do-while語句等等,基本會用數(shù)組和指針,還有字符串的處理,對了還有才學的結構體。 還有許多知識點,不一羅列了,總之C語言要學的東西太多了,聽大三的都說C很簡單,但我并不認為他像人們說的那樣簡單,C是最基礎的,基礎不代表簡單,也可能是我沒學好才有這樣的感受。 在這次設計過程中,不僅復習課本上所學知識,還通過查資料、問同學學到了課本上沒有的知識。從而啟發(fā)我,要想寫好程序,在寫好課本知識的同時還需要多讀和專業(yè)有關的一些書籍,同時還需要多動腦子,盡量把所學的知識綜合起來應用,力爭寫出完美的程序。除此之外,我還得到了一些有用的教訓:寫程序時必須要細心,不能輸錯一個字符標點,就連全角半角也得注意。在修改時要有耐心,編譯出錯后必須逐個錯誤去改正,絕不能心急浮躁,否則修改之后還會有新的錯誤。 8.參考文獻 郭翠英主編的《C語言課程設計實例精編》; 張芳妮 呂波 譯《C語言編程常見問題解答》; 譚浩強《C程序設計題解與上機指導(第二版)》。伍俊良.VB課程設計與系統(tǒng)開發(fā)案例[M].北京 附錄: #include main(){ int i,j;/*定義i,j變量*/ int NO;int begin=1;int h;/*確定雷的個數(shù)*/ while(begin){ printf(“nnnnnnn” “ttt=================================n” “ttt 歡迎進入掃雷 nnn” “ttt 按回車鍵繼續(xù) n” “ttt=================================n” “ttt n”);getchar();/*游戲開始界面*/ system(“cls”);printf(“ nnnnnnnnn”);printf(“ 請選擇游戲難度:nn”);printf(“ 1簡單難度nn”);printf(“ 2普通難度nn”);printf(“ 3困難難度nn”);printf(“ 4自定義難度nn”);scanf(“%d”,&h);getchar();/*確定游戲難度*/ if(0 void InitialValue_game(struct Games *g){ int i,j;for(i=0;i InitialMine_game(struct Games *g){ int i,j,next1,next2;int sum=0;srand((unsigned)time(NULL));while(1){ i=rand()%x;j=rand()%y;if((*g).game_int[i][j]==9)continue;(*g).game_int[i][j]=9;++sum;for(next1=-1;next1<2;next1++){ for(next2=-1;next2<2;next2++){ if(-1 void print_game(struct Games *g,int Logo){ int i,j;int a[s];for(i=0;i int judge_game(struct Games *g){ int sum=0;int i,j;for(i=0;i 中南大學 程序設計基礎實踐報告 學生姓名 張?zhí)m蘭 學 院 信息科學與工程學院 專業(yè)班級 物聯(lián)網(wǎng)工程1301班 完成時間 2014.1 題 目 設計一個和window系統(tǒng)類似的小游戲【挖地雷】 《計算機程序設計實踐》403591717.docx 目錄 1.課程設計內(nèi)容.............................................................................................3 2.課程設計目的.............................................................................................3 3.背景知識....................................................................................................3 4.工具/準備工作............................................................................................5 5.設計步驟、方法.........................................................................................5 5.1.步驟1:步驟名稱(二級標題).......................................................錯誤!未定義書簽。 步驟1.1:步驟名稱(三級標題)..............................................................................5 5.1.1.5.2.5.3.步驟2:步驟名稱..........................................................................錯誤!未定義書簽。步驟n:步驟名稱..........................................................................錯誤!未定義書簽。 6.設計結果及分析.........................................................................................5 7.設計結論..................................................................................................15 8.問題及心得體會.......................................................................................16 9.對本設計過程及方法、手段的改進建議....................................................17 10.參考文獻..................................................................................................17 《計算機程序設計實踐》403591717.docx printf(“請輸入棋盤行列數(shù)(小于20且用逗號隔開):”); scanf(“%d,%d”,&x,&y); getchar(); printf(“請輸入雷的個數(shù):”); scanf(“%d”,&b); getchar(); break; } break; } else { printf(“輸入錯誤請重新輸n”); } } while(begin){ system(“cls”); InitialValue_game(&g); InitialMine_game(&g); print_game(&g,2); NO=1; while(NO) { printf(“Please choose:”); scanf(“%d,%d”,&i,&j);getchar();if(-1 { switch(openmap(&g,i-1,j-1)) { case 1: print_game(&g,1); printf(“游戲結束!按回車鍵再來一局n”); 《計算機程序設計實踐》403591717.docx if(getchar()=='n')begin=1; else begin=0; NO=0; break; case 2: if(judge_game(&g)==b) { printf(“win!n”); print_game(&g,1); printf(“按回車鍵再來一局n”); if(getchar()=='n')begin=1; else begin=0; NO=0; break; } else print_game(&g,2);NO=1;break; default:break; } } else { printf(“你輸入錯誤!請重新輸入n”); } } } } 中南大學 程序設計基礎實踐報告 學生姓名 張?zhí)m蘭 學 院 信息科學與工程學院 專業(yè)班級 物聯(lián)網(wǎng)工程1301班 完成時間 2014.1 題 目 設計一個和window系統(tǒng)類似的小游戲【挖地雷】 《計算機程序設計實踐》錯誤!未指定書簽。 目錄 1.課程設計內(nèi)容.............................................................................................3 2.課程設計目的.............................................................................................3 3.背景知識....................................................................................................3 4.工具/準備工作............................................................................................5 5.設計步驟、方法.........................................................................................5 5.1.步驟1:步驟名稱(二級標題).......................................................錯誤!未定義書簽。 步驟1.1:步驟名稱(三級標題)..............................................................................5 5.1.1.5.2.5.3.步驟2:步驟名稱..........................................................................錯誤!未定義書簽。步驟n:步驟名稱..........................................................................錯誤!未定義書簽。 6.設計結果及分析.........................................................................................5 7.設計結論..................................................................................................15 8.問題及心得體會.......................................................................................16 9.對本設計過程及方法、手段的改進建議....................................................17 10.參考文獻..................................................................................................17 《計算機程序設計實踐》錯誤!未指定書簽。 case 4: system(“cls”); printf(“請輸入棋盤行列數(shù)(小于20且用逗號隔開):”); scanf(“%d,%d”,&x,&y); getchar(); printf(“請輸入雷的個數(shù):”); scanf(“%d”,&b); getchar(); break; } break; } else { printf(“輸入錯誤請重新輸n”); } } while(begin){ system(“cls”); InitialValue_game(&g); InitialMine_game(&g); print_game(&g,2); NO=1; while(NO) { printf(“Please choose:”); scanf(“%d,%d”,&i,&j);getchar();if(-1 { switch(openmap(&g,i-1,j-1)) { case 1: 《計算機程序設計實踐》錯誤!未指定書簽。 print_game(&g,1); printf(“游戲結束!按回車鍵再來一局n”); if(getchar()=='n')begin=1; else begin=0; NO=0; break; case 2: if(judge_game(&g)==b) { printf(“win!n”); print_game(&g,1); printf(“按回車鍵再來一局n”); if(getchar()=='n')begin=1; else begin=0; NO=0; break; } else print_game(&g,2);NO=1;break; default:break; } } else { printf(“你輸入錯誤!請重新輸入n”); } } } } C語言掃雷源代碼.txt如果背叛是一種勇氣,那么接受背叛則需要更大的勇氣。愛情是塊磚,婚姻是座山。磚不在多,有一塊就靈;山不在高,守一生就行。#include /*鼠標信息宏定義*/ #define WAITING 0xff00 #define LEFTPRESS 0xff01 #define LEFTCLICK 0xff10 #define LEFTDRAG 0xff19 #define RIGHTPRESS 0xff02 #define RIGHTCLICK 0xff20 #define RIGHTDRAG 0xff2a #define MIDDLEPRESS 0xff04 #define MIDDLECLICK 0xff40 #define MIDDLEDRAG 0xff4c #define MOUSEMOVE 0xff08 struct { int num;/*格子當前處于什么狀態(tài),1有雷,0已經(jīng)顯示過數(shù)字或者空白格子*/ int roundnum;/*統(tǒng)計格子周圍有多少雷*/ int flag;/*右鍵按下顯示紅旗的標志,0沒有紅旗標志,1有紅旗標志*/ }Mine[10][10]; int gameAGAIN=0;/*是否重來的變量*/ int gamePLAY=0;/*是否是第一次玩游戲的標志*/ int mineNUM;/*統(tǒng)計處理過的格子數(shù)*/ char randmineNUM[3];/*顯示數(shù)字的字符串*/ int Keystate;int MouseExist;int MouseButton;int MouseX;int MouseY;int up[16][16],down[16][16],mouse_draw[16][16],pixel_save[16][16]; void MouseMath()/*計算鼠標的樣子*/ {int i,j,jj,k;long UpNum[16]={ 0x3fff,0x1fff,0x0fff,0x07ff, 0x03ff,0x01ff,0x00ff,0x007f, 0x003f,0x00ff,0x01ff,0x10ff, 0x30ff,0xf87f,0xf87f,0xfc3f };long DownNum[16]={ 0x0000,0x7c00,0x6000,0x7000, 0x7800,0x7c00,0x7e00,0x7f00, 0x7f80,0x7e00,0x7c00,0x4600, 0x0600,0x0300,0x0300,0x0180 };for(i=0;i<16;i++){ j=jj=15;while(UpNum[i]!=0){ up[i][j]=UpNum[i]%2;j--;UpNum[i]/=2;} while(DownNum[i]!=0){ down[i][jj--]=DownNum[i]%2;DownNum[i]/=2;} for(k=j;k>=0;k--)up[i][k]=0;for(k=jj;k>=0;k--)down[i][k]=0;for(k=0;k<16;k++)/*四種組合方式*/ { if(up[i][k]==0&&down[i][k]==0)mouse_draw[i][k]=1;else if(up[i][k]==0&&down[i][k]==1)mouse_draw[i][k]=2;else if(up[i][k]==1&&down[i][k]==0)mouse_draw[i][k]=3;else mouse_draw[i][k]=4;} } mouse_draw[1][2]=4;/*特殊點*/ } void Init(void);/*圖形驅(qū)動*/ void MouseOn(int,int);/*鼠標光標顯示*/ void MouseOff(void);/*鼠標光標隱藏*/ void MouseSetXY(int,int);/*設置當前位置*/ int LeftPress(void);/*左鍵按下*/ int RightPress(void);/*鼠標右鍵按下*/ int MiddlePress();void MouseGetXY(void);/*得到當前位置*/ int MouseStatus();void Control(void);/*游戲開始,重新,關閉*/ void GameBegain(void);/*游戲開始畫面*/ void DrawSmile(void);/*畫笑臉*/ void DrawRedflag(int,int);/*顯示紅旗*/ void DrawEmpty(int,int,int,int);/*兩種空格子的顯示*/ void GameOver(void);/*游戲結束*/ void GameWin(void);/*顯示勝利*/ int MineStatistics(int,int);/*統(tǒng)計每個格子周圍的雷數(shù)*/ int ShowWhite(int,int);/*顯示無雷區(qū)的空白部分*/ void GamePlay(void);/*游戲過程*/ void Close(void);/*圖形關閉*/ void main(void){ Init();MouseMath();//MouseOn(MouseX,MouseY);Control();Close();} void Init(void)/*圖形開始*/ { int gd=DETECT,gm;registerbgidriver(EGAVGA_driver);initgraph(&gd,&gm,“");} void Close(void)/*圖形關閉*/ { closegraph();} /*鼠標光標顯示*/ void MouseOn(int x,int y){ int i,j;int color; for(i=0;i<16;i++)/*畫鼠標*/ { for(j=0;j<16;j++){ pixel_save[i][j]=getpixel(x+j,y+i);/*保存原來的顏色*/ if(mouse_draw[i][j]==1)putpixel(x+j,y+i,0);else if(mouse_draw[i][j]==2)putpixel(x+j,y+i,15);} } } /*隱藏鼠標*/ void MouseOff(){ int i,j,x,y,color;x=MouseX;y=MouseY;for(i=0;i<16;i++)/*原位置異或消去*/ for(j=0;j<16;j++){ if(mouse_draw[i][j]==3||mouse_draw[i][j]==4)continue;color=getpixel(x+j,y+i);putpixel(x+j,y+i,color^color);putpixel(x+j,y+i,pixel_save[i][j]);} } void MouseSetXY(int x,int y)/*設置當前位置*/ { _CX=x;_DX=y;_AX=0x04;geninterrupt(0x33);} int LeftPress(void)/*鼠標左鍵按下*/ { _AX=0x03;geninterrupt(0x33);return(_BX&1);} int RightPress(void)/*鼠標右鍵按下*/ { _AX=0x03;geninterrupt(0x33);return(_BX&2);} /*是否按下中鍵 返回值同上 */ int MiddlePress(){ _AX=0x03;geninterrupt(0x33);return(_BX&4);} void MouseGetXY(void)/*得到當前位置*/ { _AX=0x03;geninterrupt(0x33);MouseX=_CX;MouseY=_DX;} /*鼠標按鍵情況,返回0表示只移動,返回1表示左右鍵同時按下,2表示只按了左鍵,3表示只按了右鍵*/ int MouseStatus(){ int x,y;int status;int press=0; int i,j,color;status=0;/*默認鼠標沒有移動*/ x=MouseX;y=MouseY; while(x==MouseX&&y==MouseY&&status==0&&press==0){ if(LeftPress()&&RightPress())press=1;else if(LeftPress())press=2;else if(RightPress())press=3;MouseGetXY();if(MouseX!=x||MouseY!=y)status=1;} if(status)/*移動情況才重新顯示鼠標*/ { for(i=0;i<16;i++)/*原位置異或消去*/ for(j=0;j<16;j++){ if(mouse_draw[i][j]==3||mouse_draw[i][j]==4)continue;color=getpixel(x+j,y+i);putpixel(x+j,y+i,color^color);putpixel(x+j,y+i,pixel_save[i][j]);} MouseOn(MouseX,MouseY);/*新位置顯示*/ } if(press!=0)/*有按鍵的情況*/ return press;return 0;/*只移動的情況*/ } void Control(void)/*游戲開始,重新,關閉*/ { int gameFLAG=1;/*游戲失敗后判斷是否重新開始的標志*/ while(1){ MouseStatus();if(gameFLAG)/*游戲失敗后沒判斷出重新開始或者退出游戲的話就繼續(xù)判斷*/ { GameBegain();/*游戲初始畫面*/ GamePlay();/*具體游戲*/ if(gameAGAIN==1)/*游戲中重新開始*/ { gameAGAIN=0;continue;} } gameFLAG=0;if(LeftPress())/*判斷是否重新開始*/ { if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85){ gameFLAG=1;continue;} } if(kbhit())/*判斷是否按鍵退出*/ break;} } void DrawSmile(void)/*畫笑臉*/ { MouseOff();setfillstyle(SOLID_FILL,YELLOW);fillellipse(290,75,10,10);setcolor(YELLOW);setfillstyle(SOLID_FILL,BLACK);/*眼睛*/ fillellipse(285,75,2,2);fillellipse(295,75,2,2);setcolor(BLACK);/*嘴巴*/ bar(287,80,293,81);MouseGetXY();MouseOn(MouseX,MouseY);} void DrawRedflag(int i,int j)/*顯示紅旗*/ { MouseOff();setcolor(7);setfillstyle(SOLID_FILL,RED);bar(198+j*20,95+i*20,198+j*20+5,95+i*20+5);setcolor(BLACK);line(198+j*20,95+i*20,198+j*20,95+i*20+10);MouseGetXY();MouseOn(MouseX,MouseY);} void DrawEmpty(int i,int j,int mode,int color)/*兩種空格子的顯示*/ { MouseOff();setcolor(color);setfillstyle(SOLID_FILL,color);if(mode==0)/*沒有單擊過的大格子*/ bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8);else if(mode==1)/*單擊過后顯示空白的小格子*/ bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7);MouseGetXY();MouseOn(MouseX,MouseY);} void GameBegain(void)/*游戲開始畫面*/ { int i,j;cleardevice();if(gamePLAY!=1){ MouseSetXY(290,70);/*鼠標一開始的位置,并作為它的初始坐標*/ MouseX=290;MouseY=70;} gamePLAY=1;/*下次按重新開始的話鼠標不重新初始化*/ mineNUM=0;setfillstyle(SOLID_FILL,7);bar(190,60,390,290);for(i=0;i<10;i++)/*畫格子*/ for(j=0;j<10;j++)DrawEmpty(i,j,0,8);setcolor(7);DrawSmile();/*畫臉*/ randomize();for(i=0;i<10;i++)/*100個格子隨機賦值有沒有地雷*/ for(j=0;j<10;j++){ Mine[i][j].num=random(8);/*如果隨機數(shù)的結果是1表示這個格子有地雷*/ if(Mine[i][j].num==1)mineNUM++;/*現(xiàn)有雷數(shù)加1*/ else Mine[i][j].num=2;Mine[i][j].flag=0;/*表示沒紅旗標志*/ } sprintf(randmineNUM,”%d“,mineNUM);/*顯示這次總共有多少雷數(shù)*/ setcolor(1);settextstyle(0,0,2);outtextxy(210,70,randmineNUM);mineNUM=100-mineNUM;/*變量取空白格數(shù)量*/ } void GameOver(void)/*游戲結束畫面*/ { int i,j;setcolor(0);for(i=0;i<10;i++)for(j=0;j<10;j++)if(Mine[i][j].num==1)/*顯示所有的地雷*/ { DrawEmpty(i,j,0,RED);setfillstyle(SOLID_FILL,BLACK);MouseOff();fillellipse(200+j*20,100+i*20,7,7); MouseGetXY();MouseOn(MouseX,MouseY);} } void GameWin(void)/*顯示勝利*/ { setcolor(11);settextstyle(0,0,2);outtextxy(230,30,”YOU WIN!“);} int MineStatistics(int i,int j)/*統(tǒng)計每個格子周圍的雷數(shù)*/ { int nNUM=0;if(i==0&&j==0)/*左上角格子的統(tǒng)計*/ { if(Mine[0][1].num==1)nNUM++;if(Mine[1][0].num==1)nNUM++;if(Mine[1][1].num==1)nNUM++;} else if(i==0&&j==9)/*右上角格子的統(tǒng)計*/ { if(Mine[0][8].num==1)nNUM++;if(Mine[1][9].num==1)nNUM++;if(Mine[1][8].num==1)nNUM++;} else if(i==9&&j==0)/*左下角格子的統(tǒng)計*/ { if(Mine[8][0].num==1)nNUM++;if(Mine[9][1].num==1)nNUM++;if(Mine[8][1].num==1)nNUM++;} else if(i==9&&j==9)/*右下角格子的統(tǒng)計*/ { if(Mine[9][8].num==1)nNUM++;if(Mine[8][9].num==1)nNUM++;if(Mine[8][8].num==1)nNUM++;} else if(j==0)/*左邊第一列格子的統(tǒng)計*/ { if(Mine[i][j+1].num==1)nNUM++;if(Mine[i+1][j].num==1)nNUM++;if(Mine[i-1][j].num==1)nNUM++;if(Mine[i-1][j+1].num==1)nNUM++;if(Mine[i+1][j+1].num==1)nNUM++;} else if(j==9)/*右邊第一列格子的統(tǒng)計*/ { if(Mine[i][j-1].num==1)nNUM++;if(Mine[i+1][j].num==1)nNUM++;if(Mine[i-1][j].num==1)nNUM++;if(Mine[i-1][j-1].num==1)nNUM++;if(Mine[i+1][j-1].num==1)nNUM++;} else if(i==0)/*第一行格子的統(tǒng)計*/ { if(Mine[i+1][j].num==1)nNUM++;if(Mine[i][j-1].num==1)nNUM++;if(Mine[i][j+1].num==1)nNUM++;if(Mine[i+1][j-1].num==1)nNUM++;if(Mine[i+1][j+1].num==1)nNUM++;} else if(i==9)/*最后一行格子的統(tǒng)計*/ { if(Mine[i-1][j].num==1)nNUM++;if(Mine[i][j-1].num==1)nNUM++;if(Mine[i][j+1].num==1)nNUM++;if(Mine[i-1][j-1].num==1)nNUM++;if(Mine[i-1][j+1].num==1)nNUM++;} else/*普通格子的統(tǒng)計*/ { if(Mine[i-1][j].num==1)nNUM++;if(Mine[i-1][j+1].num==1)nNUM++;if(Mine[i][j+1].num==1)nNUM++;if(Mine[i+1][j+1].num==1)nNUM++;if(Mine[i+1][j].num==1)nNUM++;if(Mine[i+1][j-1].num==1)nNUM++;if(Mine[i][j-1].num==1)nNUM++;if(Mine[i-1][j-1].num==1)nNUM++;} return(nNUM);/*把格子周圍一共有多少雷數(shù)的統(tǒng)計結果返回*/ } int ShowWhite(int i,int j)/*顯示無雷區(qū)的空白部分*/ { if(Mine[i][j].flag==1||Mine[i][j].num==0)/*如果有紅旗或該格處理過就不對該格進行任何判斷*/ return;mineNUM--;/*顯示過數(shù)字或者空格的格子就表示多處理了一個格子,當所有格子都處理過了表示勝利*/ if(Mine[i][j].roundnum==0&&Mine[i][j].num!=1)/*顯示空格*/ { DrawEmpty(i,j,1,7); Mine[i][j].num=0;} else if(Mine[i][j].roundnum!=0)/*輸出雷數(shù)*/ { DrawEmpty(i,j,0,8);sprintf(randmineNUM,”%d“,Mine[i][j].roundnum);setcolor(RED);MouseOff();outtextxy(195+j*20,95+i*20,randmineNUM);MouseGetXY();MouseOn(MouseX,MouseY);Mine[i][j].num=0;/*已經(jīng)輸出雷數(shù)的格子用0表示已經(jīng)用過這個格子*/ return;} /*8個方向遞歸顯示所有的空白格子*/ if(i!=0&&Mine[i-1][j].num!=1)ShowWhite(i-1,j);if(i!=0&&j!=9&&Mine[i-1][j+1].num!=1)ShowWhite(i-1,j+1);if(j!=9&&Mine[i][j+1].num!=1)ShowWhite(i,j+1);if(j!=9&&i!=9&&Mine[i+1][j+1].num!=1)ShowWhite(i+1,j+1);if(i!=9&&Mine[i+1][j].num!=1)ShowWhite(i+1,j);if(i!=9&&j!=0&&Mine[i+1][j-1].num!=1)ShowWhite(i+1,j-1);if(j!=0&&Mine[i][j-1].num!=1)ShowWhite(i,j-1);if(i!=0&&j!=0&&Mine[i-1][j-1].num!=1)ShowWhite(i-1,j-1);} void GamePlay(void)/*游戲過程*/ { int i,j,Num;/*Num用來接收統(tǒng)計函數(shù)返回一個格子周圍有多少地雷*/ for(i=0;i<10;i++)for(j=0;j<10;j++)Mine[i][j].roundnum=MineStatistics(i,j);/*統(tǒng)計每個格子周圍有多少地雷*/ while(!kbhit()){ MouseStatus();if(LeftPress())/*鼠標左鍵盤按下*/ { if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)/*重新來*/ { gameAGAIN=1;break;} if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*當前鼠標位置在格子范圍內(nèi)*/ { j=(MouseX-190)/20;/*x坐標*/ i=(MouseY-90)/20;/*y坐標*/ if(Mine[i][j].flag==1)/*如果格子有紅旗則左鍵無效*/ continue;if(Mine[i][j].num!=0)/*如果格子沒有處理過*/ { if(Mine[i][j].num==1)/*鼠標按下的格子是地雷*/ { GameOver();/*游戲失敗*/ break;} else/*鼠標按下的格子不是地雷*/ { Num=MineStatistics(i,j);if(Num==0)/*周圍沒地雷就用遞歸算法來顯示空白格子*/ ShowWhite(i,j);else/*按下格子周圍有地雷*/ { MouseOff();sprintf(randmineNUM,”%d",Num);/*輸出當前格子周圍的雷數(shù)*/ setcolor(RED);outtextxy(195+j*20,95+i*20,randmineNUM);mineNUM--; MouseGetXY();MouseOn(MouseX,MouseY);} Mine[i][j].num=0;/*點過的格子周圍雷數(shù)的數(shù)字變?yōu)?表示這個格子已經(jīng)用過*/ if(mineNUM<1)/*勝利了*/ { GameWin();break;} } } } } if(RightPress())/*鼠標右鍵鍵盤按下*/ { if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*當前鼠標位置在格子范圍內(nèi)*/ { j=(MouseX-190)/20;/*x坐標*/ i=(MouseY-90)/20;/*y坐標*/ if(Mine[i][j].flag==0&&Mine[i][j].num!=0)/*本來沒紅旗現(xiàn)在顯示紅旗*/ { DrawRedflag(i,j);Mine[i][j].flag=1;} else if(Mine[i][j].flag==1)/*有紅旗標志再按右鍵就紅旗消失*/ { DrawEmpty(i,j,0,8);Mine[i][j].flag=0;} } delay(1000000);delay(1000000);delay(1000000);delay(1000000);delay(1000000);} } } 編游戲 C語言程序設計案例精編.txt讓人想念而死,是謀殺的至高境界,就連法醫(yī)也鑒定不出死因。。。C語言 編游戲案例精編 案例一 貪吃蛇游戲 #define N 200 #include food.x++;while(food.y%10!=0) food.y++; food.yes=0;/*畫面上有食物了*/ } if(food.yes==0)/*畫面上有食物了就要顯示*/ { setcolor(GREEN);rectangle(food.x,food.y,food.x+10,food.y-10);} for(i=snake.node-1;i>0;i--)/*蛇的每個環(huán)節(jié)往前移動,也就是貪吃蛇的關鍵算法*/ { snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];} /*1,2,3,4表示右,左,上,下四個方向,通過這個判斷來移動蛇頭*/ switch(snake.direction){ case 1:snake.x[0]+=10;break;case 2: snake.x[0]-=10;break;case 3: snake.y[0]-=10;break;case 4: snake.y[0]+=10;break;} for(i=3;i snake.direction=2;else if(key==DOWN&&snake.direction!=3) snake.direction=4;}/*endwhile(1)*/ } /*游戲結束*/ void GameOver(void){ cleardevice();PrScore();setcolor(RED);settextstyle(0,0,4);outtextxy(200,200,“GAME OVER”);getch();} /*輸出成績*/ void PrScore(void){ char str[10];setfillstyle(SOLID_FILL,YELLOW);bar(50,15,220,35);setcolor(6);settextstyle(0,0,2);sprintf(str,“score:%d”,score);outtextxy(55,20,str);} /*圖形結束*/ void Close(void){ getch();closegraph();} 案例二 計算器 #include x=x0; m=0;} else { x=x+width+width/2; m++;} /*否則,右移到下一個字符位置*/ if(v==LEFT)/*左移箭頭時新位置計算*/ if(x<=x0){ x=x0+6*width; m=4;} /*如果移到頭,再左移,則移動到最右邊字符位置*/ else { x=x-width-width/2; m--;} /*否則,左移到前一個字符位置*/ if(v==UP)/*上移箭頭時新位置計算*/ if(y<=y0){ y=y0+4*height+height/2; n=3;} /*如果移到頭,再上移,則移動到最下邊字符位置*/ else { y=y-height-height/2;n--;} /*否則,移到上邊一個字符位置*/ if(v==DOWN)/*下移箭頭時新位置計算*/ if(y>=7*height){ y=y0;n=0;} /*如果移到尾,再下移,則移動到最上邊字符位置*/ else { y=y+height+height/2; n++;} /*否則,移到下邊一個字符位置*/ putimage(x,y,rar,XOR_PUT);/*在新的位置顯示光標箭頭*/ } c=str1[n*5+m];/*將字符保存到變量c中*/ if(isdigit(c)||c=='.')/*判斷是否是數(shù)字或小數(shù)點*/ { if(flag==-1)/*如果標志為-1,表明為負數(shù)*/ { strcpy(str2,”-“);/*將負號連接到字符串中*/ flag=1;} /*將標志值恢復為1*/ sprintf(temp,”%c“,c);/*將字符保存到字符串變量temp中*/ strcat(str2,temp);/*將temp中的字符串連接到str2中*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,str2);/*顯示字符串*/ } if(c=='+'){ num1=atof(str2);/*將第一個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/ strcpy(str2,”“);/*將str2清空*/ act=1;/*做計算加法標志值*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,”0.“);/*顯示字符串*/ } if(c=='-'){ if(strcmp(str2,”“)==0)/*如果str2為空,說明是負號,而不是減號*/ flag=-1;/*設置負數(shù)標志*/ else { num1=atof(str2);/*將第二個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/ strcpy(str2,”“);/*將str2清空*/ act=2;/*做計算減法標志值*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);/*畫矩形*/ outtextxy(5*width,height,”0.“);/*顯示字符串*/ } } if(c=='*'){ num1=atof(str2);/*將第二個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/ strcpy(str2,”“);/*將str2清空*/ act=3;/*做計算乘法標志值*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,”0.“);/*顯示字符串*/ } if(c=='/'){ num1=atof(str2);/*將第二個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/ strcpy(str2,”“);/*將str2清空*/ act=4;/*做計算除法標志值*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,”0.“);/*顯示字符串*/ } if(c=='^'){ num1=atof(str2);/*將第二個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/ strcpy(str2,”“);/*將str2清空*/ act=5;/*做計算乘方標志值*/ setfillstyle(SOLID_FILL,color+3);/*設置用淡綠色實體填充*/ bar(2*width+width/2,height/2,15*width/2,3*height/2);/*畫矩形*/ outtextxy(5*width,height,”0.“);/*顯示字符串*/ } if(c=='%'){ num1=atof(str2);/*將第二個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/ strcpy(str2,”“);/*將str2清空*/ act=6;/*做計算模運算乘方標志值*/ setfillstyle(SOLID_FILL,color+3);/*設置用淡綠色實體填充*/ bar(2*width+width/2,height/2,15*width/2,3*height/2);/*畫矩形*/ outtextxy(5*width,height,”0.“);/*顯示字符串*/ } if(c=='='){ num2=atof(str2);/*將第二個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/ switch(act)/*根據(jù)運算符號計算*/ { case 1:result=num1+num2;break;/*做加法*/ case 2:result=num1-num2;break;/*做減法*/ case 3:result=num1*num2;break;/*做乘法*/ case 4:result=num1/num2;break;/*做除法*/ case 5:result=pow(num1,num2);break;/*做x的y次方*/ case 6:result=fmod(num1,num2);break;/*做模運算*/ } setfillstyle(SOLID_FILL,color+3);/*設置用淡綠色實體填充*/ bar(2*width+width/2,height/2,15*width/2,3*height/2);/*覆蓋結果區(qū)*/ sprintf(temp,”%f“,result);/*將結果保存到temp中*/ outtextxy(5*width,height,temp);/*顯示結果*/ } if(c=='c'){ num1=0;/*將兩個操作數(shù)復位0,符號標志為1*/ num2=0;flag=1;strcpy(str2,”“);/*將str2清空*/ setfillstyle(SOLID_FILL,color+3);/*設置用淡綠色實體填充*/ bar(2*width+width/2,height/2,15*width/2,3*height/2);/*覆蓋結果區(qū)*/ outtextxy(5*width,height,”0.“);/*顯示字符串*/ } if(c=='Q')exit(0);/*如果選擇了q回車,結束計算程序*/ } putimage(x,y,rar,XOR_PUT);/*在退出之前消去光標箭頭*/ return;/*返回*/ } /*窗口函數(shù)*/ void mwindow(char *header){ int height;cleardevice(); /* 清除圖形屏幕 */ setcolor(MaxColors1);/*設置當前顏色為白色 */ setlinestyle(SOLID_LINE, 0, NORM_WIDTH);/*設置畫線方式*/ getviewsettings(&vp);/*將當前視口信息裝入vp所指的結構中*/ rectangle(0, 0, vp.right-vp.left, vp.bottom-vp.top);/*畫矩形邊框*/ } /*設計鼠標圖形函數(shù)*/ int arrow(){ int size;int raw[]={4,4,4,8,6,8,14,16,16,16,8,6,8,4,4,4};/*定義多邊形坐標*/ setfillstyle(SOLID_FILL,2);/*設置填充模式*/ fillpoly(8,raw);/*畫出一光標箭頭*/ size=imagesize(4,4,16,16);/*測試圖象大小*/ rar=malloc(size);/*分配內(nèi)存區(qū)域*/ getimage(4,4,16,16,rar);/*存放光標箭頭圖象*/ putimage(4,4,rar,XOR_PUT);/*消去光標箭頭圖象*/ return 0;} /*按鍵函數(shù)*/ int specialkey(void){ int key;while(bioskey(1)==0);/*等待鍵盤輸入*/ key=bioskey(0);/*鍵盤輸入*/ key=key&0xff? key&0xff:key>>8;/*只取特殊鍵的掃描值,其余為0*/ return(key);/*返回鍵值*/ } 案例三 黑白棋游戲 #include ”graphics.h“ /*圖形系統(tǒng)頭文件*/ #define LEFT 0x4b00 /*光標左鍵值*/ #define RIGHT 0x4d00 /*光標右鍵值*/ #define DOWN 0x5000 /*光標下鍵值*/ #define UP 0x4800 /*光標上鍵值*/ #define ESC 0x011b /* ESC鍵值*/ #define ENTER 0x1c0d /* 回車鍵值*/ int a[8][8]={0},key,score1,score2;/*具體分數(shù)以及按鍵與存放棋子的變量*/ char playone[3],playtwo[3];/*兩個人的得分轉(zhuǎn)換成字符串輸出*/ void playtoplay(void);/*人人對戰(zhàn)函數(shù)*/ void DrawQp(void);/*畫棋盤函數(shù)*/ void SetPlayColor(int x);/*設置棋子第一次的顏色*/ void MoveColor(int x,int y);/*恢復原來棋盤狀態(tài)*/ int QpChange(int x,int y,int z);/*判斷棋盤的變化*/ void DoScore(void);/*處理分數(shù)*/ void PrintScore(int n);/*輸出成績*/ void playWin(void);/*輸出勝利者信息*/ /******主函數(shù)*********/ void main(void){ int gd=DETECT,gr;initgraph(&gd,&gr,”c: c“);/*初始化圖形系統(tǒng)*/ DrawQp();/*畫棋盤*/ playtoplay();/*人人對戰(zhàn)*/ getch();closegraph();/*關閉圖形系統(tǒng)*/ } void DrawQp()/*畫棋盤*/ { int i,j;score1=score2=0;/*棋手一開始得分都為0*/ setbkcolor(BLUE);for(i=100;i<=420;i+=40){ line(100,i,420,i);/*畫水平線*/ line(i,100,i,420);/*畫垂直線*/ } setcolor(0);/*取消圓周圍的一圈東西*/ setfillstyle(SOLID_FILL,15);/*白色實體填充模式*/ fillellipse(500,200,15,15);/*在顯示得分的位置畫棋*/ setfillstyle(SOLID_FILL,8);/*黑色實體填充模式*/ fillellipse(500,300,15,15);a[3][3]=a[4][4]=1;/*初始兩個黑棋*/ a[3][4]=a[4][3]=2;/*初始兩個白棋*/ setfillstyle(SOLID_FILL,WHITE);fillellipse(120+3*40,120+3*40,15,15);fillellipse(120+4*40,120+4*40,15,15);setfillstyle(SOLID_FILL,8);fillellipse(120+3*40,120+4*40,15,15);fillellipse(120+4*40,120+3*40,15,15);score1=score2=2;/*有棋后改變分數(shù)*/ DoScore();/*輸出開始分數(shù)*/ } void playtoplay()/*人人對戰(zhàn)*/ { int x,y,t=1,i,j,cc=0;while(1)/*換棋手走棋*/ { x=120,y=80;/*每次棋子一開始出來的坐標,x為行坐標,y為列坐標*/ while(1)/*具體一個棋手走棋的過程*/ { PrintScore(1);/*輸出棋手1的成績*/ PrintScore(2);/*輸出棋手2的成績*/ SetPlayColor(t);/*t變量是用來判斷棋手所執(zhí)棋子的顏色*/ fillellipse(x,y,15,15);key=bioskey(0);/*接收按鍵*/ if(key==ESC)/*跳出游戲*/ break;else if(key==ENTER)/*如果按鍵確定就可以跳出循環(huán)*/ { if(y!=80&&a[(x-120)/40][(y-120)/40]!=1 &&a[(x-120)/40][(y-120)/40]!=2)/*如果落子位置沒有棋子*/ { if(t%2==1)/*如果是棋手1移動*/ a[(x-120)/40][(y-120)/40]=1;else/*否則棋手2移動*/ a[(x-120)/40][(y-120)/40]=2;if(!QpChange(x,y,t))/*落子后判斷棋盤的變化*/ { a[(x-120)/40][(y-120)/40]=0;/*恢復空格狀態(tài)*/ cc++;/*開始統(tǒng)計嘗試次數(shù)*/ if(cc>=64-score1-score2)/*如果嘗試超過空格數(shù)則停步*/ { MoveColor(x,y); fillellipse(x,y,15,15); break;} else continue;/*如果按鍵無效*/ } DoScore();/*分數(shù)的改變*/ break;/*棋盤變化了,則輪對方走棋*/ } else/*已經(jīng)有棋子就繼續(xù)按鍵*/ continue;} else /*四個方向按鍵的判斷*/ if(key==LEFT&&x>120)/*左方向鍵*/ { MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x-=40;fillellipse(x,y,15,15);} else if(key==RIGHT&&x<400&&y>80)/*右方向鍵*/ { MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x+=40;fillellipse(x,y,15,15);} else if(key==UP&&y>120)/*上方向鍵*/ { MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);y-=40;fillellipse(x,y,15,15);} else if(key==DOWN&&y<400)/*下方向鍵*/ { MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);y+=40;fillellipse(x,y,15,15);} } if(key==ESC)/*結束游戲*/ break;if((score1+score2)==64||score1==0||score2==0)/*格子已經(jīng)占滿或一方棋子為0判斷勝負*/ { playWin();/*輸出最后結果*/ break;} t=t%2+1;/*一方走后,改變棋子顏色即輪對方走*/ cc=0;/*計數(shù)值恢復為0*/ } /*endwhile*/ } void SetPlayColor(int t)/*設置棋子顏色*/ { if(t%2==1)setfillstyle(SOLID_FILL,15);/*白色*/ else setfillstyle(SOLID_FILL,8);/*灰色*/ } void MoveColor(int x,int y)/*走了一步后恢復原來格子的狀態(tài)*/ { if(y<100)/*如果是從起點出發(fā)就恢復藍色*/ setfillstyle(SOLID_FILL,BLUE);else/*其他情況如果是1就恢復白色棋子,2恢復黑色棋子,或恢復藍色棋盤*/ switch(a[(x-120)/40][(y-120)/40]){ case 1: setfillstyle(SOLID_FILL,15);break;/*白色*/ case 2: setfillstyle(SOLID_FILL,8);break;/*黑色*/ default: setfillstyle(SOLID_FILL,BLUE);/*藍色*/ } } int QpChange(int x,int y,int t)/*判斷棋盤的變化*/ { int i,j,k,kk,ii,jj,yes;yes=0;i=(x-120)/40;/*計算數(shù)組元素的行下標*/ j=(y-120)/40;/*計算數(shù)組元素的列下標*/ SetPlayColor(t);/*設置棋子變化的顏色*/ /*開始往8個方向判斷變化*/ if(j<6)/*往右邊*/ { for(k=j+1;k<8;k++)if(a[i][k]==a[i][j]||a[i][k]==0)/*遇到自己的棋子或空格結束*/ break;if(a[i][k]!=0&&k<8){ for(kk=j+1;kk 案例四 迷宮問題 #include DrawPeople(&x,&y,4);/*右下*/ else if(c=='x'&&map[x+1][y]!=1) DrawPeople(&x,&y,5);/*下*/ else if(c=='z'&&map[x+1][y-1]!=1) DrawPeople(&x,&y,6);/*左下*/ else if(c=='a'&&map[x][y-1]!=1) DrawPeople(&x,&y,7);/*左*/ else if(c=='q'&&map[x-1][y-1]!=1) DrawPeople(&x,&y,8);/*左上*/ } setfillstyle(SOLID_FILL,WHITE);/*消去紅色探索物,恢復原迷宮圖*/ bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6);if(x==N-2&&y==N-2)/*人工控制找成功的話*/ yes=1;/*如果成功標志為1*/ } void WayCopy(int(*oldmap)[N],int(*map)[N])/*拷貝迷宮數(shù)組 */ { int i,j;for(i=0;i 案例五 掃地雷游戲 #include if(i==9&&j==9)/*右下角格子的統(tǒng)計*/ { if(Mine[9][8].num==1)nNUM++;if(Mine[8][9].num==1)nNUM++;if(Mine[8][8].num==1)nNUM++;} else if(j==0)/*左邊第一列格子的統(tǒng)計*/ { if(Mine[i][j+1].num==1)nNUM++;if(Mine[i+1][j].num==1)nNUM++;if(Mine[i-1][j].num==1)nNUM++;if(Mine[i-1][j+1].num==1)nNUM++;if(Mine[i+1][j+1].num==1)nNUM++;} else if(j==9)/*右邊第一列格子的統(tǒng)計*/ { if(Mine[i][j-1].num==1)nNUM++;if(Mine[i+1][j].num==1)nNUM++;if(Mine[i-1][j].num==1)nNUM++;if(Mine[i-1][j-1].num==1)nNUM++;if(Mine[i+1][j-1].num==1)nNUM++;} else if(i==0)/*第一行格子的統(tǒng)計*/ { if(Mine[i+1][j].num==1)nNUM++;if(Mine[i][j-1].num==1)nNUM++;if(Mine[i][j+1].num==1)nNUM++;if(Mine[i+1][j-1].num==1) nNUM++;if(Mine[i+1][j+1].num==1) nNUM++;} else if(i==9)/*最后一行格子的統(tǒng)計*/ { if(Mine[i-1][j].num==1) nNUM++;if(Mine[i][j-1].num==1) nNUM++;if(Mine[i][j+1].num==1) nNUM++;if(Mine[i-1][j-1].num==1) nNUM++;if(Mine[i-1][j+1].num==1) nNUM++;} else/*普通格子的統(tǒng)計*/ { if(Mine[i-1][j].num==1) nNUM++;if(Mine[i-1][j+1].num==1) nNUM++;if(Mine[i][j+1].num==1) nNUM++;if(Mine[i+1][j+1].num==1) nNUM++;if(Mine[i+1][j].num==1) nNUM++;if(Mine[i+1][j-1].num==1) nNUM++;if(Mine[i][j-1].num==1) nNUM++;if(Mine[i-1][j-1].num==1) nNUM++;} return(nNUM);/*把格子周圍一共有多少雷數(shù)的統(tǒng)計結果返回*/ } int ShowWhite(int i,int j)/*顯示無雷區(qū)的空白部分*/ { if(Mine[i][j].flag==1||Mine[i][j].num==0)/*如果有紅旗或該格處理過就不對該格進行任何判斷*/ return;mineNUM--;/*顯示過數(shù)字或者空格的格子就表示多處理了一個格子,當所有格子都處理過了表示勝利*/ if(Mine[i][j].roundnum==0&&Mine[i][j].num!=1)/*顯示空格*/ { DrawEmpty(i,j,1,7);Mine[i][j].num=0;} else if(Mine[i][j].roundnum!=0)/*輸出雷數(shù)*/ { DrawEmpty(i,j,0,8);sprintf(randmineNUM,”%d“,Mine[i][j].roundnum);setcolor(RED);outtextxy(195+j*20,95+i*20,randmineNUM);Mine[i][j].num=0;/*已經(jīng)輸出雷數(shù)的格子用0表示已經(jīng)用過這個格子*/ return;} /*8個方向遞歸顯示所有的空白格子*/ if(i!=0&&Mine[i-1][j].num!=1)ShowWhite(i-1,j);if(i!=0&&j!=9&&Mine[i-1][j+1].num!=1)ShowWhite(i-1,j+1);if(j!=9&&Mine[i][j+1].num!=1)ShowWhite(i,j+1);if(j!=9&&i!=9&&Mine[i+1][j+1].num!=1)ShowWhite(i+1,j+1);if(i!=9&&Mine[i+1][j].num!=1)ShowWhite(i+1,j);if(i!=9&&j!=0&&Mine[i+1][j-1].num!=1)ShowWhite(i+1,j-1);if(j!=0&&Mine[i][j-1].num!=1)ShowWhite(i,j-1);if(i!=0&&j!=0&&Mine[i-1][j-1].num!=1)ShowWhite(i-1,j-1);} void GamePlay(void)/*游戲過程*/ { int i,j,Num;/*Num用來接收統(tǒng)計函數(shù)返回一個格子周圍有多少地雷*/ for(i=0;i<10;i++)for(j=0;j<10;j++)Mine[i][j].roundnum=MineStatistics(i,j);/*統(tǒng)計每個格子周圍有多少地雷*/ while(!kbhit()){ if(LeftPress())/*鼠標左鍵盤按下*/ { */ */ MouseGetXY();if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)/*重新來*/ { MouseOff();gameAGAIN=1;break;} if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*當前鼠標位置在格子范圍內(nèi) { j=(MouseX-190)/20;/*x坐標*/ i=(MouseY-90)/20;/*y坐標*/ if(Mine[i][j].flag==1)/*如果格子有紅旗則左鍵無效*/ continue;if(Mine[i][j].num!=0)/*如果格子沒有處理過*/ { if(Mine[i][j].num==1)/*鼠標按下的格子是地雷*/ { MouseOff();GameOver();/*游戲失敗*/ break;} else/*鼠標按下的格子不是地雷*/ { MouseOff();Num=MineStatistics(i,j);if(Num==0)/*周圍沒地雷就用遞歸算法來顯示空白格子*/ ShowWhite(i,j);else/*按下格子周圍有地雷*/ { sprintf(randmineNUM,”%d“,Num);/*輸出當前格子周圍的雷數(shù)*/ setcolor(RED);outtextxy(195+j*20,95+i*20,randmineNUM);mineNUM--;} MouseOn();Mine[i][j].num=0;/*點過的格子周圍雷數(shù)的數(shù)字變?yōu)?表示這個格子已經(jīng)用過 if(mineNUM<1)/*勝利了*/ { GameWin();break;} } } } } if(RightPress())/*鼠標右鍵鍵盤按下*/ { MouseGetXY();if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*當前鼠標位置在格子范圍內(nèi)*/ { j=(MouseX-190)/20;/*x坐標*/ i=(MouseY-90)/20;/*y坐標*/ MouseOff();if(Mine[i][j].flag==0&&Mine[i][j].num!=0)/*本來沒紅旗現(xiàn)在顯示紅旗*/ { DrawRedflag(i,j);Mine[i][j].flag=1;} else if(Mine[i][j].flag==1)/*有紅旗標志再按右鍵就紅旗消失*/ { DrawEmpty(i,j,0,8);Mine[i][j].flag=0;} } MouseOn();sleep(1);} } } 案例六 速算24 #define N 20 #define COL 100 #define ROW 40 #include ”stdio.h“ #include ”time.h“ /*系統(tǒng)時間函數(shù)*/ #include ”graphics.h“ /*圖形函數(shù)*/ #include ”alloc.h“/*動態(tài)地址分配函數(shù)*/ #include ”stdlib.h“ /*庫函數(shù)*/ #include ”string.h“ /*字符串函數(shù)*/ #include ”ctype.h“ /*字符操作函數(shù)*/ char p[4][13]={ {'A','2','3','4','5','6','7','8','9','0','J','Q','K'},/*撲克牌,10用0來表示*/ {'A','2','3','4','5','6','7','8','9','0','J','Q','K'}, {'A','2','3','4','5','6','7','8','9','0','J','Q','K'}, {'A','2','3','4','5','6','7','8','9','0','J','Q','K'}};typedef struct node { int data;struct node *link;}STACK1;/*棧1*/ typedef struct node2 { char data;struct node2 *link;}STACK2;/*棧2*/ void init(void);/*圖形驅(qū)動*/ void close(void);/*圖形關閉*/ void play(void);/*發(fā)牌的具體過程*/ void rand1(int j);/*隨機發(fā)牌函數(shù)*/ void change(char *e,char *a);/*中綴變后綴函數(shù)*/ int computer(char *s);/*后綴表達式計算函數(shù)*/ STACK1 *initstack1(STACK1 *top);/*棧1初始化*/ STACK1 *push(STACK1 *top,int x);/*棧1入棧運算*/ STACK1 *pop(STACK1 *top);/*棧1刪除棧頂元素*/ int topx(STACK1 *top);/*棧1讀棧頂元素*/ STACK1 *ptop(STACK1 *top,int *x);/*棧1讀出棧頂元素值并刪除棧頂元素*/ int empty(STACK1 *top);/*判棧1是否為空函數(shù)*/ STACK2 *initstack2(STACK2 *top);/*棧2初始化*/ STACK2 *push2(STACK2 *top,char x);/*棧2入棧運算*/ STACK2 *pop2(STACK2 *top);/*棧2刪除棧頂元素*/ char topx2(STACK2 *top);/*棧2讀棧頂元素*/ STACK2 *ptop2(STACK2 *top,char *x);/*棧2讀出棧頂元素值并刪除棧頂元素*/ int empty2(STACK2 *top);/*判棧2是否為空函數(shù)* int text1(char *s);/*顯示文本*/ main(){ char s[N],s1[N],ch;int i,result;int gdriver, gmode;clrscr();/*清屏*/ init();/*初始化函數(shù)*/ while(1){ setbkcolor(BLACK);/*設置背景顏色*/ cleardevice();/*清屏*/ play();/*發(fā)牌*/ gotoxy(1,15);/*移動光標*/ printf(”--------------------Note-------------------n“);printf(” Please enter express accroding to above four numbern“);/*提示信息*/ printf(” Format as follows:2.*(5.+7.)n“);/*提示輸入字符串格式*/ printf(”---------------n“);scanf(”%s%c“,s1,&ch);/*輸入字符串壓回車鍵*/ change(s1,s);/*調(diào)用change函數(shù)將中綴表達式s1轉(zhuǎn)換為后綴表達式s*/ result=computer(s);/*計算后綴表達式的值,返回結果result */ if(result==24)/*如果結果等于24*/ text1(”very good“);/*調(diào)用函數(shù)text1顯示字符串”very good“*/ else text1(”wrong!!“);/*否則函數(shù)text1顯示字符串”wrong!!“*/ printf(”Continue(y/n)?n“);/*提示信息,是否繼續(xù)*/ scanf(”%c“,&ch);/*輸入一字符*/ if(ch=='n'||ch=='N')/*如果該字符等于n或N*/ break;/*跳出循環(huán),程序結束*/ } /*否則,開始下一輪循環(huán)*/ close();return;/*返回*/ } void rand1(int j)/*隨機發(fā)牌函數(shù)*/ { int kind,num;char str[3],n;randomize();while(1)/*循環(huán)直到有牌發(fā)*/ { kind=random(4);/*花色隨機數(shù)*/ num=random(13);/*大小隨機數(shù)*/ if(p[kind][num]!=-1)/*該數(shù)未取過*/ { n=p[kind][num];/*取相應位置的撲克牌數(shù)*/ p[kind][num]=-1;/*牌發(fā)好以后相應位置的元素置-1*/ break;} } switch(kind)/*花式的判斷*/ { case 0:setcolor(RED);sprintf(str,”%c“,3);break;/*紅桃*/ case 1:setcolor(BLACK);sprintf(str,”%c“,3);break;/*黑桃*/ case 2:setcolor(RED);sprintf(str,”%c“,4);break;/*方片*/ case 3:setcolor(BLACK);sprintf(str,”%c“,5);break;/*草花*/ } settextstyle(0,0,2);outtextxy(COL+j*100-30,ROW+100-46,str);/*顯示左上角花色*/ outtextxy(COL+j*100+16,ROW+100+32,str);/*顯示右下角花色*/ if(n!='0')/*輸出其他牌*/ { settextstyle(0,0,3);sprintf(str,”%c“,n);outtextxy(COL+j*100-5,ROW+100-5,str);/*顯示牌的大小*/ } else/*輸出10的時候*/ { sprintf(str,”%d“,10);outtextxy(COL+j*100-6,ROW+100-5,str);} } void play(void)/*發(fā)牌的具體過程*/ { int j;for(j=0;j<4;j++){ bar(COL+j*100-35,ROW+100-50,COL+j*100+35,ROW+1*100+50);/*畫空牌*/ setcolor(BLUE);rectangle(COL+j*100-32,ROW+100-48,COL+j*100+32,ROW+100+48);/*畫矩形框*/ rand1(j);/*隨機取牌*/ delay(10000);/*延時顯示*/ } } void init(void)/*圖形驅(qū)動*/ { int gd=DETECT,gm;initgraph(&gd,&gm,”c: c“);cleardevice();} void close(void)/*圖形關閉*/ { closegraph();} void change(char *e,char *a)/*中綴字符串e轉(zhuǎn)后綴字符串a(chǎn)函數(shù)*/ { STACK2 *top=NULL;/* 定義棧頂指針*/ int i,j;char w;i=0;j=0;while(e[i]!='
第二篇:C語言程序設計掃雷游戲?qū)嶒瀳蟾?/a>
第三篇:C語言程序設計掃雷游戲?qū)嶒瀳蟾?/a>
第四篇:C語言掃雷源代碼
第五篇:編游戲 C語言程序設計案例精編