有关C语言编程学习,第一只稍类,打之扫雷游戏

一直游说写单几百履的多少品种,于是我形容了一个控制台的扫雷,没有想到精简了了代码才200行左右,不过考虑到当下是自简单后底,浓缩才是精华嘛,我就算发生来大家齐声念书啦,看到程序走起能打,感觉要蛮有成就感的~哈哈

扫雷应该属于一款群众游戏,从自初中使用电脑开始,它就深受合并到了windows系统中,虽然他是这么经典,我还是如介绍一下客的玩法,然后重新考虑以控制台中怎么落实它。

C/C++学习群:315732400

1
游戏的主界面,是一个一个小方格,在小方格上单击左键,可以查阅小方格看看后面有什么。

2 在这些小方格的私自暗藏在雷,如果不幸点中了雷霆,那么就算GameOver了。

2 如果点中的非是一个雷,那么就是平片空地,这个时候会并发零星种状况:

1)用鼠标点着之空地周围八个点内出雷,那么尽管显示雷的个数

2)用鼠标点吃的空地周围没有雷,这个时就是拿周围的空地一体著出来,遇到拖欠显示数字之空地,就以数字显示出来。(仔细察看您晤面意识,数字会将空地围起来,这是千篇一律句废话,但是呢值得纪念同一想立马是胡)

3
在小方格上,点击鼠标的右键,可以用一个空地记为雷,当然是职能只是为着便于而记忆而前面确定是雷的地方。(还有左右键都接触,和点击右键出现?标记,这里虽无言啦)

4 当空地上剩余的格子数和雷之个数一样多,那么这个时候就该算是赢呀。

OK~游戏流程说得了了,这个时刻该谈谈如何促成了。

1
首先要一致张地图,一般情形下我们且足以为此一个二维数组表示一个地形图,每一个素代表正在扫雷中的一个略方格。相应元素存储0,那么地图及之这个岗位就是是空地,相应元素存储1,那么即便意味着是职位就是同样发雷。

2 在控制台上按照二维数组长度及幅度,打印相应的小方块。

3
然后便就此鼠标点击那些小方块,对于控制台来讲,在黑框框的区域受到凡起坐标的,可以运用有函数捕获到公点击了屏幕的啊一个坐标。

4
对于控制台来说,打印一个字符,有的字符横向占一个职务比如一般的字母数字,有的字符横向占少数单职位比如有些图字符:
①②③■◆等等,这点于控制台编程的下如果小心。

5
当点击屏幕的时候,获取到点击的坐标后,去二维数组中查相应的职是霆还是空地,从而做相应的拍卖。

1)假如点击到了雷,那么尽管决定打了

2)假如点击到了空地有半点种植状态

1)点击的空地周围发出雷,那么就算将雷之个数显示出来

2)假如点击的空地周围没有雷,那么即使以递归的计去探测周围的点,探测有与该不断的具备周围有雷的触及。

以此是我实现之作用:

脚就是代码啦:

// saolei.cpp : 定义控制台应用程序的入口点。

//

#include “stdafx.h”

#include

#include

#include

#define Boom 10

int a[10][10] = {0};

COORD TempPos[100] ={0};

int nSign = 0;

/************************************

函数名 : WriteWchar

函数作用: 在控制台相应的坐标上亮平串字符

返回值 : void

参数 : int x 横坐标

参数 : int y 纵坐标

参数 : char szString[] 要显的字符串

说明 :

************************************/

void WriteWchar(int x,int y,char szString[])

{

HANDLE hOut= GetStdHandle(STD_OUTPUT_HANDLE);

COORD pos = {x*2,y};

SetConsoleCursorPosition(hOut,pos);

printf(“%s”,szString);

}

/************************************

函数名 : DrawNumber

函数作用: 在相应的坐标上,根据传入的数字,打印相应的数字字符

返回值 : void

参数 : COORD pos 要打印的职务

参数 : int nNumber 要打印的数字

说明 :

************************************/

void DrawNumber(COORD pos,int nNumber)

{

switch (nNumber)

{

case 1:

WriteWchar(pos.X,pos.Y,”①”);

break;

case 2:

WriteWchar(pos.X,pos.Y,”②”);

break;

case 3:

WriteWchar(pos.X,pos.Y,”③”);

break;

case 4:

WriteWchar(pos.X,pos.Y,”④”);

break;

case 5:

WriteWchar(pos.X,pos.Y,”⑤”);

break;

case 6:

WriteWchar(pos.X,pos.Y,”⑥”);

break;

case 7:

WriteWchar(pos.X,pos.Y,”⑦”);

break;

case 8:

WriteWchar(pos.X,pos.Y,”⑧”);

break;

default:

break;

}

}

/************************************

函数名 : GetNumber

函数作用: 获取一个点之四周有几粒雷

返回值 : int

参数 : COORD pos 要探测的触发之坐标

说明 :

************************************/

