程式設(shè)計入門期末專題_第1頁
程式設(shè)計入門期末專題_第2頁
程式設(shè)計入門期末專題_第3頁
程式設(shè)計入門期末專題_第4頁
程式設(shè)計入門期末專題_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

程式言殳言十入咒期末事題

踩地雷程式

^別:第十一^

:942W1張致雉

9511140張侯泰

9541034曾怡事

一、踩地雷程式^明

踩地雷是1午多人完畤的共同回,意,富Windows作渠系統(tǒng)遢在3.1版本日寺,踩

地雷已是微戟內(nèi)建在作渠系統(tǒng)的戟ft,相信各年齡)W的人,在^^始接斶重月窗

畤,或多或少都曾接斶到il有趣且令人^透的小避激。避激謾程相富聚強刺

*********

激,若是一不小心黠到*********地雷,即之前的努力都

*********

曾白費,避激宣告結(jié)束;只有小心翼翼,符

所有地雷輿非地雷的II域分辨出來,才能多包

?o藉由本擘期在C程式^言上的內(nèi)容,本

小^^^自行言殳!|■出可供避激的踩地雷程式。

懸了曾化程式言殳言十疇的禊雄度,我做了以下的基本假^:

1.假^踩地雷介面懸一9x9大小的地圃[1域。

9格

阿I一踩地雷地圃介面

2.假IS在9x9大小的地圃[1域中,共有10果真地雷

二、踩地雷程式玩法曾介

1.軌行踩地雷程式彳及,程式曾要求玩家給rr-x、Y座檄參數(shù),待玩家給

FT第一彳固參數(shù)彳度,地雷便曾隨檄分怖到探地雷地BI常中。此日寺玩家所給

定的參數(shù)位置,曾在蜜幕上^示出一數(shù)值,^數(shù)值表示^位置周圉共有

多少地雷數(shù)。如下圈?二所示:

*********

*********

ffl-HI中2所在位置的周圉缸色格子部份,隆藏了雨彳固炸彈

2.若是玩家所指定參數(shù)座檄周圉或輾炸彈存在,^一整片展域,

存在炸彈的座

如下回I三所

圃三若是玩家黠中圃中缸色位置,由於周圉或輾炸彈存在,因此

^^出一整片視,窗,直到遇到周圉有炸彈的座檄懸止

3.可使用^^功能,符推測懸炸彈的格子以M探J己虢,避免不小心1^1

至!I。同日寺若是樊現(xiàn)推測,也可以取消襟言器己虢,^判懸地雷的

格子逮原成未被11擇謾的狀熊。

4.常某一已知數(shù)字格子周圉的炸彈都被玩家檄^以接,可用doubleclick的

功能il取^數(shù)字格子,踩地雷程式便數(shù)字格子周圉所有未被^^

的格子打如下HI四所示:

圃四富2(黃色部份)周圉的雨果直炸彈都以M來襟示彳及,此日寺使用

doubleclick功能逗擇2(黃色部份)的位置,便曾自

3(缸色部分)的格子

5.膀利脩件:

a.地Bl上除了炸彈所在的格子外,其繪格子都被玩家

b.地KI上所有格子都被玩家^^,同疇也都在炸彈位置正硅地以M作

o

C.地Bl上所剩未被^^的格子皆懸炸彈所在。

6.失敗僚件:

玩家ii取到地雷索在座襟的格子。

三、程式剖析

1.燮數(shù)言殳定

?^明:符程式中部分燮數(shù),言殳成全域燮數(shù),方便彳及面程式操作。

?參數(shù):bombX、bombY、game_continue=1、display[9][9]x

bomb_count[9][9]%truth[9][9]={0}、

near[8][2]={-l,0,-1,-1,0,-1,1,-1,1,0,1,1,0,1,-1,1}

?傅回值:瓢

?程式碣:

intbombX[10];一表示炸彈的X座檄

intbombY[10];一表示炸彈的Y座檄

intgame_continue=l;一判斷副程式是否畿^孰行的依撼

chardisplay[9][9];一^示地BI上檄^的符虢

intbomb_count[9][9];一統(tǒng)it炸彈的數(shù)量

inttruth[9][9]={0};一用於1+算炸彈的數(shù)量

intnear[8][2]={-l,0,-1,-1,0,-1,1,-1,1,0,1,1,0,1,-1,1};一用於表示il定(X,Y)座襟

郝近格子座檄的參數(shù)

2.主程式main()

?^明:在蟄幕上印出探地雷地圃介面,加在玩家輸入第一彳固座襟之

彳及,以胃L數(shù)隨檄分布的方式,符地雷怖置在地111之中,同疇也依序

呼叫各副程式,完成探地雷程式。

?輸入?yún)?shù):座檄參數(shù)(X,Y)

