当前位置:首页 > 代码 > 正文

c扫雷源代码(扫雷数组c语言最简单代码)

admin 发布:2022-12-19 23:34 162


今天给各位分享c扫雷源代码的知识,其中也会对扫雷数组c语言最简单代码进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

C++扫雷源代码

这是字符界面的扫雷:

#include iostream

#include cstdlib

#include ctime

#include windows.h

#include conio.h

// defines

#define KEY_UP 0xE048

#define KEY_DOWN 0xE050

#define KEY_LEFT 0xE04B

#define KEY_RIGHT 0xE04D

#define KEY_ESC 0x001B

#define KEY_1 '1'

#define KEY_2 '2'

#define KEY_3 '3'

#define GAME_MAX_WIDTH 100

#define GAME_MAX_HEIGHT 100

// Strings Resource

#define STR_GAMETITLE "ArrowKey:MoveCursor Key1:Open \

Key2:Mark Key3:OpenNeighbors"

#define STR_GAMEWIN "Congratulations! You Win! Thank you for playing!\n"

#define STR_GAMEOVER "Game Over, thank you for playing!\n"

#define STR_GAMEEND "Presented by yzfy . Press ESC to exit\n"

//-------------------------------------------------------------

// Base class

class CConsoleWnd

{

public:

static int TextOut(const char*);

static int GotoXY(int, int);

static int CharOut(int, int, const int);

static int TextOut(int, int, const char*);

static int GetKey();

public:

};

//{{// class CConsoleWnd

//

// int CConsoleWnd::GetKey()

// Wait for standard input and return the KeyCode

//

int CConsoleWnd::GetKey()

{

int nkey=getch(),nk=0;

if(nkey=128||nkey==0)nk=getch();

return nk0?nkey*256+nk:nkey;

}

//

// int CConsoleWnd::GotoXY(int x, int y)

// Move cursor to (x,y)

// Only Console Application

//

int CConsoleWnd::GotoXY(int x, int y)

{

COORD cd;

cd.X = x;cd.Y = y;

return SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cd);

}

//

// int CConsoleWnd::TextOut(const char* pstr)

// Output a string at current position

//

int CConsoleWnd::TextOut(const char* pstr)

{

for(;*pstr;++pstr)putchar(*pstr);

return 0;

}

//

// int CConsoleWnd::CharOut(int x, int y, const int pstr)

// Output a char at (x,y)

//

int CConsoleWnd::CharOut(int x, int y, const int pstr)

{

GotoXY(x, y);

return putchar(pstr);

}

//

// int CConsoleWnd::TextOut(const char* pstr)

// Output a string at (x,y)

//

int CConsoleWnd::TextOut(int x, int y, const char* pstr)

{

GotoXY(x, y);

return TextOut(pstr);

}

//}}

//-------------------------------------------------------------

//Application class

class CSLGame:public CConsoleWnd

{

private:

private:

int curX,curY;

int poolWidth,poolHeight;

int bm_gamepool[GAME_MAX_HEIGHT+2][GAME_MAX_WIDTH+2];

public:

CSLGame():curX(0),curY(0){poolWidth=poolHeight=0;}

int InitPool(int, int, int);

int MoveCursor(){return CConsoleWnd::GotoXY(curX, curY);}

int DrawPool(int);

int WaitMessage();

int GetShowNum(int, int);

int TryOpen(int, int);

private:

int DFSShowNum(int, int);

private:

const static int GMARK_BOOM;

const static int GMARK_EMPTY;

const static int GMARK_MARK;

};

const int CSLGame::GMARK_BOOM = 0x10;

const int CSLGame::GMARK_EMPTY= 0x100;

const int CSLGame::GMARK_MARK = 0x200;

//{{// class CSLGame:public CConsoleWnd

//

// int CSLGame::InitPool(int Width, int Height, int nBoom)

// Initialize the game pool.

// If Width*Height = nBoom, or nBoom=0,

// or Width and Height exceed limit , then return 1

// otherwise return 0

//

int CSLGame::InitPool(int Width, int Height, int nBoom)

