版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
五子棋
#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
/*定义棋盘上交叉点的状态,即该点有无棋子*/
/*若有棋子,还应能指出是哪个玩家的棋子*/
#dcfineCHESSNULL0/*没有棋子*/
#defineCHESS1'07*一号玩家的棋子*/
#defineCHESS2'X7*二号玩家的棋子*/
/*定义按键类别*/
#defineKEYEXIT0/*退出键*/
#defineKEYFALLCHESS1/*落-了键*/
#defineKEYMOVECURSOR2/*光标移动键*/
#defineKEYINVALID3/*无效键*/
/*定义符号常量:真,假一真为1,假为0*/
#defineTRUE1
#defineFALSE0
/**********************************************************/
/*定义数据结构*/
/*棋盘交叉点坐标的数据结构*/
structpoint
intx,y;
);
/**********************************************************/
/*自定义函数原型说明*/
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];/*用于记录棋盘上各点的状态*/
/**********************************************************/
/*书函数*/
voidmain()
(
intpress;
intbOutWhile=FALSE;/*退出循环标志*/
printf(HWelcome");
InitO;/*初始化图象,数据*/
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;/*退出循环标志置为真*/
)
/*否则*/
else
/*交换行棋方*/
ChangeOrder();
ShowOrderMsg(gPlayOrder);
break;
/*是光标移动键*/
caseKEYMOVECURSOR:
MoveCursor(gPlayOrder,press);
break;
/*是无效键*/
caseKEYINVALID:
break;
)
if(bOutWhile=TRUE)
break;
/*游戏结束*/
EndGame();
)
/**********************************************************/
/*界面初始化,数据初始化*/
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;
/*棋盘数据清零,即棋盘上各点开始的时候都没有棋子*/
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)
;/*如果用户没有按键,空循环*/
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++)
/*判断在指定方向上是否有连续5个行棋方的棋子*/
if(JudgeVVinLine(Order,Cursor,!))
returnTRUE;
returnFALSE;
}
/*判断在指定方向I:是否有连续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);
/*游戏结束处理*/
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;/*游戏速度自己调整*7
structFood
(
intx;/*食物的横坐标*/
inty;/*食物的纵坐标*/
intyes;/*判断是否要出现食物的变量*/
}fbod;/*食物的结构体*/
structSnake
intx[N];
inty[N];
intnode;/*蛇的节数*/
intdirection;/*蛇移动方向*/
intlifey*蛇的生命,0活着』死亡*/
}snake;
voidInit(void);/*图形驱动*/
voidClose(void);/*图形结束*/
voidDrawK(void);/*开始画面*/
voidGameOver(void);/*结束游戏*/
voidGamcPlay(void);/*玩游戏具体过程*/
voidPrScore(void);/*输出成绩*/
/*主函数*/
voidmain(void)
(
InitOJ*图形驱动*/
DrawK();/*开始画面*/
GamePlayQ;/*玩游戏具体过程*/
Close。;/*图形结束*/
)
/*图形驱动*/
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);/*设置线型*/
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。;/*随机数发生器*/
fbod.ycs=l;/*l表示需要出现新食物,0表示已经存在食物*/
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;/*节数*/
PrScorc。;/*输出得分*/
while(l)/*可以重复玩游戏,压ESC键结束*/
(
while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/
(
if(fdod.yes=l)/*需要出现新食物*/
{
fbod.x=rand()%400+60;
fbod.y=rand()%350+60;
while(fbod.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
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--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
|
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++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不
可能拐过来*/
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();/*本次游戏结束*/
snake.li住=1;/*蛇死*/
)
if(snake.峰=1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
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;
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++;/*蛇的身体长一节*/
food.yes=1;/*L前面上需要出现新的食物♦/
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);/*用黑色去除蛇的的最后一节♦/
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)/*如果蛇死就跳出循环*/
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)*/
)
/*游戏结束*/
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);
}
/*图形结束*/
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";/*用于显示方格周围的雷的个数*/
intpan[30][16];/*用于记录盘面的情况:0:没有、9:有雷、1〜8:周围雷的个数*/
intpanl[30][16];/*panl□□纪录当前的挖雷情况,O没有操作、1:打开了、2:标记了*/
inttt;/*纪录时间参数*/
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);
/*下面是主函数*/
main()
(
intmode=VGAHI,devices=VGA;/*图形模式初始化的变量*/
charams;/*鼠标操作中的标志变量*/
intxms,yms,bms;/*鼠标的状态变量*/
inti,j,k,kl=O;/*i,j,k是循环变量*/
intx=9,y=9,flags=0;/*x,y矩阵的大小*/
intsum=10;/♦sum盘面的雷的总数目,是个x,y的函数*/
intxl=0,yl=0;/*用于记录光标当前的位置*/
intxll=0,y11=0;/*暂时保存鼠标位置的值*/
intsizel=10;/*脸的大小*/
intcflags=l;/*这是菜单操作标志变量,没有弹出1,弹出0*/
structtimetl={0,0,0,0};/*时间结构体,头文件已定义*/
intco[3];/*暂时纪录历史纪录*/
voidfar*Map;/*用于保存鼠标图片*/
charname[3][20];/*名字字符串,用于记录名字*/
FILE*/*文件指针用于文件操作*/
Msinit();/*鼠标初始化*/
/*rcgistcrbgidriver(EGAVGA_driver);*/
initgr叩h(&devices,&mode,"C:\\tc");/*图形模式初始化*/
/*为图片指针分配内存*/
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);
}
/*写入初始内容*/
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);/*设置鼠标的活动范围*/
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++)/*用于统计各点的周边情况*/
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");
/*下面这•段用于接收用户的控制,并做出反应*/
fbr(;;)
(
ams=Msread(&xms,&yms,&bms,tl,k);/*读取鼠标状态*/
/*下面一段用于保存并记录鼠标图片*/
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;
}/*完成菜单的描绘*/
/*这里是为了完全实现鼠标控制才加入的内容*/
if(Eflags=2&&(bms!=0||ams!=-l))
(
gotobss;
)
/*下面实现菜单的功能,每一项响应一个菜单项*/
if(cflags=O)
{
if((xms>=pix-6&&xms<=pix+85&&yms>=17&&yms<=28&&bms==l)||(ams—r'||ams=R))/*下面
依次响应菜单中各项*/
{
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;
)
}/*结束菜单功能的实现*/
/*在笑脸按钮处单击时重新开始*/
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;
)
}/*结束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);
}/*结束鼠标循环读取的死循环*/
}
/*++■―++++主函数结束+―+++++*/
/*这个函数用于实现鼠标的初始化*/
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);/*这里最好用灰色,设置填充模式*/
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修;/*循环变量*/
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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/SHPTA 115-2024多层共挤流延聚乙烯标签膜
- T/PTACAS 7-2024印刷企业综合能力评价分级要求
- 数据分析师数据分析质量绩效评定表
- 律师事务律师案源开发与案件处理能力绩效衡量表
- 电商平台会员体系搭建规范手册
- 智能家居产品功能规范手册
- 媒体编辑部内容创作绩效衡量表
- T/SASWI 001-2023无氯环保融雪剂
- 环境表面清洁与消毒管理试题及答案
- 退耕还林工程水土保持技术手册
- 2026中国进出口银行招聘考试(专业知识)历年参考题库含答案详解
- 消防培训防盗、防火安全课件
- 事业编计算机岗2026全真模拟
- 妇科肿瘤整合加速康复外科管理中国专家共识(2026年版)
- 艾灸疗法小讲课
- 超限站工作制度
- DZ/T 0054-2014定向钻探技术规程
- 应用型高校教学评价指标体系构建
- 城市高架桥防撞护栏安装方案
- 2024-2025学年人教版物理八年级上册 期中考试物理试卷
- 加油站现场安全重点检查指引
评论
0/150
提交评论