?傅回值:輾

?流程圜:------------------------------

用畤尚函數(shù)遇取一姐亂數(shù)來放置bomb

酎出踩地雷的地圈

呼叫rctrcsh_disphy支出文新的地胤

印出Pleaseopenasquare(x.y)wherex=O-8.y=0*-X

__________(若超出一界則再一人一一)__________

用亂散透bomb的位置

防止bomb典第一翰八座棉相同

防止bomb重襁.

呼叫sumnear計算周凰的bomb數(shù)

呼叫open打盟地國

呼叫refreshdisphy立出更新的地圄

?程式碣:

intmain(void)

(

inti;

intj;

intx;

inty;

charch;

srand(time(NULL));〃用疇取一^&葡廛

for(i=0;i<9;i-H-)

(

for(j=0;j<9;j++)

display皿i尸型;

)

refresh_display();

printf{nPleaseopenasquare(x,y)wherex=0?8,y=0?8\n");

printf(nx,y=,!);

scanf(n%d,%dH,&x,&y);

while(x<0||x>8||y<0||y>8)//若是座襟超圉,印出重新It入介面

(

printf(nPleaseinputagain!\nu);

scanty%d,%dn,&x,&y);

)

for(i=0;i<10;i++)〃葡L數(shù)IS取炸彈

bombX[i]=rand()%9;

bombY[i]=rand()%9;

)

for(i=0;i<10;i++)〃防止炸彈重覆或和使用者輸入的第一彳固座檄重禊

|

if(bombX[i]==x&&bombY[i]=y)

(

bombX[i]=rand()%9;

bombY[i]=rand()%9;

i=0;

continue;

)

for(j=i+l;j<10;j-H-)

(

if(bombX[i]=bombX[j]&&bombY[i]=bombY[j])

(

bombX[j]=rand()%9;

bombY[j]=rand()%9;

j=99;i=0;

for(i=0;i<10;i++)

truth[bombX[i]][bombY[i]]=l;

for(i=0;i<9;i+4-)

(

for(j=0;j<9;j++)

bomb_count[i][j]=sum_near(i,j);

I

open(x,y);

refresh_display();

while(game_continue)〃不斷it行前冏,依使用者操作改燮值直到瞞利或玩輸

whattodo();

system(nPAUSEn);

return0;

}

3.副程式

3.1refresh_display()

?^明:符避激介面視窗印在it幕上。

?輸入?yún)?shù):輾

?傅回值:瓢

?流程圃:

?程式碣:

voidrefreshdisplay(void)〃印出避激介面

inti,j;

if(game_continue==1)

printf("012345678—X\n");

fbr(i=0;i<9;i++)

printf("%d",i);

for(j=0;j<9;j++)

printf(n%c”,display皿i]);

printf(n\nu);

}

printf(H|\n|\nY\nn);

3.2sum_near()

?^明:封任一座檄(X,Y),^算遇懸鄢近格子中,,穗共的炸彈數(shù)

量。

?輸入?yún)?shù):輾

?傅回值:任一座檄(X,Y)周凰有t他炸彈,若t=9即表示^座檄(X,Y)

懸炸電

?流程圃:

?程式碣:

intsum_near(intx,inty)//符座襟(x,y)周圉的8彳固格子的真值表中的值加起

(

inti;

intt=0;

if(x>0&&x<8&&y<8&&y>0)

|

fbr(i=0;i<8;i++)

t=t+truth[x+near[i][0]][y+near[i][1]];

)

if(x==0)

(

if(y==0)

t=truth[l][0]+truth[l][l]+truth[0][l];

if(y>0&&y<8)

t=truth[0][y-l]+truth[0][y+1]+truth[l][y-l]+truth[l][y+l]+truth[l][y];

if(y==8)

t=truth[0][7]+truth[l][7]+truth[l][8];

)

