C語言游戲代碼_第1頁
C語言游戲代碼_第2頁
C語言游戲代碼_第3頁
C語言游戲代碼_第4頁
C語言游戲代碼_第5頁
已閱讀5頁,還剩54頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

五子棋

#includc<stdio.h>

#include<bios.h>

#include<ctype.h>

#include<conio.h>

#include<dos.h>

#defineCROSSRUOxbf/*右上角點*/

//defineCROSSLUOxda/*左上角點*/

#dcfineCROSSLDOxcO/*左下加點*/

^defineCROSSRD0xd9/*右卜角點*/

#defineCROSSL0xc3/*左邊*/

#dcfineCROSSR0xb4/*右邊*/

#defineCROSSU0xc2/*上邊*/

#defineCROSSDOxcl/*卜,邊*/

#defineCROSS0xc5/*十字交叉點*/

/*定義棋盤左上角點在屏幕上的位置*/

#defineMAPXOFT5

#dcfineMAPYOFT2

/*定義1號玩家的操作鍵鍵碼*/

#dcfinePLAY1UP0x1157/*卜.移-'W'*/

#definePLAY1DOWN0*^53/*下移一3'*/

#definePLAY1LEFT0xle41/*左移-'A'*/

#definePLAY1RIGHT0x2044/*右移-'D'*/

#definePLAY1DO0x39如/*落子-空格鍵*/

/*定義2號玩家的操作鍵鍵碼*/

#definePLAY2UP0x4800/*上移一方向鍵up*/

#definePLAY2DOWN0x5000/*I,移一方向鍵down*/

#definePLAY2LEFT0x4b00/*左移-方向鍵left*/

#dcfinePLAY2RIGHT0x4d00/*右移一方向鍵right*/

#definePLAY2DOOxlcOd/*落子-|叫車鍵Enter*/

/*若想在游戲中途退出,可按Esc鍵*/

#defineESCAPE0x01lb

/*定義棋盤上交叉點的狀態(tài),即該點有無棋子*/

/*若有棋子,還應(yīng)能指出是哪個玩家的棋子*/

#dcfineCHESSNULL0/*沒有棋子*/

#defineCHESS1'07*一號玩家的棋子*/

#defineCHESS2'X7*二號玩家的棋子*/

/*定義按鍵類別*/

#defineKEYEXIT0/*退出鍵*/

#defineKEYFALLCHESS1/*落-了鍵*/

#defineKEYMOVECURSOR2/*光標移動鍵*/

#defineKEYINVALID3/*無效鍵*/

/*定義符號常量:真,假一真為1,假為0*/

#defineTRUE1

#defineFALSE0

/**********************************************************/

/*定義數(shù)據(jù)結(jié)構(gòu)*/

/*棋盤交叉點坐標的數(shù)據(jù)結(jié)構(gòu)*/

structpoint

intx,y;

);

/**********************************************************/

/*自定義函數(shù)原型說明*/

voidInit(void);

intGetKey(void);

intCheckKey(intpress);

intChangeOrder(void);

intChessGo(intOrdei;structpointCursor);

voidDoError(void);

voidDoOK(void);

voidDo\Vin(intOrder);

voidMoveCursor(intOrder?intpress);

voidDrawCross(intx,inty);

voidDrawMap(void);

intJudgeWin(intOrder,structpointCursor);

intJudgeWinLine(intOrder,structpointCursor,intdirection);

voidShowOrderMsg(intOrder);

voidEndGame(void);

/**********************************************************/

/*定義全局變量*/

intgPlayOrder;/*指示當前行棋方*/

structpointgCursor;/*光標在棋盤上的位置*/

char8。^§§802「<1[19][19];/*用于記錄棋盤上各點的狀態(tài)*/

/**********************************************************/

/*書函數(shù)*/

voidmain()