{

poolWidth = Width; poolHeight = Height;

if(nBoom=0 || nBoom=Width*Height

|| Width =0 || Width GAME_MAX_WIDTH

|| Height=0 || HeightGAME_MAX_HEIGHT

){

return 1;

}

// zero memory

for(int y=0; y=Height+1; ++y)

{

for(int x=0; x=Width+1; ++x)

{

bm_gamepool[y][x]=0;

}

}

// init seed

srand(time(NULL));

// init Booms

while(nBoom)

{

int x = rand()%Width + 1, y = rand()%Height + 1;

if(bm_gamepool[y][x]==0)

{

bm_gamepool[y][x] = GMARK_BOOM;

--nBoom;

}

}

// init cursor position

curX = curY = 1;

MoveCursor();

return 0;

}

//

// int CSLGame::DrawPool(int bDrawBoom = 0)

// Draw game pool to Console window

//

int CSLGame::DrawPool(int bDrawBoom = 0)

{

for(int y=1;y=poolHeight;++y)

{

CConsoleWnd::GotoXY(1, y);

for(int x=1;x=poolWidth;++x)

{

if(bm_gamepool[y][x]==0)

{

putchar('.');

}

else if(bm_gamepool[y][x]==GMARK_EMPTY)

{

putchar(' ');

}

else if(bm_gamepool[y][x]0 bm_gamepool[y][x]=8)

{

putchar('0'+bm_gamepool[y][x]);

}

else if(bDrawBoom==0 (bm_gamepool[y][x] GMARK_MARK))

{

putchar('#');

}

else if(bm_gamepool[y][x] GMARK_BOOM)

{

if(bDrawBoom)

putchar('*');

else

putchar('.');

}

}

}

return 0;

}

//

// int CSLGame::GetShowNum(int x, int y)

// return ShowNum at (x, y)

//

int CSLGame::GetShowNum(int x, int y)

{

int nCount = 0;

for(int Y=-1;Y=1;++Y)

for(int X=-1;X=1;++X)

{

if(bm_gamepool[y+Y][x+X] GMARK_BOOM)++nCount;

}

return nCount;

}

//

// int CSLGame::TryOpen(int x, int y)

// Try open (x, y) and show the number

// If there is a boom, then return EOF

//

int CSLGame::TryOpen(int x, int y)

{

int nRT = 0;

if(bm_gamepool[y][x] GMARK_BOOM)

{

nRT = EOF;

}

else

{

int nCount = GetShowNum(x,y);

if(nCount==0)

{

DFSShowNum(x, y);

}

else bm_gamepool[y][x] = nCount;

}

return nRT;

}

//

// int CSLGame::DFSShowNum(int x, int y)

// Private function, no comment

//

int CSLGame::DFSShowNum(int x, int y)

{

if((0x x=poolWidth)

(0y y=poolHeight)

(bm_gamepool[y][x]==0))

{

int nCount = GetShowNum(x, y);

if(nCount==0)

{

bm_gamepool[y][x] = GMARK_EMPTY;

for(int Y=-1;Y=1;++Y)

for(int X=-1;X=1;++X)

{

DFSShowNum(x+X,y+Y);

}

}

else bm_gamepool[y][x] = nCount;

}

return 0;

}

//

// int CSLGame::WaitMessage()

// Game loop, wait and process an input message

// return: 0: not end; 1: Win; otherwise: Lose

//

int CSLGame::WaitMessage()

{

int nKey = CConsoleWnd::GetKey();

int nRT = 0, nArrow = 0;

switch (nKey)

{

case KEY_UP:

{

if(curY1)--curY;

nArrow=1;

}break;

case KEY_DOWN:

{

if(curYpoolHeight)++curY;

nArrow=1;

}break;

case KEY_LEFT:

{

if(curX1)--curX;

nArrow=1;

}break;

case KEY_RIGHT:

{

if(curXpoolWidth)++curX;

nArrow=1;

}break;

case KEY_1:

{

nRT = TryOpen(curX, curY);

}break;

case KEY_2:

{

if((bm_gamepool[curY][curX]

~(GMARK_MARK|GMARK_BOOM))==0)

{

bm_gamepool[curY][curX] ^= GMARK_MARK;

}

}break;

case KEY_3:

{

if(bm_gamepool[curY][curX] 0xF)

{

int nb = bm_gamepool[curY][curX] 0xF;

for(int y=-1;y=1;++y)

for(int x=-1;x=1;++x)

{

if(bm_gamepool[curY+y][curX+x] GMARK_MARK)

--nb;

}

if(nb==0)

{

for(int y=-1;y=1;++y)

for(int x=-1;x=1;++x)

{

if((bm_gamepool[curY+y][curX+x]

(0xF|GMARK_MARK)) == 0)

{

nRT |= TryOpen(curX+x, curY+y);

}

}

}

}

}break;

case KEY_ESC:

{

nRT = EOF;

}break;

}

if(nKey == KEY_1 || nKey == KEY_3)

{

int y=1;

for(;y=poolHeight;++y)

{

int x=1;

for(;x=poolWidth; ++x)

{

if(bm_gamepool[y][x]==0)break;

}

if(x=poolWidth) break;

}

if(! (y=poolHeight))

{

nRT = 1;

}

}

if(nArrow==0)

{

DrawPool();

}

MoveCursor();

return nRT;

}