if(x==8)

{

if(y==0)

t=truth[7][0]+truth[7][l]+truth[8][l];

if(y>0&&y<8)

t=truth[8][y-1]+truth[8][y+1]+truth[7][y-1]+truth[7][y+1]+truth[7][y];

if(y==8)

t=truth[8][7]+truth[7][8]+truth[7][7];

)

if(x>0&&x<8)

{

if(y==O)

t=truth[x-l][O]+truth[x-1][l]+truth[x][l]+truth[x+1][O]+truth[x+1][1];

if(y==8)

t=truth[x-1][8]+truth[x-1][7]+truth[x][7]+truth[x+1][7]+truth[x+1][8];

)

fbr(i=0;i<10;i++)

(

if(x==bombX[i]&&y==bombY[i])

t=9;

)

returnt;

3.3open()

?^明:I.決定玩家是否ii中炸彈座檄,或列印輸?shù)舯芗さ腲

息。同畤符剩繪炸彈位置檄^成X,她回傅

game_continue=0,結(jié)束whattodo。副程式作。

2.若玩家iiJf到周圉瓢炸彈的格子,自勤^^周圉格

子。

3.符字元典數(shù)字做斡換。因懸每一彳固格子周凰有多少炸

彈是以字元的燮數(shù)來表示,但是炸彈^數(shù)是以整數(shù)表

示,因此要做醇換。

?輸人參數(shù):輾

?傅回值:回傅game_continue的值,以決定副程式whattodo()是

否畿^11作。

?流程圃:

?程式碣:

voidopen(intx,inty)/浦敬座襟(x,y)的函數(shù)

inti;

if(bomb_count[x][y]==9&&display[x][y]=-**)

//system(nCLEAR,!);

printf(nYoulose!!!\nn);

for(i=0;i<10;i++)

display[bombX[i]][bombY[i]]=,X,;

game_continue=0;

elseif(bomb_count[x][y]==O&&display[x][y]=-**)

{

display[x][y]='

for(i=0;i<8;i-H-)

open(x+near[i][0],y+near[i][1]);

}

elseif(bomb_count[x][y]>0&&bomb_count[x][y]<9&&display[x][y]=-*!)

display[x][y]-O^bomb^ountfx][y];1符整數(shù)U換成字元的形式

else

return;一避免彝生上述三槿脩件之外的戕況

}

3.4whattodoQ

?^明:提供使用者逗擇使用1.open(打^未被^^的格子)

2.mark(襟言己炸闞3.unmark(取消檄得己炸貓4.doubleclick(相同於

滑鼠之doubleclick功能)。同B寺也可^使用者輸入新的一^&座

襟,她判斷使用者的膀負輸贏。

?輸入?yún)?shù):使用者iS擇希望的操作模式典新座檄(X,Y)。

?傅回值:傅回gamecontinue以決定副程式是否畿余覆軌行(0表示

副程式結(jié)束)。

?程式碣:

voidwhattodo(void)〃使用者操作函數(shù)

I

intx;

inty;

intp=0;

intmarkent;

inti;

intj;

intselectednum;

printf(nWhatdoyouwanttodo?\n1.open\n2.mark\n3.unmark\n4.double

click\nn

);

scanff'%dn,&selected_num);

while(selected_num<1||selected_num>4)

(

printf(nPleasechooseagain!\nH);

scanfi^"%d,,,&selected_num);

}

switch(selectednum)

(

case1:

(

printf(nPleaseinput(x,y):n);

scanff'%d,%dn,&x,&y);

while(x<0||x>8||y<0||y>8)

{

printfif^Pleaseinputagain!\nu);

scanff'%d,%dn,&x,&y);

}

open(x,y);

break;

)

case2:

(

printf(nPleaseinput(x,y):n);

scanff%d,%dn,&x,&y);

while(x<0||x>8||y<0||y>8)

(

printffTleaseinputagain!\nu);

scanR"%d,%dn,&x,&y);

}

if(display[x][y]=,*f)

display[x][y]-M,;

break;

)

case3:

{

printf(nPleaseinput(x,y):n);

scanfifn%d,%dH,&x,&y);

while(x<0||x>8||y<0||y>8)

|

printf(nPleaseinputagain!\n”);

scanff%d,%d”,&x,&y);

)

if(display[x][y]—M')

display[x][y]='

break;

)

case4:

(

printf(,fPleaseinput(x,y):H);

scanff'%d,%dn,&x,&y);

while(x<0||x>8||y<0||y>8)

{

printfif^Pleaseinputagain!\nu);

scanR"%d,%dn,&x,&y);

)

if(display[x][y]=,0,+bomb_count[x][y])

{

markcnt=O;

for(i=0;i<8;i-b+)

(

if(x+near[i][O]<0||x+near[i][0]>8||y+near[i][l]<0||

y+near[i][l]>8)

continue;

elseif(display[x+near[i][O]][y+near[i][l]]=-M,)

mark_cnt=mark_cnt+1;

i

if(mark_cnt==bomb_count[x][y])

{

for(i=0;i<8;i++)

open(x+near[i][0],y+near[i][l]);

)

}

break;

}

)

for(i=0;i<9;i++)

(

for(j=0;j<9;j++)

(

if(bomb_count[j][i]!=9&&display|j][i]!='*'&&display[j][i]!='M')

P=p+O;

elseif(bombcount[j][i]==9&&display[j][i]!-M')

p=p+o;

elseif(bomb_count[j][i]==9&&display[j][i]!='*')

P=p+O;

else

P=P+1;

}

}

if(p=O)

{

printffYouwin!!!\n");

for(i=0;i<10;i++)

display[bombX[i]][bombY[i]]='M';

game_continue=0;

)

refreshdisplayO;

}

四、程式軌行靶例

1.起始介面

2.指令逗項,提供玩家iSJf是否要打^空格、炸彈、DoubleClick

QBC:\Users\David\Desktop\星式\修BxexeIUJ卜回I

Pleaseinput<x,y>:0,4

012345678——X

3.unmark

4.doubleclick

Pleaseinput<x,y>:0,4

012345678-X

3.膀利重面

雷C:\Users\David\Desktop\程玲序次exe[01回

B1M11221*

y

Whatdoyouwanttodo?

1.open

2.mark

3.unmark

4.doubleclick

4

Pleaseinput<x,y>:7,7

Youwin!??

1112ri2

1M12M2

211111

31221

-11MM1

51232111

61M2222M

?1222MM21

81Mil221

Y

言青按任意維SI殖?.

4.踩到地雷了

OBC:\Users\David\Desktop\程式'博Rexe

Uhatdoyouwanttodo?

1.open

2.mark

3.unmark

4.doubleclick

1

Pleaseinput<x,<;>:0,5

Youlose???

0*********

1**xxx*X**

2*X*******

3*x**X*X**

4**???*1****

5X********

6*********

7XX**??*?X

8*X****X**

精按任意維敘普???

五、完整的程式

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

intbombX[10];〃符JI些高殳成全域燮數(shù),方便彳爰面作渠

intbombY[10];

intgame_continue=1;

chardisplay[9][9];

intbomb_count[9][9];

inttruth[9][9]={0};

intnear[8][2]={-lA-l,-l,0,-hh-1,1,0,1,1AL-1,1};

voidrefreshdisplay(void);

voidmapreal(void);

voidmaptruth(void);

voidwhattodo(void);

intsum_near(intx,inty);

voidopen(intx,inty);

intmain(void)//^II的操作,乘U下的使用自己癮的函數(shù)

(

inti;

intj;

intx;

inty;

charch;

srand(time(NULL));〃用B寺取一置L

for(i=0;i<9;i++)

l/

for0=0;j<9;j++)

display皿i]=,*';

)

refresh_display();

printfl(^Pleaseopenasquare(x,y)wherex=0?8,y=0?8\n");

printf(,,x,y=n);

scanf(n%d,%dH,&x,&y);

while(x<01|x>81|y<01|y>8)〃使用者介面

(

printf(HPleaseinputagain!\nH);

scan""%d,%dH,&x,&y);

}

for(i=0;i<10;i-H-)/,閻數(shù)逗取炸彈

(

bombX[i]=rand()%9;

bombY[i]=rand()%9;

)