(

intpress;

intbOutWhile=FALSE;/*退出循環(huán)標志*/

printf(HWelcome");

InitO;/*初始化圖象,數(shù)據(jù)*/

while(l)

{

pre§s=GetKey();/*獲取用戶的按鍵值*/

switch(CheckKey(press))/*判斷按鍵類別*/

(

/*是退出鍵*/

caseKEYEXIT:

clrscrO;/*清屏*/

bOutWhile=TRUE;

break;

/*是落子鍵*/

caseKEYFALLCHESS:

if(ChessGo(gPlayOrder,gCursor)=FALSE)/*7£yt*/

DoEiror。;/*落子錯誤*/

else

(

DoOKO;/*落子正確*/

/*如果當前行棋方贏棋*/

if(JudgeVVin(gPlayOrdei;gCursor)==TRUE)

{

DoVVin(gPlayOrder);

bOutWhile=TRUE;/*退出循環(huán)標志置為真*/

)

/*否則*/

else

/*交換行棋方*/

ChangeOrder();

ShowOrderMsg(gPlayOrder);

break;

/*是光標移動鍵*/

caseKEYMOVECURSOR:

MoveCursor(gPlayOrder,press);

break;

/*是無效鍵*/

caseKEYINVALID:

break;

)

if(bOutWhile=TRUE)

break;

/*游戲結(jié)束*/

EndGame();

)

/**********************************************************/

/*界面初始化,數(shù)據(jù)初始化*/

voidInit(void)

(

inti,j;

char*Msg|]=

{

nPlayer1key:0,

“UP——w”,

”DOWNT”,

“LEFT-a,f,

”RIGHT-dn,

“DO—space**,

MPlayer2key:",

”UP——up”,

”DOWN-downn,

”LEFT-leftn,

“RIGHT-rightn,

“DO——ENTER”,

“exitgame:*1,

“ESC”,

NULL,

/*先手方為1號玩家*/

gPIayOrder=CHESSl;

/*棋盤數(shù)據(jù)清零,即棋盤上各點開始的時候都沒有棋子*/

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

fora=0;j<19;j++)

gChessBoard[i][j]=CHESSNULL;

/*光標初始位置*/

gCursor.x=gCursor.y=0;

/*畫棋盤*/

textmode(C40);

DrawM叩();

/*顯示操作鍵說明*/

i=0;

textcolor(BROWN);

while(Msg[i]!=NULL)

(

gotoxy(25,3+i);

cputs(Msg(i]);

i++;

}

/*顯示當前行棋方*/

ShowOrderMsg(gPlayOrder);

/*光標移至棋盤的左上角點處*/

gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);

}

/*畫棋盤*/

voidDrawMap(void)

{

intij;

clrscr();

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

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

DrawCross(iJ);

)

/*畫棋盤上的交叉點*/

voidDrawCross(intx,inty)

{

gotoxy(x+MAPXOFT,y+MAPYOFT);

/*交叉點上是一號玩家的棋子*/

if(gChessBoard[x]|y|=CHESSl)

{

textcolor(LIGHTBLUE);

putch(CHESSl);

return;

)

/*交叉點上是二號玩家的棋子*/

if(gChessBoard|x||y|=CHESS2)

{

textcolor(LIGHTBLUE);

putch(CHESS2);

return;

)

textcolor(GREEN);

/*左上角交叉點*/

if(x=O&&y=O)

{

putch(CROSSLU);

return;

}

/*左下角交叉點*/

if(x=0&&y=l8)

{

putch(CROSSLD);

return;

}

/*右上角交叉點*/

if(x=18&&y=0)

{

putch(CROSSRU);

return;

)

/*右下角交叉點*/

if(x=18&&y=18)

putch(CROSSRD);

return;

)

/*左邊界交叉點*/

if(x=0)

{

putch(CROSSL);

return;

)

/*右邊界交叉點*/

if(x=18)

(

putch(CROSSR);

return;

}

/*上邊界交叉點*/

if(y==0)

(

putch(CROSSU);

return;

)

/*下邊界交叉點*/

if(y==18)

{

putch(CROSSD);

return;

)

/*棋盤中間的交叉點*/

putch(CROSS);

)

/*交換行棋方*/

intChangeOrder(void)

(

if(gPlayOrder=CHESSI)

gPlayOrder=CHESS2;

else

gPlayOrder=CHESSl;

return(gPlayOrder);

}

/*獲取按鍵值*/

intGetKey(void)

{

charlowbyte;

intpress;

while(bioskey(l)=0)

;/*如果用戶沒有按鍵,空循環(huán)*/

press=bioskey(0);

lowbyte=press&Oxff;

press=press&0xff00+toupper(lo、vbyte);

return(press);

)

/*落子錯誤處理*/

voidDoError(void)

(

sound(1200);

delay(50);

nosoundQ;

)

/*贏棋處理*/

voidDoVVin(intOrder)

{

sound(l500);delay(l00);

sound(O);delay(50);

sound(800);delay(lOO);

sound(O);delay(50);

sound(1500);delay(100);

sound(O);delay(50);

sound(800);delay(lOO);

sound(O);delay(50);

nosoundQ;

textcolor(RED+BLINK);

gotoxy(25,20);

if(Order=CHESSl)

cputsCTLAYERlWIN!”);

else

cputs(nPLAYER2WIN!”);

gotoxy(25,21);

cputs(**\\<A+A>/**);

getchO;

}

/*走棋*/

intChessGo(intOrdei;structpointCursor)

{

/*判斷交叉點上有無棋子*/

if(gChessBoard|Cursor.x]|Cursor.y|=CHESSNULL)

{

/*若沒仃棋子,則可以落子*/

gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT);

textcolor(LIGHTBLUE);

putch(Order);

gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT);

gChessBoard|Cursor.x||Cursor.y|=Order;

returnTRUE;

)

else

returnFALSE;

}

/*判斷當前行棋方落子后是否贏棋*/

intJudgeWin(intOrder,structpointCursor)

(

inti;

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

/*判斷在指定方向上是否有連續(xù)5個行棋方的棋子*/

if(JudgeVVinLine(Order,Cursor,!))

returnTRUE;

returnFALSE;

}

/*判斷在指定方向I:是否有連續(xù)5個行棋方的棋子*/

intJudgeWinLine(intOrder,structpointCursor,intdirection)

{

inti;

structpointpos,dpos;

constinttestnum=5;

intcount;

switch(dircction)

case0:/*在水平方向*/

pos.x=Cursor.x-(testnum-l);

pos.y=Cursony;

dpos.x=l;

dpo§?y=0;

break;

case1:/*在垂直方向*/

pos.x=Cursor.x;

pos.y=Cursor.y-(testnum-l);

dpos.x=0;

dpos.y=l;

break;

case2:/*在左下至右上的斜方向*/

pos.x=Cursor.x-(testnum-l);

pos.y=Cursor.y+(testnum-l);

dpos.x=l;

dpos?y=-l;

break;

case3:/*在左上至右下的斜方向*/

pos.x=Cursor.x-(testnuni-l);

pos.y-Cursor.y-(testnum-l);

dpos.x=l;

dpos.y=l;

break;

)