int GetNumber(COORD pos)

{

int nCount = 0;

for(int i = pos.X-1;i<=pos.X+1;i++)

for (int j = pos.Y-1;j<=pos.Y+1;j++)

{

if (a[j][i] == Boom)

{

nCount++;

}

}

return nCount;

}

/************************************

函数名 : Drawmap

函数作用: 打印一下地图

返回值 : void

说明 :

************************************/

void Drawmap()

{

for (int i =0;i<10;i++)

{

for (int j =0;j<10;j++)

{

WriteWchar(j,i,”■”);

}

}

}

/************************************

函数名 : Init

函数作用: 随机生成10独地雷,然后存到数组中

返回值 : void

说明 :

************************************/

void Init()

{

srand(time(NULL));

for (int i =0;i<10;i++)

{

int Temp_x = rand()%10;

int Temp_y = rand()%10;

//判断是地方是无是已变更一个雷了,如果没,赋值为雷

if (a[Temp_x][Temp_y]!=Boom)

{

a[Temp_x][Temp_y] = Boom;

}

//如果是霆,就相当给此次生成没有生了。。。。。

else

{

i–;

}

}

Drawmap();

}

/************************************

函数名 : IsClose

函数作用:
判断是无是已经探测过的点,由于下的8方向递归的探测,这样避免再

返回值 : bool

参数 : COORD posTemp

说明 :

************************************/

bool IsClose(COORD posTemp)

{

for (int i =0;i

{

if(TempPos[i].X == posTemp.X&&TempPos[i].Y == posTemp.Y)

return true;

}

return false;

}

/************************************

函数名 : IsKongdi

函数作用: 判断一个点是空地,还是雷,如果是空地,需要举行另外处理

返回值 : void

参数 : COORD pos

说明 :

************************************/

bool IsKongdi(COORD pos)

{

int nNumber = 0;

//1 如果是霆,就直接返回一个false说明要挂了

if (a[pos.Y][pos.X] == Boom)

{

return false;

}

//2 如果无是雷,那么就是做持续处理

else

{

//2.1预判断一下四周有几发雷

nNumber = GetNumber(pos);

if (nNumber!=0){

//有几乎颗雷,就打印是数字

DrawNumber(pos,nNumber);

return true;

}

else

{

//如果无雷,那即便先画空地出,然后朝周围扩散去探测其它接触

WriteWchar(pos.X,pos.Y,” “);

}

}

//2.2接触到了空地,但是周围没有雷之情形的拍卖,继续去探测周围8个点

for(int i = -1;i<=1;i++)

for (int j = -1;j<=1;j++)

{

COORD posTemp = {pos.X+i,pos.Y+j};

//是免是越界了

if
(i==0&&j==0||posTemp.X==-1||posTemp.Y==-1||posTemp.X==10||posTemp.Y==10)

continue;

//这个点是不是曾探测过了

if (IsClose(posTemp))

continue;

//这个点并未探测过,就以那入到数组中,然后使其当事后的探测中,存入

TempPos[nSign++] =posTemp;

IsKongdi(posTemp);

}

return true;

}

/************************************

函数名 : GetMousePosition

函数作用: 获取鼠标点击的职位,假如尚未到手到,就回来(-1,-1)

回来值 : COORD 鼠标点击的坐标

说明 :

************************************/

COORD GetMousePosition()

{

HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);

INPUT_RECORD stcInput = {0};

DWORD buffer;

COORD pos = {-1,-1};

ReadConsoleInput(hIn,&stcInput,1,&buffer);

if (stcInput.EventType == MOUSE_EVENT)

{

MOUSE_EVENT_RECORD stcMouseEnent = stcInput.Event.MouseEvent;

if (stcMouseEnent.dwButtonState ==FROM_LEFT_1ST_BUTTON_PRESSED )

{

pos = stcMouseEnent.dwMousePosition;

pos.X/=2;

}

}

return pos;

}

int _tmain(int argc, _TCHAR* argv[])

{

Init();

COORD pos;

//开始打

while(1)

{

//获取鼠标点击位置

pos = GetMousePosition();

if (pos.X!=-1)

{

//如果鼠标点击的位置让探测过了,就起产一样涂鸦巡回

if (IsClose(pos))

{

continue;

}

TempPos[nSign++] =pos;

bool bIskongdi = IsKongdi(pos);

//点至雷了,就径直退出游戏了。

if (false ==bIskongdi)

{

system(“cls”);

WriteWchar(20,10,”you lose”);

getchar();

break;

}

//检测是休是胜利了,赢的条件就没有叫探测的触及的个数和雷的个数等

if (nSign ==90)

{

system(“cls”);

WriteWchar(20,10,”you win”);

}

}

}

return 0;