#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)
{
俄罗斯方快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()
}
}
#include <stdlib.h>#include <time.h>
#include <conio.h>
/************************************************************************/
/* 地图状态约定*/
/* 0 : 周围9个格子都没有雷*/
/* 1~8: 周围9个格子有1~8个雷 */
/* -1 : 有雷的格子 */
/* -2 : 被翻开的有雷的格子 */
/* -3 : 地图边界 */
/************************************************************************/
int Map[12][12]={0} /* 当前在玩的雷图 */
int MapShow[12][12]={0} /* 当前用户选择过的地方,即“已翻开”的格子 */
int nSpaceLeft = 100 /* 剩余的空白数,如果为0,则任务成功! */
int lastX,lastY /* 失败时,记录挖到雷的位置 */
int AllMaps[5][12][12]={0}/* 供用户选择的五张雷图 */
/* 显示雷区(每次用户 *** 作之后都要重新显示) */
void DrawMap()
/* 初始化雷区 */
void InitMap()
/* 游戏开始时,加载用户选择的一幅雷图 */
void LoadMap(int index)
/* 玩扫雷游戏 */
int Play()
/* 绘制主菜单 */
void DrawMainMenu()
/* 显示结果 */
void ShowResult(int result)
/* 主函数 */
int main(int argc, char* argv[])
{
char ch
int result
srand(time(NULL))/* 按当前时间初始化随机数,这样每次启动的时候,雷的位置的不一样 */
InitMap()/* 初始化5张雷图,供用户选择 */
while(1) /* 用while循环,保证只有在用户选择退出时,才退出游戏 */
{
DrawMainMenu() /* 绘制主菜单 */
flushall() /* 清空所有输入输出缓冲区,主要是清空输入缓冲区,防止前面的输入对getch()的干扰 */
ch = getch() /* 读取输入 */
switch(ch)
{
case '1': /* 用户选择1 */
printf("\n\t请输入雷图编号(1-5):")
while (1) /* 循环输入,如果输入错误就一直要求输入 */
{
flushall()
ch = getch()/* 读取用户输入的雷图编号 */
if (ch >= '1' &&ch <= '5') /* 只有在1-5之间有效 */
{
LoadMap(ch-'1')/* ch -'1',将用户输入转换为雷图下标(下标从0开始,所以是-'1')*/
break /* 如果输入正确,就退出循环输入 */
}
else
{
/* 输入错误,则提示重新输入 */
printf("\n\t输入无效!请重新输入雷图编号(1-5):")
flushall()
}
}
result = Play() /* 开始玩扫雷游戏 */
ShowResult(result)/* 显示游戏结果 */
break
case '2': /* 用户选择2 */
exit(0) /* 直接退出 */
break
default: /* 无效输入 */
/* 不做任何 *** 作,重新显示主菜单 */
break
}
}
return 0
}
void LoadMap(int index)
{
int i,j
nSpaceLeft = 90
for(i=0i<12i++)
for(j=0j<12j++)
{
Map[i][j] = AllMaps[index][i][j]/* 将5张雷图中的下标为index的那一张载入到Map数组 */
MapShow[i][j] = 0 /* 重新开始游戏,所以所有格子都是“未翻开”状态 */
}
}
void InitMap()
{
int i,j,k
int m,n
/* 要初始化5张地图 */
for(k=0k<5k++)
{
/* 初始化地图的边界 */
for(i=0i<12i++)
{
/* 下标为0和11的位置都是“边界”,这些位置不属于雷区,仅在程序内部使用 */
AllMaps[k][0][i] = -3
AllMaps[k][11][i] = -3
AllMaps[k][i][0] = -3
AllMaps[k][i][11] = -3
}
/* 先初始化10个雷的位置 */
for(i=0i<10i++)
{
m = rand()%10 + 1/* 随机选一个X坐标 */
n = rand()%10 + 1/* 随机选一个Y坐标 */
if(AllMaps[k][m][n] == 0) /* 如果随机产生的位置之前没有被安排放置雷 */
{
AllMaps[k][m][n] = -1/* 放置一个雷 */
}
else /* 随机产生的位置在之前已经放置了雷了 */
{
i--/* 这个位置无效,重新产生一个 */
}
}
/* 计算每个格子周围雷的个数 */
for(i=1i<11i++)
for(j=1j<11j++)
{
if(AllMaps[k][i][j] != -1)
{
AllMaps[k][i][j] = 0
/* 周围的8个位置,有一个雷就加一 */
/************************************************************************/
/* 坐标[i][j]周围的8个坐标位置: */
/* [i-1][j-1] [i-1][j] [i-1][j+1] */
/* [i][j-1] [i][j][i][j+1] */
/* [i+1][j-1] [i+1][j] [i+1][j+1] */
/************************************************************************/
if(AllMaps[k][i-1][j-1] == -1)
AllMaps[k][i][j]++
if(AllMaps[k][i-1][j] == -1)
AllMaps[k][i][j]++
if(AllMaps[k][i-1][j+1] == -1)
AllMaps[k][i][j]++
if(AllMaps[k][i][j-1] == -1)
AllMaps[k][i][j]++
if(AllMaps[k][i][j+1] == -1)
AllMaps[k][i][j]++
if(AllMaps[k][i+1][j-1] == -1)
AllMaps[k][i][j]++
if(AllMaps[k][i+1][j] == -1)
AllMaps[k][i][j]++
if(AllMaps[k][i+1][j+1] == -1)
AllMaps[k][i][j]++
}
}
}
}
void DrawMap()
{
int i,j
system("cls") /* 清屏 */
/* 绘制坐标和边框 */
printf("\n\n\n")
printf("\t Y ")
for(i=1i<11i++) printf("%-02d",i-1)
printf("\n\tX |###################|\n")
/* 每一行按规则绘制雷区 */
for(i=1i<11i++)
{
printf("\t%-02d|",i-1)/* 显示X坐标 */
for(j=1j<11j++)
{
if(MapShow[i][j]) /* 如果该位置被用户“挖开”了,就照实显示 */
{
if (Map[i][j] >= 0) /* 非雷,显示周围雷的个数 */
{
printf("%d|",Map[i][j])
}
/*else if(Map[i][j] == 0)
{
printf("0|")
}*/
else if (Map[i][j] == -1) /* 雷,显示* */
{
printf("*|")
}
else if (Map[i][j] == -2) /* 用户挖到的雷,显示@ */
{
printf("@|")
}
else /* 其他情况(目前不会出现,方便以后扩展) */
{
printf(" |")
}
}
else /* 如果该位置没有被用户“挖开”,则显示空格 */
{
printf(" |")
}
}
printf("\n")
}
printf("\t |###################|\n")
}
void DrawMainMenu()
{
system("cls")
printf("\n\n\n\n\n\n")
printf("\t|###################|\n")
printf("\t| 请选择! |\n")
printf("\t|1. 开始扫雷|\n")
printf("\t|2. 退出|\n")
printf("\t|###################|\n")
}
int Play()
{
char chX,chY/* 用户输入 */
int X,Y/* 用户输入转换为整数下标 */
int i,j
while (1)
{
DrawMap() /* 重新绘制雷区图 */
/* 输入X坐标 */
printf("\n\t请输入X:")
flushall()
while(1)
{
chX = getch()
if (chX >= '0' &&chX <= '9')
{
X = chX - '0' + 1
break
}
else
{
printf("\n\t输入无效!请重新输入X:")
flushall()
}
}
/* 输入Y坐标 */
printf("\n\t请输入Y:")
flushall()
while(1)
{
chY = getch()
if (chY >= '0' &&chY <= '9')
{
Y = chY - '0' + 1
break
}
else
{
printf("\n\t输入无效!请重新输入Y:")
flushall()
}
}
if(MapShow[X][Y] == 0) /* 输入的是未翻开的位置 */
{
MapShow[X][Y] = 1 /* 将该位置标记为“已翻开” */
if(Map[X][Y] == -1) /* 如果挖到的是雷 */
{
Map[X][Y] = -2 /* 标记为-2,表示这是被用户挖到的雷 */
for(i=1i<11i++)
for(j=1j<11j++)
MapShow[i][j]=1/* 游戏结束,自动将所有位置“翻开” */
/* 记录用户挖到雷的位置坐标 */
lastX = X-1
lastY = Y-1
return 0/* 游戏失败! */
}
else /* 如果挖到的不是雷 */
{
nSpaceLeft-- /* 剩余空白数减一 */
if(nSpaceLeft==0) /* 剩余空白数为0,则表示游戏成功 */
{
return 1/* 游戏胜利! */
}
}
}
else /* 输入的是已翻开的位置 */
{
printf("\n\t你输入的位置是[%d,%d]\n\t这个位置已经翻开!请重新输入!\n\t按任意键继续...\n",X-1,Y-1)
flushall()
getch()
}
}
}
void ShowResult( int result )
{
DrawMap()
if(result == 1) /* 游戏成功 */
{
printf("\n\t恭喜!您完成的扫雷任务!\n\t按任意键继续...")
flushall()
getch()
}
else /* 游戏失败 */
{
printf("\n\t哈哈!您在位置[%d,%d]挖到雷了,任务失败!\n\t按任意键继续...",lastX, lastY)
flushall()
getch()
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)