count=0;

for(i=0;i<testnum*2+l;i++)/*????????i<testnum*2-l*/

(

if(pos.x>=0&&pos.x<=18&&pos.y>=0&&pos.y<=18)

(

if(gChessBoard|pos.x|[pos.y]=Order)

(

count-H-;

if(count>=testnum)

returnTRUE;

)

else

count=0;

)

pos.x+=dpos.x;

pos.y+=dpos.y;

}

returnFALSE;

}

/*移動光標*/

voidMoveCursor(intOrder,intpress)

(

switch(press)

{

casePLAYlUP:

if(Order=CHESSl&&gCursor.y>0)

gCursor.y-;

break;

casePLAY1DOWN:

if(Order=CHESSl&(&gCursor.y<18)

gCursor.y++;

break;

casePLAY1LEFT:

if(Order=CHESSl&&gCursor.x>0)

gCursonx-;

break;

casePLAY1RIGHT:

if(Order=CHESSl&&gCursor.x<18)

gCursonx++;

break;

casePLAY2UP:

if(Order=CHESS2&&gCursor.y>0)

gCursony—;

break;

casePLAY2DOWN:

if(Order=CHESS2&&gCursor.y<18)

gCursony+4-;

break;

casePLAY2LEFT:

if(Order=CHESS2<&&gCursor.x>0)

gCursonx—;

break;

casePLAY2RIGHT:

if(Order=CHESS2&&gCursor.x<18)

gCursor.x++;

break;

gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);

/*游戲結(jié)束處理*/

voidEndGame(void)

(

textmode(C80);

)

/*顯示當前行棋方*/

voidShowOrderMsg(intOrder)

{

gotoxy(6,MAPYOFT+20);

textcolor(LIGHTRED);

if(Order=CHESSl)

cputs(**Playerlgo!");

else

cputs(nPlayer2go!");

gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);

)

/*落子正確處理*/

voidDoOK(void)

{

sound(500);

delay(70);

sound(600);

delay(50);

sound(lOOO);

delay(lOO);

nosound();

}

/*檢杳用戶的按鍵類別*/

intCheckKey(intpress)

{

if(press==ESCAPE)

returnKEYEXIT;/*是退出鍵*/

else

if

((press=PLAYlDO&&gPlayOrder=CHESSl)||

(press=PLAY2DO&&gPlayOrdcr=CHESS2)

)

returnKEYFALLCHESS;/*是落子鍵*/

else

if

(press=PLAY1UP||press=PLAY1DOWN||

press=PLAYlLEFT||press==PLAYlRIGHT||

press=PLAY2UP||press=PLAY2DOWN||

press=PLAY2LEFT||press==PLAY2RIGHT

)

returnKEYMOVECURSOR;/*是光標移動鍵*/

else

returnKEYINVALID;/*按鍵無效*/

貪吃蛇

^defineN200

//include<graphics.h>

#include<stdlib.h>

#include<dos.h>

#defineLEFT0x4b00

//defineRIGHT0x4d00

#defineDOWN0x5000

//defineUP0x4800

#defineESC0x011b

inti,key;

intscore=0;/*得分*/

intgamespeed=50000;/*游戲速度自己調(diào)整*7

structFood

(

intx;/*食物的橫坐標*/

inty;/*食物的縱坐標*/

intyes;/*判斷是否要出現(xiàn)食物的變量*/

}fbod;/*食物的結(jié)構(gòu)體*/

structSnake

intx[N];

inty[N];

intnode;/*蛇的節(jié)數(shù)*/

intdirection;/*蛇移動方向*/

intlifey*蛇的生命,0活著』死亡*/

}snake;

voidInit(void);/*圖形驅(qū)動*/

voidClose(void);/*圖形結(jié)束*/

voidDrawK(void);/*開始畫面*/

voidGameOver(void);/*結(jié)束游戲*/

voidGamcPlay(void);/*玩游戲具體過程*/

voidPrScore(void);/*輸出成績*/

/*主函數(shù)*/

voidmain(void)

(

InitOJ*圖形驅(qū)動*/

DrawK();/*開始畫面*/

GamePlayQ;/*玩游戲具體過程*/

Close。;/*圖形結(jié)束*/

)

/*圖形驅(qū)動*/

voidInit(void)

{

intgd=DETECT,gm;

initgraph(&gd,&gm,"c:\\tc");

cleardevice();

)

/*開始畫面,左上角坐標為(50,40),右下角坐標為(610,460)的圍墻*/

voidDrawK(void)

(

Z*setbkcolor(LIGHTGREEN);*/

setcolor(l1);

setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設(shè)置線型*/

fbr(i=50;i<=600;i+=10)/*畫圍墻*/

{

rectang!e(i,40,i+10,49);/*上邊*/

rectangle(i,451,i+l0,460);/*下邊*/

)

fbr(i=40;i<=450;i+=10)

{

rectangle(50,i,59,i+l0);/*左邊*/

rectangle(60l,i,6l0,i+l0);/*右邊*/

)

)

/*玩游戲具體過程*/

voidGamePlay(void)

(

randomize。;/*隨機數(shù)發(fā)生器*/

fbod.ycs=l;/*l表示需要出現(xiàn)新食物,0表示已經(jīng)存在食物*/

snake.1ifb=O;/*活著*/

snakc.dircction=l;/*方向往右*/

snake.x[0]=l00;snake.y[0]=l00;/*蛇頭*/

snakc.x[l]=l10;snake.y[1]=100;

snake.node=2;/*節(jié)數(shù)*/

PrScorc。;/*輸出得分*/

while(l)/*可以重復(fù)玩游戲,壓ESC鍵結(jié)束*/

(

while(!kbhit())/*在沒有按鍵的情況下,蛇自己移動身體*/

(

if(fdod.yes=l)/*需要出現(xiàn)新食物*/

{

fbod.x=rand()%400+60;

fbod.y=rand()%350+60;

while(fbod.x%10!=0)/*食物隨機出現(xiàn)后必須讓食物能夠在整格內(nèi),這樣才可以讓蛇吃到*/

fbod.x-H-;

while(fbod.y%l0!=0)

food.y++;

fbod.yes=0;/*畫面上有食物了*/

)

i&fbod.yes=0)/*畫面上有食物了就要顯示*/

{

setcolor(GREEN);

rectangle(food.x,food.y,food.x+lO,fbod.y-10);

}

fdr(i=snake.node-l;i>0;i--)/*蛇的每個環(huán)節(jié)往前移動,也就是貪吃蛇的關(guān)鍵算法*/

|

snake.x[i]=snake.x[i-1];

snake.y[i]=snake.y[i-1];

)

/*1,2,3,4表示右,左,上,下四個方向,通過這個判斷來移動蛇頭*/

switch(snake.direction)

{

case1:snake.x[0]+=10;break;

case2:snake.x[0]-=l0;break;

case3:snake.y[0]-=10;break;

case4:snake.y[0]+=l0;break;

}

fbr(i=3;i<snake.node;i++)/*從蛇的第四節(jié)開始判斷是否撞到自己了,因為蛇頭為兩節(jié),第三節(jié)不

可能拐過來*/

iftsnakc.x[i]=snakc.x[O]&&snake.y[i]=snakc.y[O])

|

GamcOvcrQ;/*顯示失敗*/

snake.life=l;

break;

)

}

