#include <conio.h>
#include <graphics.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#include "mouse.c"
#define YES 1
#define NO 0
#define XPX 15 /* X pixels by square */
#define YPX 15 /* Y pixels by square */
#define DEFCX 30 /* Default number of squares */
#define DEFCY 28
#define MINE 255-'0' /* So that when it prints, it prints char 0xff */
#define STSQUARE struct stsquare
STSQUARE {
unsigned char value/* Number of mines in the surround squares */
unsigned char sqopen/* Square is open */
unsigned char sqpress/* Square is pressed */
unsigned char sqmark/* Square is marked */
} *psquare
#define value(x,y) (psquare+(x)*ncy+(y))->value
#define sqopen(x,y) (psquare+(x)*ncy+(y))->sqopen
#define sqpress(x,y) (psquare+(x)*ncy+(y))->sqpress
#define sqmark(x,y) (psquare+(x)*ncy+(y))->sqmark
int XST, /* Offset of first pixel X */
YST,
ncx, /* Number of squares in X */
ncy,
cmines, /* Mines discovered */
initmines, /* Number of initial mines */
sqclosed, /* Squares still closed */
maxy/* Max. number of y pixels of the screen */
void Graph_init(void)
void Read_param(int argc, char *argv[])
void Set_mines(int nminas)
void Set_square(int x, int y, int status)
void Mouse_set(void)
void Draw_squares(void)
int Do_all(void)
void Blow_up(void)
void Open_square(int x, int y)
int Open_near_squares(int x, int y)
/************************************************************************/
void main(int argc, char *argv[])
{
if (!mouse_reset()) {
cputs(" ERROR: I can't find a mouse driver\r\n")
exit(2)
}
Graph_init()
Read_param(argc, argv)
Mouse_set()
do {
randomize()
cleardevice()
Set_mines(cmines=initmines)
mouse_enable()
Draw_squares()
}
while (Do_all() != '\x1b')
closegraph()
}
/*************************************************************************
* *
* F U N C T I O N S *
* *
*************************************************************************/
/*----------------------------------------------------------------------*/
void Graph_init(void)
{
int graphdriver=DETECT, graphmode, errorcode
if(errorcode <0) {
cprintf("\n\rGraphics System Error: %s\n",grapherrormsg(errorcode))
exit(98)
}
initgraph(&graphdriver, &graphmode, "")
errorcode=graphresult()
if(errorcode!=grOk) {
printf(" Graphics System Error: %s\n",grapherrormsg(errorcode))
exit(98)
}
maxy=getmaxy()
} /* Graph_init */
/*----------------------------------------------------------------------*/
void Read_param(int argc, char *argv[])
{
int x, y, m
x=y=m=0
if (argc!=1) {
if (!isdigit(*argv[1])) {
closegraph()
cprintf("Usage is: %s [x] [y] [m]\r\n\n"
"Where x is the horizontal size\r\n"
" y is the vertical size\r\n"
" m is the number of mines\r\n\n"
" Left mouse button: Open the square\r\n"
"Right mouse button: Mark the square\r\n"
" -The first time puts a 'mine' mark\r\n"
" -The second time puts a 'possible "
"mine' mark\r\n"
" -The third time unmarks the square\r\n"
"Left+Right buttons: Open the surrounded squares only if "
"the count of mines\r\n"
" is equal to the number in the square",argv[0])
exit (1)
}
switch (argc) {
case 4: m=atoi(argv[3])
case 3: y=atoi(argv[2])
case 2: x=atoi(argv[1])
}
}
XST=100
ncx=DEFCX
if (maxy==479) {
YST=30
ncy=DEFCY
}
else {
YST=25
ncy=20
}
if (x>0 &&x<ncx)
ncx=x
if (y>0 &&y<ncy) {
YST+=((ncy-y)*YPX)>>1
ncy=y
}
initmines= m ? m : ncx*ncy*4/25/* There are about 16% of mines */
if (((void near*)psquare=calloc(ncx*ncy, sizeof(STSQUARE)))==NULL) {
closegraph()
cputs("ERROR: Not enought memory")
exit(3)
}
} /* Read_param */
/*----------------------------------------------------------------------*/
void Set_mines(int nminas)
{
/*5.3.4 源程序*/#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#define LEFTPRESS 0xff01
#define LEFTCLICK 0xff10
#define LEFTDRAG 0xff19
#define MOUSEMOVE 0xff08
struct
{
int num/*格子当前处于什么状态,1有雷,0已经显示过数字或者空白格子*/
int roundnum/*统计格子周围有多少雷*/
int flag/*右键按下显示红旗的标志,0没有红旗标志,1有红旗标志*/
}Mine[10][10]
int gameAGAIN=0/*是否重来的变量*/
int gamePLAY=0/*是否是第一次玩游戏的标志*/
int mineNUM/*统计处理过的格子数*/
char randmineNUM[3]/*显示数字的字符串*/
int Keystate
int MouseExist
int MouseButton
int MouseX
int MouseY
void Init(void)/*图形驱动*/
void MouseOn(void)/*鼠标光标显示*/
void MouseOff(void)/*鼠标光标隐藏*/
void MouseSetXY(int,int)/*设置当前位置*/
int LeftPress(void)/*左键按下*/
int RightPress(void)/*鼠标右键按下*/
void MouseGetXY(void)/*得到当前位置*/
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)/*统计每个格子周围的雷数*/
int ShowWhite(int,int)/*显示无雷区的空白部分*/
void GamePlay(void)/*游戏过程*/
void Close(void)/*图形关闭*/
void main(void)
{
Init()
Control()
Close()
}
void Init(void)/*图形开始*/
{
int gd=DETECT,gm
initgraph(&gd,&gm,"c:\\tc")
}
void Close(void)/*图形关闭*/
{
closegraph()
}
void MouseOn(void)/*鼠标光标显示*/
{
_AX=0x01
geninterrupt(0x33)
}
void MouseOff(void)/*鼠标光标隐藏*/
{
_AX=0x02
geninterrupt(0x33)
}
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)
}
void MouseGetXY(void)/*得到当前位置*/
{
_AX=0x03
geninterrupt(0x33)
MouseX=_CX
MouseY=_DX
}
void Control(void)/*游戏开始,重新,关闭*/
{
int gameFLAG=1/*游戏失败后判断是否重新开始的标志*/
while(1)
{
if(gameFLAG)/*游戏失败后没判断出重新开始或者退出游戏的话就继续判断*/
{
GameBegain()/*游戏初始画面*/
GamePlay()/*具体游戏*/
if(gameAGAIN==1)/*游戏中重新开始*/
{
gameAGAIN=0
continue
}
}
MouseOn()
gameFLAG=0
if(LeftPress())/*判断是否重新开始*/
{
MouseGetXY()
if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)
{
gameFLAG=1
continue
}
}
if(kbhit())/*判断是否按键退出*/
break
}
MouseOff()
}
void DrawSmile(void)/*画笑脸*/
{
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)
}
void DrawRedflag(int i,int j)/*显示红旗*/
{
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)
}
void DrawEmpty(int i,int j,int mode,int color)/*两种空格子的显示*/
{
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)
}
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=0i<10i++)/*画格子*/
for(j=0j<10j++)
DrawEmpty(i,j,0,8)
setcolor(7)
DrawSmile()/*画脸*/
randomize()
for(i=0i<10i++)/*100个格子随机赋值有没有地雷*/
for(j=0j<10j++)
{
Mine[i][j].num=random(8)/*如果随机数的结果是1表示这个格子有地雷*/
if(Mine[i][j].num==1)
mineNUM++/*现有雷数加1*/
else
Mine[i][j].num=2
Mine[i][j].flag=0/*表示没红旗标志*/
}
sprintf(randmineNUM,"%d",mineNUM)/*显示这次总共有多少雷数*/
setcolor(1)
settextstyle(0,0,2)
outtextxy(210,70,randmineNUM)
mineNUM=100-mineNUM/*变量取空白格数量*/
MouseOn()
}
void GameOver(void)/*游戏结束画面*/
{
int i,j
setcolor(0)
for(i=0i<10i++)
for(j=0j<10j++)
if(Mine[i][j].num==1)/*显示所有的地雷*/
{
DrawEmpty(i,j,0,RED)
setfillstyle(SOLID_FILL,BLACK)
fillellipse(200+j*20,100+i*20,7,7)
}
}
void GameWin(void)/*显示胜利*/
{
setcolor(11)
settextstyle(0,0,2)
outtextxy(230,30,"YOU WIN!")
}
int MineStatistics(int i,int j)/*统计每个格子周围的雷数*/
{
int nNUM=0
if(i==0&&j==0)/*左上角格子的统计*/
{
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)/*右上角格子的统计*/
{
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)/*左下角格子的统计*/
{
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)/*右下角格子的统计*/
{
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)/*左边第一列格子的统计*/
{
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)/*右边第一列格子的统计*/
{
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)/*第一行格子的统计*/
{
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)/*最后一行格子的统计*/
{
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(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)/*把格子周围一共有多少雷数的统计结果返回*/
}
int ShowWhite(int i,int j)/*显示无雷区的空白部分*/
{
if(Mine[i][j].flag==1||Mine[i][j].num==0)/*如果有红旗或该格处理过就不对该格进行任何判断*/
return
mineNUM--/*显示过数字或者空格的格子就表示多处理了一个格子,当所有格子都处理过了表示胜利*/
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)/*输出雷数*/
{
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/*已经输出雷数的格子用0表示已经用过这个格子*/
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用来接收统计函数返回一个格子周围有多少地雷*/
for(i=0i<10i++)
for(j=0j<10j++)
Mine[i][j].roundnum=MineStatistics(i,j)/*统计每个格子周围有多少地雷*/
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)/*当前鼠标位置在格子范围内*/
{
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)/*输出当前格子周围的雷数*/
setcolor(RED)
outtextxy(195+j*20,95+i*20,randmineNUM)
mineNUM--
}
MouseOn()
Mine[i][j].num=0/*点过的格子周围雷数的数字变为0表示这个格子已经用过*/
if(mineNUM<1)/*胜利了*/
{
GameWin()
break
}
}
}
}
}
if(RightPress())/*鼠标右键键盘按下*/
{
MouseGetXY()
if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*当前鼠标位置在格子范围内*/
{
j=(MouseX-190)/20/*x坐标*/
i=(MouseY-90)/20/*y坐标*/
MouseOff()
if(Mine[i][j].flag==0&&Mine[i][j].num!=0)/*本来没红旗现在显示红旗*/
{
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)
}
}
}
俄罗斯方快http://topic.csdn.net/t/20051201/01/4429905.html扫雷
#include<stdio.h>
#include<graphics.h>
#include<stdlib.h>
struct list
{
int x
int y
int num
int bomb
int wa
}
struct list di[10][10]
int currentx=210
int currenty=130
void initxy(void)
{
int i,j
for(i=0i<=9i++)
for(j=0j<=9j++)
{
di[j].x=i*20+200
di[j].y=j*20+120
di[j].wa=0
di[j].bomb=0
}
}
void initmu(void)
{
int i,j
setcolor(2)
rectangle(200,120,400,320)
rectangle(190,110,410,330)
setfillstyle(8,14)
floodfill(191,111,2)
for(i=0i<=9i++)
for(j=0j<=9j++)
rectangle(di[j].x,di[j].y,di[j].x+19,di[j].y+19)
outtextxy(450,200,"press 'enter' to kick")
outtextxy(450,250,"press '\' to mark")
}
void randbomb(void)
{
int k
int i,j
randomize()
for(i=0i<=9i++)
for(j=0j<=9j++)
{
k=random(5)
if(k==2)
di[j].bomb=1
}
}
void jisuan(void)
{
int k=0
int i,j
for(i=0i<=9i++)
for(j=0j<=9j++)
{
if(i&&j&&di[i-1][j-1].bomb)
k=k+1
if(i&&di[i-1][j].bomb)
k=k+1
if(j&&di[j-1].bomb)
k=k+1
if(i<=8&&di[i+1][j].bomb)
k=k+1
if(j<=8&&di[j+1].bomb)
k=k+1
if(i<=8&&j<=8&&di[i+1][j+1].bomb)
k=k+1
if(i&&j<=8&&di[i-1][j+1].bomb)
k=k+1
if(i<=8&&j&&di[i+1][j-1].bomb)
k=k+1
di[j].num=k
k=0
}
}
void xianbomb(void)
{
int i,j
char biaoji[2]
char znum[2]
biaoji[0]=1
biaoji[1]=NULL
for(i=0i<=9i++)
for(j=0j<=9j++)
{
if(di[j].bomb==1)
outtextxy(di[j].x+2,di[j].y+2,biaoji)
else
{
itoa(di[j].num,znum,10)
setfillstyle(1,0)
bar(i*20+202,j*20+122,i*20+218,j*20+138)
outtextxy(i*20+202,j*20+122,znum)
}
}
}
void move(void)
{
int key
key=bioskey(1)
if(key)
key=bioskey(0)
if(key==0x4800)
{
if(currenty>130)
{
setcolor(0)
circle(currentx,currenty,5)
currenty-=20
setcolor(4)
circle(currentx,currenty,5)
}
else
{
setcolor(0)
circle(currentx,currenty,5)
currenty=310
setcolor(4)
circle(currentx,currenty,5)
}
}
if(key==0x4b00)
{
if(currentx>210)
{
setcolor(0)
circle(currentx,currenty,5)
currentx-=20
setcolor(4)
circle(currentx,currenty,5)
}
else
{
setcolor(0)
circle(currentx,currenty,5)
currentx=390
setcolor(4)
circle(currentx,currenty,5)
}
}
if(key==0x4d00)
{
if(currentx<390)
{
setcolor(0)
circle(currentx,currenty,5)
currentx+=20
setcolor(4)
circle(currentx,currenty,5)
}
else
{
setcolor(0)
circle(currentx,currenty,5)
currentx=210
setcolor(4)
circle(currentx,currenty,5)
}
}
if(key==0x5000)
{
if(currenty<310)
{
setcolor(0)
circle(currentx,currenty,5)
currenty+=20
setcolor(4)
circle(currentx,currenty,5)
}
else
{
setcolor(0)
circle(currentx,currenty,5)
currenty=130
setcolor(4)
circle(currentx,currenty,5)
}
}
if(key==0x1c0d)
{
int i,j
char snum[2]
snum[0]=NULL
snum[1]=NULL
i=(currentx-210)/20
j=(currenty-130)/20
if(di[j].bomb==1)
{
outtextxy(100,100,"game over")
xianbomb()
sleep(2)
exit(0)
}
if(di[j].bomb==0)
{
di[j].wa=1
setfillstyle(1,0)
bar(currentx-8,currenty-8,currentx+8,currenty+8)
setcolor(15)
itoa(di[j].num,snum,10)
outtextxy(currentx-8,currenty-8,snum)
setcolor(4)
circle(currentx,currenty,5)
}
}
if(key==0x2b5c)
{
char biaoji[2]
biaoji[0]=1
biaoji[1]=NULL
setcolor(0)
bar(currentx-8,currenty-8,currentx+8,currenty+8)
setcolor(4)
outtextxy(currentx-8,currenty-8,biaoji)
circle(currentx,currenty,5)
}
}
void success(void)
{
int k=1
int i,j
for(i=0i<=9i++)
for(j=0j<=9j++)
if(di[j].bomb==0&&di[j].wa==0)
k=0
if(k==1)
{
outtextxy(100,100,"success good")
xianbomb()
sleep(2)
exit(0)
}
}
void main(void)
{
int gd=DETECT,gm
initgraph(&gd,&gm,"")
initxy()
initmu()
randbomb()
jisuan()
setcolor(4)
circle(210,130,5)
while(1)
{
move()
success()
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)