//}}

//-------------------------------------------------------------

//{{

//

// main function

//

int main(void)

{

int x=50, y=20, b=100,n; // define width height n_booms

CSLGame slGame;

// Init Game

{

CConsoleWnd::GotoXY(0,0);

CConsoleWnd::TextOut(STR_GAMETITLE);

slGame.InitPool(x,y,b);

slGame.DrawPool();

slGame.MoveCursor();

}

while((n=slGame.WaitMessage())==0) // Game Message Loop

;

// End of the Game

{

slGame.DrawPool(1);

CConsoleWnd::TextOut("\n");

if(n==1)

{

CConsoleWnd::TextOut(STR_GAMEWIN);

}

else

{

CConsoleWnd::TextOut(STR_GAMEOVER);

}

CConsoleWnd::TextOut(STR_GAMEEND);

}

while(CConsoleWnd::GetKey()!=KEY_ESC)

;

return 0;

}

//}}

C语言扫雷源代码 不用鼠标 操作 急求!!!

#include stdio.h

#include stdlib.h

#include time.h

#include string.h

#include conio.h

#include windows.h

#define N 3

struct mine_box {

char type; // '*'代表地雷,n代表周围有地雷的地雷数(n=0-8)

char bMarked; // 是否被标记

char bOpened; // 是否被打开

} mine_array[N][N];

int CurrentRow, CurrentCol; // 记录当前光标的位置

int openedBlank = 0; // 记录被掀开的格子数

/*将光标定位到屏幕上的某个指定位置的坐标上*/

void gotoxy(int x,int y)

{ CONSOLE_SCREEN_BUFFER_INFO csbiInfo;

HANDLE hConsoleOut;

hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);

GetConsoleScreenBufferInfo(hConsoleOut,csbiInfo);

csbiInfo.dwCursorPosition.X = x;

csbiInfo.dwCursorPosition.Y = y;

SetConsoleCursorPosition(hConsoleOut,csbiInfo.dwCursorPosition);

}

// 显示一个格子的内容

void printBox(struct mine_box mb)

{

// 格子没被掀开也没做标记

if(mb.bOpened == 0 mb.bMarked == 0)

printf("□");

// 格子被标记一次

else if(mb.bMarked == 1)

printf("√");

// 格子被标记两次

else if(mb.bMarked == 2)

printf("?");

// 格子被掀开,显示格子中的内容

else

switch(mb.type) {

// 格子中有地雷

case '*':

printf("⊕");

break;

// 格子没有地雷并且四周也没有地雷

case 0:

printf(" ");

break;

case 1:

printf("1");

break;

case 2:

printf("2");

break;

case 3:

printf("3");

break;

case 4:

printf("4");

break;

case 5:

printf("5");

break;

case 6:

printf("6");

break;

case 7:

printf("7");

break;

case 8:

printf("8");

break;

}

}

// 将光标移动到第row行第col列的格子上

void MoveTo(int row, int col)

{

CurrentRow = row;

CurrentCol = col;

gotoxy(CurrentCol*4+2,CurrentRow*2+1);

}

// 刷新屏幕

void refreshScreen(int state)