if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||

snakc.y[0]>455)/*蛇是否撞到墻壁*/

(

GameOver();/*本次游戲結(jié)束*/

snake.li住=1;/*蛇死*/

)

if(snake.峰=1)/*以上兩種判斷以后,如果蛇死就跳出內(nèi)循環(huán),重新開始*/

break;

if(snake.x[0]=fbod.x&&snake.y[0]=fbod.y)/*吃到食物以后*/

{

setcolor(O);/*把畫面上的食物東西去掉*/

rectangle(fbod.x,fdod.y,fbod.x+10,food.y-10);

snake.x[snake.node]=-20;snake.y[snake.node]=-20;

/*新的一節(jié)先放在看不見的位置,下次循環(huán)就取前一節(jié)的位置*/

snake.node++;/*蛇的身體長一節(jié)*/

food.yes=1;/*L前面上需要出現(xiàn)新的食物?/

score+=10;

PrScore。;/*輸出新得分*/

}

setcolor(4);/*畫出蛇*/

fbr(i=0;i<snake.node;i++)

rectangle(snake.x[i],snake.y[i],snake.x[i]+10,

snake.y[i]-10);

delay(gamespeed);

setcolor(O);/*用黑色去除蛇的的最后一節(jié)?/

rectangle(snake.x[snake.node-l],snake.y[snake.node-l],

snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);

}/*endwhile(!kbhit)*/

ifl:snakeJifb=l)/*如果蛇死就跳出循環(huán)*/

break;

key=bioskey(0);/*接收按鍵*/

if(ke尸ESC)/*按ESC鍵退出*/

break;

else

iRkey=UP&&snake.direction!=4)

/*判斷是否往相反的方向移動*/

snake.direction=3;

else

if(key=RIGHT&&snake.direction!=2)

snakc.dircction=l;

else

ifi(key==LEFT&&snakc.dircction!=l)

snake.direction=2;

else

if(key=DOWN&&snake.direction!=3)

snakc.dircction=4;

}/*endwhile(l)*/

)

/*游戲結(jié)束*/

voidGameOvcr(void)