for(i=0;i<10;i++)//防止炸彈重覆或和使用者輸入的第一彳固座檄重禊

{

if(bombX[i]==x&&bombY[i]==y)

(

bombX[i]=rand()%9;

bombY[i]=rand()%9;

i=0;

continue;

)

for(j=i+l;j<10;j++)

if(bombX[i]==bombX[j]&&bombY[i]==bombY[j])

(

bombX[j]=rand()%9;

bombY[j]=rand()%9;

j=99;i=0;

for(i=0;i<10;i++)

truth[bombX[i]][bombY[i]]=l;

for(i=0;i<9;i++)

(

for(j=0;j<9;j++)

bomb_count[i][j]=sum_near(i,j);

)

open(x,y);

refresh_display();

while(gamecontinue)〃不斷謹行前冏36依使用者操作改建值直到瞞利或玩鞫1

(

whattodo();

)

system("PAUSE");

return0;

voidrefreshdisplay(void)〃印出避激介面

{

inti,j;

if(game_continue==1)

printff012345678—X\n");

for(i=0;i<9;i++)

printf("%d",i);

for(j=0;j<9;j++)

printf("%c",display[j][i]);

printf("\n");

)

printf("|\n|\nY\n");

intsum_near(intx,inty)//符座襟(x,y)周圉的8彳固格子的真值表中的值加起來

(

inti;

intt=0;

if(x>0&&x<8&&y<8&&y>0)

(

for(i=0;i<8;i++)

t=t+truth[x+near[i][O]][y+near[i][l]];

)

if(x==O)

{

if(y=O)

t=truth[l][O]+truth[l][l]+truth[O][l];

if(y>0&&y<8)

t=truth[O][y-l]+truth[O][y+1]+truth[1][y-l]+truth[l][y+l]+truth[l][y];

if(y=8)

t=truth[0][7]+truth[l][7]+truth[l][8];

)

if(x=8)

{

if(y=o)

t=truth[7][0]+truth[7][l]+truth[8][l];

if(y>0&&y<8)

t=tmth[8][y-1]+truth[8][y+1]+truth[7][y-1]+truth[7][y+1]+truth[7][y];

if(y=8)

t=truth[8][7]+truth[7][8]+truth[7][7];

}

if(x>0&&x<8)

ifi(y=O)

t=truth[x-1][O]+truth[x-1][1]+truth[x][l]+truth[x+1][O]+truth[x+1][1];

if(y=8)

t=truth[x-l][8]+truth[x-l][7]+truth[x][7]+truth[x+l][7]+truth[x+l][8];

)

for(i=0;i<10;i++)

(

if(x=bombX[i]&&y=bombY[i])

t=9;

)

returnt;

voidopen(intx,inty)^座襟(x,y)的函數(shù)

{

inti;

if(bomb_count[x][y]=9&&disp]ay[x][y]=='*')

printff'Youlose!!!\nH);

fbr(i=0;i<10;i-H-)

display[bombX[i]][bombY[i]]=,X,;

game_continue=0;

}

elseif(bomb_count[x][y]==0&&display[x][y]=='*')

(

display[x][y]=*

fbr(i=O;i<8;i++)

open(x+near[i][0],y+near[i][l]);

\

f

elseif(bomb_count[x][y]>0&&bomb_count[x][y]v9&&display[x][y]=='*')

display[x][y]=,0,+bomb_count[x][y];

else

return;

)

voidwhattodo(void)〃使用者操作函數(shù)

{

intx;

inty;

intp=0;

intmarkent;

inti;

intj;

intselectednum;

printf(nWhatdoyouwanttodo?\nl.open\n2.mark\n3.unmark\n4.doubleclick\nn

);

scanfif”%dn,&selected_num);

while(selected_num<1||selected_num>4)

{

printff'Pleasechooseagain!\nH);

scanfif11%dH,&selected_num);

}

switch(selectednum)

(

case1:

printf(nPleaseinput(x,y):n);

scanf(n%d,%dn,&x,&y);

while(x<0||x>8||y<0||y>8)

(

printfif'TIeaseinputagain!\nH);

scanff'%d,%dH,&x,&y);

溫馨提示

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

評論

0/150

提交評論