版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國城市公共汽車客運行業(yè)發(fā)展前景及投資規(guī)劃研究報告版
- 2024-2030年中國地毯行業(yè)競爭格局及未來投資趨勢分析報告
- 2024-2030年中國國際貨代行業(yè)未來發(fā)展趨勢及投資風(fēng)險分析報告
- 2024年度物聯(lián)網(wǎng)(IoT)設(shè)備控制系統(tǒng)軟件開發(fā)合同技術(shù)集成與擴展2篇
- 茂名職業(yè)技術(shù)學(xué)院《國學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年深圳子女撫養(yǎng)權(quán)協(xié)議書樣本3篇
- 中國日報2019年9月25日
- 馬鞍山職業(yè)技術(shù)學(xué)院《美術(shù)基礎(chǔ)與欣賞》2023-2024學(xué)年第一學(xué)期期末試卷
- 呂梁學(xué)院《信息安全綜合》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年度醫(yī)院護工工作環(huán)境與職業(yè)健康保護協(xié)議下載3篇
- 分子流行病學(xué)進展與其在疾病預(yù)防控制中的實際應(yīng)用
- 甘井子名稱的來歷大連史話(八)
- 7混凝土護坡施工方案
- 1、每日桶裝水送水登記表
- 精益生產(chǎn)現(xiàn)場管理和改善課件(共132頁).ppt
- 鋼軌閃光焊 技術(shù) 焊縫 傷損_圖文
- 風(fēng)管風(fēng)機吊架重量表
- 房屋漏水賠償協(xié)議書甲方
- 預(yù)焙陽極配料控制
- 二階低通濾波器的設(shè)計-模電課設(shè)報告
- 六類非屏蔽網(wǎng)線模塊安裝
評論
0/150
提交評論