(

cleardevice();

PrScore();

sctcolor(RED);

settextstyle(0,0,4);

outtextxy(200,200;,GAMEOVER");

getch();

)

/*輸出成績*/

voidPrScore(void)

(

charstr[10];

setfiIlstyle(SOLID_FILL,YELLOW);

bar(50,15,220,35);

setcolor(6);

settextstyle(0,0,2);

sprintf(sti;,,score:%dM,score);

outtextxy(55,20,str);

}

/*圖形結(jié)束*/

voidClose(void)

getch();

closegraph();

掃雷游戲

/*

模擬掃雷游戲

*/

#include<graphics.h>

//include<math.h>

#include<stdio.h>

#include<dos.h>

#include<stdlib.h>

#include<conio.h>

#include<alloc.h>

unionREGSregs;

intsize=15;/*用于表示每個方塊的大小(正方形的邊長)*/

intpix,piy=50;/*pix,piy是矩陣的偏移量*/

charb[2]="l";/*用于顯示方格周圍的雷的個數(shù)*/

intpan[30][16];/*用于記錄盤面的情況:0:沒有、9:有雷、1?8:周圍雷的個數(shù)*/

intpanl[30][16];/*panl□□紀錄當前的挖雷情況,O沒有操作、1:打開了、2:標記了*/

inttt;/*紀錄時間參數(shù)*/

intEflags;/*用于標記鼠標按鈕的有效性,0:有效,1:無效,2:這是鼠標的任意鍵等于重新開始*/

intMsinit();

voidDraw(intx,inty,intsizex,intsizey);

voidFacedraw(intx,inty,intsizel,intk);

voidDead(intsizel,intx,inty);

voidSetmouse(intxmax,intymax,intx,inty);

intMsrcad(int*xp,int*yp,int*bup,structtimetl,intk);

voidDrawl(intx,inty);

intOpen(intx,inty);

floatRandom();

voidHave(intsum,intx,inty,intxx,intyy);

voidHelp();

voidCoread();

voidDdraw2(intx,inty);

/*下面是主函數(shù)*/

main()

(

intmode=VGAHI,devices=VGA;/*圖形模式初始化的變量*/

charams;/*鼠標操作中的標志變量*/

intxms,yms,bms;/*鼠標的狀態(tài)變量*/

inti,j,k,kl=O;/*i,j,k是循環(huán)變量*/

intx=9,y=9,flags=0;/*x,y矩陣的大小*/

intsum=10;/?sum盤面的雷的總數(shù)目,是個x,y的函數(shù)*/

intxl=0,yl=0;/*用于記錄光標當前的位置*/

intxll=0,y11=0;/*暫時保存鼠標位置的值*/

intsizel=10;/*臉的大小*/

intcflags=l;/*這是菜單操作標志變量,沒有彈出1,彈出0*/

structtimetl={0,0,0,0};/*時間結(jié)構(gòu)體,頭文件已定義*/

intco[3];/*暫時紀錄歷史紀錄*/

voidfar*Map;/*用于保存鼠標圖片*/

charname[3][20];/*名字字符串,用于記錄名字*/

FILE*/*文件指針用于文件操作*/

Msinit();/*鼠標初始化*/

/*rcgistcrbgidriver(EGAVGA_driver);*/

initgr叩h(&devices,&mode,"C:\\tc");/*圖形模式初始化*/

/*為圖片指針分配內(nèi)存*/

if((Map=farmalloc(imagesize(0,0,20,20)))=NULL)/*圖片的大小是20*20*/

{

printfpMcmorycrerr!\nH);

printff'Pressanykeytoout!\nM);

exit(l);

)

/*用于檢驗文件是否完整*/

while((p=fbpenC'^core.dat",MrM))=NULL)/*如果不能打開就新建一個*7

{

if((p=fopcn(”score.dat“,"w"))==NULL)/*如果不能新建就提示錯誤并推出*/

{

prints"Thefilecannotopen!\nn);

prints"Presssanykeytoexit!\n°);

getch();

exit(l);

}

/*寫入初始內(nèi)容*/

fprintfUp;'%d%d%d,%s\n%s\n%s\n",999,999,999;'xiajiau,"xiajia";,xiajia");

fclose(p);

)

/*暫時讀出歷史紀錄。并用co[3]紀錄*/

fscanflp/%d%d%d,n,&co[0],&co[l],&co[2]);

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

自canf(pj%s\n”,name[i]);

fclose(p);

Setmouse(l,1,615,460);/*設(shè)置鼠標的活動范圍*/

pix=250-x*size/2;/*計算地雷按鈕矩陣的左邊*/

bss:b[0]='r;/*游戲開始和重來的切入點*/

flags=0;/*測試中這個變量好像沒有作用,但是為了邏輯的完整性暫時保留*/

k=0;

Eflags=0;

tt=O;

cleardevice。;/*清屏*/

setbkcolor(LIGHTCYAN);

fbr(i=0;i<30;i++)/*盤面初始化*/

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

(

pan[i][j]=O;

panl[i][j]=O;

}

for(;;)/*用于生成雷的盤面情況*/

{

i=(int)(x*Random());

j=(int)(y*Random());

i<pan[i][j]=O)

(

pan[i][j]=9;

k=k+l;

)

ifl;k=sum)break;

)

fbr(i=O;ivx;i++)/*用于統(tǒng)計各點的周邊情況*/

fbr(j=O;j<y;j-H-)

(

i[pan[i皿=0)/*只有沒力.雷的才需要處理*/

|

ifl;i-l>=0&&j-l>=0&&pan(i-l][j-l]=9)pan[i][j]4-+;

if(j-l>=0&&pan[i][j-l]=9)pan[i][j]++;

if(i+l<x&&j-l>=0&&pan[i+l][j-l]==9)pan[i][j]++;

if(i-l>=0&&pan[i-l][j]=9)pan[i][j]++;

iRi+lvx&&pan[i+l][j]=9)pan[i][j]-H-;

if(i-l>=0&&j+l<y&&pan[i-l][j+l]=9)pan[i][j]++;

iflj+l<y&&pan[i][j4-l]=9)pan[i][j]-H-;

if(i+l<x&&j+1vy&&pan[i+l][j+l]=9)pan[i][j]++;

if(sum==10)/*畫底座*/