{

int i, j;

gotoxy(0, 0);

printf("┏━");

for(i = 1; i N; i++)

printf("┳━");

printf("┓\n");

for(i = 0; i N; i++) {

printf("┃");

for(j = 0; j N; j++) {

if(state == -1 mine_array[i][j].bMarked == 1 mine_array[i][j].type != '*') {

printf("¤"); // 标记错了地雷

continue;

}

if(state != 0) { // 游戏结束,将所有的盒子掀开显示其中内容

mine_array[i][j].bOpened = 1;

mine_array[i][j].bMarked = 0;

}

printBox(mine_array[i][j]);

printf("┃");

}

if(i N-1) {

printf("\n┣");

for(j = 1; j N; j++) {

printf("━╋");

}

printf("━┫\n");

}

else {

printf("\n┗");

for(j = 1; j N; j++) {

printf("━┻");

}

printf("━┛\n");

}

}

printf("按键指南:A左移,D右移,W上移,S下移,X翻开,C标记,Q退出\n");

}

void MoveUp()

{

if(CurrentRow 0) {

CurrentRow --;

MoveTo(CurrentRow, CurrentCol);

}

}

void MoveDown()

{

if(CurrentRow N-1) {

CurrentRow ++;

MoveTo(CurrentRow, CurrentCol);;

}

}

void MoveLeft()

{

if(CurrentCol 0) {

CurrentCol --;

MoveTo(CurrentRow, CurrentCol);

}

}

void MoveRight()

{

if(CurrentCol N-1) {

CurrentCol ++;

MoveTo(CurrentRow, CurrentCol);

}

}

int openMine()

{

int saveRow = CurrentRow, saveCol = CurrentCol;

if(mine_array[CurrentRow][CurrentCol].bOpened)

return 0;

mine_array[CurrentRow][CurrentCol].bOpened = 1;

mine_array[CurrentRow][CurrentCol].bMarked = 0;

if(mine_array[CurrentRow][CurrentCol].type == '*') {

refreshScreen(-1);

MoveTo(N+1, 0);

printf("失败!游戏结束)\n");

exit(2);

}

printBox(mine_array[CurrentRow][CurrentCol]);

MoveTo(CurrentRow, CurrentCol);

// 进一步要做的是当掀开一个type=0的空格子时,将其周围没有地雷的空格子自动掀开

return 1;

}

void markMine()

{

if(mine_array[CurrentRow][CurrentCol].bOpened == 1)

return;

if(mine_array[CurrentRow][CurrentCol].bMarked == 0)

mine_array[CurrentRow][CurrentCol].bMarked = 1;

else if(mine_array[CurrentRow][CurrentCol].bMarked == 1)

mine_array[CurrentRow][CurrentCol].bMarked = 2;

else if(mine_array[CurrentRow][CurrentCol].bMarked ==2)

mine_array[CurrentRow][CurrentCol].bMarked = 0;

printBox(mine_array[CurrentRow][CurrentCol]);

MoveTo(CurrentRow, CurrentCol);

}

main()

{

int num, i, j, row, col, count;

printf("输入地雷数: ");

scanf("%u", num);

if(num N*N) {

printf("地雷数超限\n");

return -1;

}

memset((void*)mine_array, 0, N*N*sizeof(struct mine_box));

//随机设置num个地雷的位置

srand((unsigned)time(NULL));

for(i=0; inum; i++) {

row = rand()%N;

col = rand()%N;

if(mine_array[row][col].type == 0)

mine_array[row][col].type = '*';

else // 已经有雷了,重新取下一个格子

i--;

}

// 计算每个非雷格子周围的地雷数

for(row=0; rowN; row++)

{

for(col = 0; col N; col++) {

if(mine_array[row][col].type == '*') {

for(i = row-1; i = row+1; i++) {

for(j = col-1; j = col+1; j++) {

if(i = 0 j = 0 i N j N mine_array[i][j].type != '*')

mine_array[i][j].type ++;

}

}

}

}

}

refreshScreen(0);

MoveTo(N/2, N/2); // 将光标移到中央的位置

do {

switch(getch()) {

case 'a':

case 'A':

MoveLeft();

break;

case 's':

case 'S':

MoveDown();

break;

case 'd':

case 'D':

MoveRight();

break;

case 'w':

case 'W':

MoveUp();

break;

case 'x':

case 'X':

if(openMine() == 1) {

if(++openedBlank == N*N-num) { //所有的空格都被掀开

refreshScreen(1);

MoveTo(N+1, 0);

printf("成功!游戏结束。\n");

exit(0);

}

}

break;

case 'c':

case 'C':

markMine();

break;

case 'q':

case 'Q':

MoveTo(N+1, 0);

printf("是否退出?(y/n)");

if(getch() == 'y')

return 0;

}

} while(1);

}

如何用C语言编程 扫雷!~

俄罗斯方快

扫雷

#includestdio.h

#includegraphics.h

#includestdlib.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=0;i=9;i++)

for(j=0;j=9;j++)

{

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=0;i=9;i++)

for(j=0;j=9;j++)

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=0;i=9;i++)

for(j=0;j=9;j++)

{

k=random(5);

if(k==2)

di[j].bomb=1;

}

}

void jisuan(void)

{

int k=0;

int i,j;

for(i=0;i=9;i++)

for(j=0;j=9;j++)

{

if(ijdi[i-1][j-1].bomb)

k=k+1;

if(idi[i-1][j].bomb)

k=k+1;

if(jdi[j-1].bomb)

k=k+1;

if(i=8di[i+1][j].bomb)

k=k+1;

if(j=8di[j+1].bomb)

k=k+1;

if(i=8j=8di[i+1][j+1].bomb)

k=k+1;

if(ij=8di[i-1][j+1].bomb)

k=k+1;

if(i=8jdi[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=0;i=9;i++)

for(j=0;j=9;j++)

{

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(currenty130)

{

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(currentx210)

{

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(currentx390)

{

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(currenty310)

{

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=0;i=9;i++)

for(j=0;j=9;j++)

if(di[j].bomb==0di[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();

}

}

C语言编简单的扫雷

给你一个完整的扫雷源码

#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 (x0 xncx)

ncx=x;

if (y0 yncy) {

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)

{

急求用c语言编写扫雷详细代码

/*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(_BX1);

}

int RightPress(void)/*鼠标右键按下*/

{

_AX=0x03;

geninterrupt(0x33);

return(_BX2);

}

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(MouseX280MouseX300MouseY65MouseY85)

{

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=0;i10;i++)/*画格子*/

for(j=0;j10;j++)

DrawEmpty(i,j,0,8);

setcolor(7);

DrawSmile();/*画脸*/

randomize();

for(i=0;i10;i++)/*100个格子随机赋值有没有地雷*/

for(j=0;j10;j++)

{

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=0;i10;i++)

for(j=0;j10;j++)

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==0j==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==0j==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==9j==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==9j==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==0Mine[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!=0Mine[i-1][j].num!=1)

ShowWhite(i-1,j);

if(i!=0j!=9Mine[i-1][j+1].num!=1)

ShowWhite(i-1,j+1);

if(j!=9Mine[i][j+1].num!=1)

ShowWhite(i,j+1);

if(j!=9i!=9Mine[i+1][j+1].num!=1)

ShowWhite(i+1,j+1);

if(i!=9Mine[i+1][j].num!=1)

ShowWhite(i+1,j);

if(i!=9j!=0Mine[i+1][j-1].num!=1)

ShowWhite(i+1,j-1);

if(j!=0Mine[i][j-1].num!=1)

ShowWhite(i,j-1);

if(i!=0j!=0Mine[i-1][j-1].num!=1)

ShowWhite(i-1,j-1);

}

void GamePlay(void)/*游戏过程*/

{

int i,j,Num;/*Num用来接收统计函数返回一个格子周围有多少地雷*/

for(i=0;i10;i++)

for(j=0;j10;j++)

Mine[i][j].roundnum=MineStatistics(i,j);/*统计每个格子周围有多少地雷*/

while(!kbhit())

{

if(LeftPress())/*鼠标左键盘按下*/

{

MouseGetXY();

if(MouseX280MouseX300MouseY65MouseY85)/*重新来*/

{

MouseOff();

gameAGAIN=1;

break;

}

if(MouseX190MouseX390MouseY90MouseY290)/*当前鼠标位置在格子范围内*/

{

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(mineNUM1)/*胜利了*/

{

GameWin();

break;

}

}

}

}

}

if(RightPress())/*鼠标右键键盘按下*/

{

MouseGetXY();

if(MouseX190MouseX390MouseY90MouseY290)/*当前鼠标位置在格子范围内*/

{

j=(MouseX-190)/20;/*x坐标*/

i=(MouseY-90)/20;/*y坐标*/

MouseOff();

if(Mine[i][j].flag==0Mine[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);

}

}

}

c扫雷源代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于扫雷数组c语言最简单代码、c扫雷源代码的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/30432.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载