{

Draw(l70,1,162,200);

setcolor(1);

outtextxy(175,5,"Game()n);

setcolor(4);

outtextxy(175,5,"Gn);

}/*小*/

else

if(sum=40)

Draw(l15,1,272,307);

sctcolor(1);

outtextxy(120,5,,,Game(G)u);

sctcolor(4);

outtextxy(120,5,"GM);

}/*中*/

else

if(sum==99)

(

Draw(40,1,470,307);

setcolor(l);

outtcxtxy(45,5,"Gamc(G)”);

setcolor(4);

outtextxy(45,5,MGH);

}/*大*/

setcolor(1);/*顯示提示信息*/

outtextxy(100,350,'*:Help.");

setcolor(4);

outtextxy(100,350,"H");

setcolor(I);

outtextxy(200,350,u/:exit.");

setcolor(4);

outtextxy(200,350,"Qn);

outtextxy(220,350;,ESCu);

setcolor(l);

outtextxy(330,350,n:cores.u);

setcolor(4);

outtextxy(330,350,"R”);

Facedraw(250,30,sizel,2);/*顯示控制按鈕,臉型*/

fbr(i=0;i〈x;iH)/*這一段用于描繪盤面*/

fbr(j=O廣

(

Draw(i*size+pix,j*size+piy,size,size);

)

Have(sum,pix+20,30,x,y);/*各項的初始顯示*/

k=0;

setfillstyle。,0);

bar(460-pix,25,490-pix,40);

setcolor(4);

outtextxy(465-pix,30,“000");

/*下面這?段用于接收用戶的控制,并做出反應(yīng)*/

fbr(;;)

(

ams=Msread(&xms,&yms,&bms,tl,k);/*讀取鼠標狀態(tài)*/

/*下面一段用于保存并記錄鼠標圖片*/

ifi(flags!=O)

(

putimage(xll,yll,Map,COPY_PUT);

)

xll=xms;

yll=yms;

flags=l;

/*這里插入菜單操作*/

if((xms>=pix-10&&xms<=pix+26&&yms>=2&&yms<=14&&bms=l)||ams—g11|ams='G')/*點中菜

單的判斷*/

|

Draw(pix-10,14,100,88);/*畫菜單*/

cflags=0;

setcolor(l);/*下面顯示菜單項*/

outtextxy(pix-4,19/Restar(R)M);

setcolor(4);

outtextxy(pix-4,19,**R");

setcolor⑴;/*下面顯示菜單項*/

outtextxy(pix-4,30,nEasy(E)H);

setcolor(4);

outtextxy(pix-4,30,HE”);

setcolor(1);/*下面顯示菜單項*7

outtextxy(pix-4,41,”NomaH(N)”);

setcolor(4);

outtextxy(pix-4,41NM);

setcolor(l);/*下面顯示菜單項*/

outtextxy(pix-4,52,uHard(H)n);

setcolor(4);

outtextxy(pix-4,52,nH”);

set810r(1);/*下面顯示菜單項*/

outtextxy(pix-4,63/'Corse(C)H);

setcolor(4);

outtextxy(pix-4,63,HCM);

setcolor(1);/*下面顯示菜單項*/

outtextxy(pix-4,74,"Help(L)M);

sctcolor(4);

outtextxy(pix-4,74,"LH);

setcolor(l);/*卜面顯示菜單項*/

outtextxy(pix-4,85,"Quit(Q)H);

sctcolor(4);

outtextxy(pix"4,85,”Qu);

bms=0;

}/*完成菜單的描繪*/

/*這里是為了完全實現(xiàn)鼠標控制才加入的內(nèi)容*/

if(Eflags=2&&(bms!=0||ams!=-l))

(

gotobss;

)

/*下面實現(xiàn)菜單的功能,每一項響應(yīng)一個菜單項*/

if(cflags=O)

{

if((xms>=pix-6&&xms<=pix+85&&yms>=17&&yms<=28&&bms==l)||(ams—r'||ams=R))/*下面

依次響應(yīng)菜單中各項*/

{

cflags=l;

gotobss;

}

else

iR(xms>=pix-6&&xms<=pix+85&&yms>=28&&yms<=39&&bms=l)||ams—e*||ams—E')

(

cflags=l;

x=9;

y=9;

sum=10;

pix=250-x*size/2;

gotobss;

)

else

if{(xms>=pix-6&&xms<=pix+85&&yms>=39&&yms<=50&&bms=l)||ams='n|||ams=N')

(

cflags=l;

x=16;

y=16;

sum=40;

pix=250-x*size/2;

gotobss;

else

if((xms>=pix-6&&xms<=pix+85&&yms>=50&&yms<=61&&bms=l)||ams='h,||ams=,H')

(

cflags=l;

x=30;

-16;

sum=99;

pix=250-x*size/2+25;

gotobss;

)

else

if((xms>=pix-6&&xms<=pix+85&&yms>=61&&yms<=72&&bms=l)||ams='c|||ams=*C*)

{

cflags=l;

Coread();

)

else

ifiC(xms>=pix-6&&xms<=pix+85&&yms>=72&&yms<=83&&bms=l)||ams=T||ams='L*)

|

cflags=l;

Help();

}

else

if((xms>=pix-6&&xms<=pix+85&&yms>=83&&yms<=94&&bms=l)||ams—q11|ams—Q'||

ams==27)

{

cflags=l;

fclose(p);

closegraph();

farfree(Map);

exit(l);

)

else

if(bms!=0)

|

cflags=l;

gotobss;

)

}/*結(jié)束菜單功能的實現(xiàn)*/

/*在笑臉按鈕處單擊時重新開始*/

if{cflags!=O&&xms>=250-sizel-2&&yms>=30-sizel-2&&xms<=250+sizel+2&&yms<=30+sizel+2&&

bms==l)

gotobss;

ifi;Eflags=O&&cflags!=0&&xms-pix>=0&&yms-piy>=0&&xms<pix+x*size&&

yms<piy+y*size)/*111判斷*/

(

xl=(int)((xms-pix)/size);/*計算鼠標目前的按鈕位置*/

y1=(int)((yms-piy)/sizc);

if(ams=-l&&bms=l&&panl[xl][yl]=O)/*單擊鼠標左鍵*/

{

if(k=0)/*k這里判斷是否是第一次按下.0:不計時,1:開始計時*/

(

gettime(&tl);

k=l;

}

if(pan[xl][yl]!=9)

{

Drawl(xl,yl);

Open(x,y);

)

else

(

Dead(sizel,x,y);

k=0;

&&bms=2&&panl僅1][丫1]=0)/*單擊鼠標右鍵*/

(

delay(lOO);

setcolor(lO);

circle(x1*size+pix+7,yl*size+piy+7,4);

panl[xl][yl]=2;

Have(sum,pix+20,30,x,y);

}

else

ifi(ams=-l&&bms=2&&panl[xl][yl]=2)/*單擊鼠標右鍵*7

(

delay(100);

Draw(x1*size+pix,yl*size+piy,size,size);

panl[xl][yl]=0;

Have(sum,pix+20,30,x,y);

}/*相當于鼠標右擊*/

if(ams=-l&&bms=3&&panl[xl][yl]=l)

{/*相當于鼠標雙擊,有效性判斷*/

i=0;

if(xl-l>=0&&yl-l>=0&&panl[xl-l][yl-l]=2)i++;

if(yl-l>=0&&pan1[x1][y1-1]==2)i-H-;

if(xl+l<x&&yl-l>=0&&pan1[x1+1][yl-1]=2)i++;

ifl:x1-l>=0&&panl[xl-l][yl]==2)i++;

if(xl+l<x&&panl[xl+l][yl]=2)i++;

if(xl-l>=0&&yl+l<y&&pan1[x1-1][y1+1]=2)i-H-;

if(yl+l<y&&panl[xl][yl+l]=2)i++;

if(xl4-l<x&&yl+l<y&&panl[xl+l][yl+l]=2)i++;

if(i=pan[xl][yl])/*有效*/

{

if(xl-l>=0&&yl-l>=0&&panl[xl-l][yl-l]!=2)

(

if{pan[xl-l][yl-l]!=9)

Drawl(xl-l,yl-l);

else

(

Dead(sizel,x,y);

k=0;

}

}

if(yl-l>=0&&panl[xl][yl-l]!=2)

(

if(pan[xl][yl-l]!=9)

Drawl(xl,y1-1);

else

|

Dead(sizel,x,y);

k=0;

)

)

if(xl+l<x&&yl-l>=0&&panl[xl+l][yl-l]!=2)

{

if{pan[xl+l][yl-l]!=9)

Drawl(xH-l,yl-l);

else

(

Dead(sizel,x,y);

k=0;

if(xl-l>=0&&panl[xl-l][yl]!=2)

if(pan[x1-1][y1]!=9)

Drawl(xl-l,yl);

else

(

Dead(sizel,x,y);

k=0;

)

ifl;xl+l<x&&panl[xl+l][yl]!=2)

if(pan[xl+l][yl]!=9)

Drawl(xl+l,yl);

else

{

Dead(sizel,x,y);

k=0;

}

if{xl-l>=0&&yl+l<y&&panl[xl-l][yl+l]!=2)

if(pan[xl-l][yl+l]!=9)

Drawl(xl-l,yl+l);

else

{

Dead(sizel,x,y);

k=0;

}

ifl;yl+l<y&&panl[xl][yl+l]!=2)

(

iRpan[xl][yl+l]!=9)

Drawl(xl,yl+1);

else

(

Dead(sizel,x,y);

k=0;

}

if(xl+l<x&&yl+l<y&&panl[xl+l][yl+l]!=2)

if(pan[xl+l][yl+l]!=9)

Drawl(xl+l,y1+1);

else

Dead(sizel,x,y);

k=0;

}

)

Open(x,y);

/*勝利條件*/

kl=O;

fbr(i=O;i<x;i-H-)

fbr(j=O;j<yy-H-)

if(panl[i][j]!=l)kl-H-;

if(kl=sum)

(

fdr(i=O;i<x;i-H-)

fbr(j=Oj<y;j++)

if(panl[i]|j]=O)

(

setcolor(10);circle(i*size+pix+7j*size+piy+7,4);

}

Facedraw(250,30,sizel,3);

if(x=9&&tt<co[0]){j=0;co[0]=tt;i=0;}

if(x=16&&tt<co[l]){j=l;co[l]=tt;i=O;}

if(x=30&&tt<co[2]){j=2;co[2]=tt;i=0;}

if(i==O)

{

Draw(l0,10,300,55);

setcolor(4);

outtextxy(20,15,"Youbreakthecorse!n);

outtextxy(20,25,"Pleaseinputyourname(0-19):M);

setfillstyle(l,14);

bar(20,35,200,50);

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

(

name[j][i]=getch();

ifl;name|j][i]=8)i=i-2;

if(name[j][i]=13){name[j][i]=*\0';break;}

name[j][i+l]=A(r;

setfillstyle(l,14);

bar(20,35,200,50);

sctcolor(1);

outtextxy(20,40,name[j]);

)

ifl:(p=fbpen(,,score.datH,,,wH))=NULL)

(

printffThcfilecannotopen!\nH);

exit(l);

}

fprintf(p,n%d%d%d,M,co[0],co[1],co[2]);

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

巾irnt,p,"%s\n",name[i]);

fclose(p);

Coread();

)

getch();

gotobss;

)

}/*結(jié)束111的判斷*/

/*下面是一些快捷功能鍵的定義*/

if(ams—q'||ams='Q,||ams=27){fclose(p);closegraph();farfree(Map);exit(1);}/*退出主程序的唯一

出口*/

if(ams—c*||ams—C1)gotobss;/*重來*/

if(ams=Ti1|ams==H){Help();k=0;}/*幫助文檔*/

if(ams=,r,||ams=,Rr){Coread();k=0;}/*察看成績*/

getimage(xms,yms,xms+20,yms+20,Map);

Ddraw2(xms,yms);

delay(10);

}/*結(jié)束鼠標循環(huán)讀取的死循環(huán)*/

}

/*++■―++++主函數(shù)結(jié)束+―+++++*/

/*這個函數(shù)用于實現(xiàn)鼠標的初始化*/

intMsinit()

(

intrecored;

regs.x.ax=0;

int86(0x33,®s,®s);

recored=regs.x.ax;

if(recored=0)

printf("MousenotfoundorMousedrivernotinstalled.\nH);

return0;

)

else

returnrecored;

}

/*下面這個子程序是完成描繪一個按鈕*/

voidDraw(intx,inty,intsizex,intsizey)/*x,y為左上角坐標sizex,sizey為長和寬*/

|

intsizx=sizex-l;

intsizy=sizey-l;

setcolor(15);/*這里最好用白色*/

line(x,y,x+sizx-1,y);

line(x,y+1,x+sizx-2,y+1);

linc(x,y,x,y+sizy-l);

line(x+1,y?x+l,y+sizy-2);

setcolor(8);/*這里最好用深灰色*/

line(x+l,y+sizy,x+sizx,y+sizy);

line(x+2,y+sizy-l,x-i-sizx,y4-sizy-l);

line(x+sizx-l,y+l,x+sizx-l,y+sizy);

1ine(x+sizx,y+2,x+sizx,y4-sizy);

setcolor⑺;/*這里最好用灰色*/

putpixel(x,y+sizy,3);

putpixel(x+1,y+sizy?1,3);

putpixel(x+sizx,y,3);

putpixel(x+sizx-1,y+1,3);

setfmstyle(l,7);/*這里最好用灰色,設(shè)置填充模式*/

bar(x+2,y+2,x+sizx-2,y+sizy-2);

)

/*下面是一些畫圖程序*/

/*形參x,y笑臉的中心坐標,sizel臉的大小(半徑),

k為要描述的臉型,1:哭、2:平常、3:笑*/

voidFacedraw(intx,inty,intsizel,intk)

{Draw(x-sizel-3,y-sizel-3,2*(sizel+4),2*(sizel+4));Z*畫一個按鈕*/

setcolor(14);

setfillstyle(l,14);

pieslice(x,y,0,360,sizel);/*畫一個黃色的圓面*/

setfillstyle(l,0);

setcolor(O);

if(k=l)/*失敗*/

linc(x-sizcl*7/20,y-sizcl*7/20,x-sizcl*3/20,y-sizel*3/20);/*畫兩個差表示眼睛*/

line(x-sizel*7/20,y-sizel*3/20,x-sizel*3/20,y-sizel*7/20);

line(x+sizel*3/20,y-sizel*7/20,x+sizel*7/20,y-sizel*3/20);

line(x-i-sizel*3/20,y-sizel*3/20,x-?-sizel*7/20,y-sizel*7/20);

arc(x,y+sizel,20,160,sizcl/2);

if(k=2)/*平常*/

(

bar(x-sizcl*7/20,y-sizcl*7/20,x-sizel*3/20,y-sizcl*3/20);

bar(x+sizel*3/20,y-sizel*7/20,x+sizel*7/20,y-sizel*3/20);

arc(x,y,200,340,sizel*3/4);

)

if(k=3)/*成功*/

{

bar(x-sizel/2,y-sizel/2,x-sizel*3/20,y-sizel*3/20);

bar(x+sizel*3/20,y-sizel/2,x+sizel/2,y-sizel*3/20);

linc(x-sizcl*3/20,y-sizel/2,x+sizcl*3/20,y-sizcl/2);

Iine(x-sizel/2,y-sizel*5/20,x-sizeI,y);

line(x+sizel/2,y-sizel*5/20,x+sizel,y);

arc(x,y,200,340,sizel*3/4);/*嘴巴*/

/*死亡后的處理程序*/

/*x,y要判斷的點的坐標,sizel為臉的大小*/

voidDead(intsizel,intxjnty)

|

int修;/*循環(huán)變量*/

setcolor(4);

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

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

ifl;pan[i]U]=9)

{

circle(i*size+pix+7,j*size+piy+7,4);

}/*用紅色的圓圈標記有雷的方塊*

溫馨提示

  • 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論