C語言是面向過程的,而C++是面向?qū)ο蟮?/p>
C和C++的區(qū)別:
C是一個結(jié)構(gòu)化語言雏胃,它的重點在于算法和數(shù)據(jù)結(jié)構(gòu)请毛。C程序的設(shè)計首要考慮的是如何通過一個過程,對輸入(或環(huán)境條件)進行運算處理得到輸出(或?qū)崿F(xiàn)過程(事務(wù))控制)丑掺。
C++获印,首要考慮的是如何構(gòu)造一個對象模型,讓這個模型能夠契合與之對應(yīng)的問題域街州,這樣就可以通過獲取對象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過程(事務(wù))控制兼丰。 所以C與C++的最大區(qū)別在于它們的用于解決問題的思想方法不一樣。之所以說C++比C更先進唆缴,是因為“ 設(shè)計這個概念已經(jīng)被融入到C++之中 ”鳍征。
C與C++的最大區(qū)別:在于它們的用于解決問題的思想方法不一樣。之所以說C++比C更先進面徽,是因為“ 設(shè)計這個概念已經(jīng)被融入到C++之中 ”艳丛,而就語言本身而言,在C中更多的是算法的概念趟紊。那么是不是C就不重要了氮双,錯!算法是程序設(shè)計的基礎(chǔ)霎匈,好的設(shè)計如果沒有好的算法戴差,一樣不行。而且铛嘱,“C加上好的設(shè)計”也能寫出非常好的東西暖释。
一直說寫個幾百行的小項目袭厂,于是我寫了一個控制臺的掃雷,沒有想到精簡完了代碼才200行左右球匕,不過考慮到這是我精簡過后的纹磺,濃縮才是精華嘛,我就發(fā)出來大家一起學習啦亮曹,看到程序跑起來能玩橄杨,感覺還是蠻有成就感的~哈哈
掃雷應(yīng)該屬于一款大眾游戲,從我初中使用計算機開始乾忱,它就被集成到了windows系統(tǒng)中讥珍,雖然他是這么經(jīng)典,我還是要介紹一下他的玩法窄瘟,然后再考慮在控制臺中怎么實現(xiàn)它衷佃。
小編推薦一個學C語言/C++的學習裙【 六九九,四七零蹄葱,五九六 】氏义,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學習图云!裙內(nèi)有開發(fā)工具惯悠,很多干貨和技術(shù)資料分享!
1 游戲的主界面竣况,是一個一個小方格克婶,在小方格上單擊左鍵,可以翻開小方格看看后面有什么丹泉。
2 在這些小方格的背后隱藏著雷情萤,如果不幸點中了雷,那么就GameOver了摹恨。
2 如果點中的不是一個雷筋岛,那么就是一塊空地,這個時候會出現(xiàn)兩種情況:
1)用鼠標點中的空地周圍八個點內(nèi)有雷晒哄,那么就顯示雷的個數(shù)
2)用鼠標點中的空地周圍沒有雷睁宰,這個時候就將周圍的空地全部顯示出來,遇到該顯示數(shù)字的空地寝凌,就將數(shù)字顯示出來柒傻。(仔細觀察你會發(fā)現(xiàn),數(shù)字會將空地圍起來较木,這是一句廢話诅愚,但是也值得想一想這是為什么)
3 在小方格上,點擊鼠標的右鍵,可以將一個空地標記為雷违孝,當然這個功能只是為了方便你記憶你之前確定是雷的地方。(還有左右鍵都點泳赋,和點擊右鍵出現(xiàn)雌桑?標記,這里就不談啦)
4 當空地上剩余的格子數(shù)和雷的個數(shù)一樣多祖今,那么這個時候就應(yīng)該算是勝利啦校坑。
OK~游戲流程說完了,這個時候該談?wù)勅绾螌崿F(xiàn)了千诬。
1 首先需要一張地圖耍目,一般情況下我們都可以用一個二維數(shù)組表示一個地圖,每一個元素代表著掃雷中的一個小方格徐绑。相應(yīng)元素存儲0邪驮,那么地圖上的這個位置就是空地,相應(yīng)元素存儲1傲茄,那么就代表這個位置就一顆雷毅访。
2 在控制臺上依照二維數(shù)組長度和寬度,打印相應(yīng)的小方塊盘榨。
3 然后就用鼠標點擊那些小方塊喻粹,對于控制臺來講,在黑框框的區(qū)域中是有坐標的草巡,可以使用一些函數(shù)捕獲到你點擊了屏幕的哪一個坐標守呜。
4 對于控制臺來說,打印一個字符山憨,有的字符橫向占一個位置比如普通的字母數(shù)字查乒,有的字符橫向占兩個位置比如一些圖形字符: ①②③■◆等等,這點在控制臺編程的時候要注意。
5 當點擊屏幕的時候,獲取到點擊的坐標后,去二維數(shù)組中查看相應(yīng)的位置是雷還是空地,從而做相應(yīng)的處理萍歉。
1)假如點擊到了雷侣颂,那么就控制游戲結(jié)束
2)假如點擊到了空地有兩種情況
1)點擊的空地周圍有雷,那么就將雷的個數(shù)顯示出來
2)假如點擊的空地周圍沒有雷枪孩,那么就使用遞歸的方法去探測周圍的點憔晒,探測出與其相連的所有周圍有雷的點。
這個是我實現(xiàn)的效果:
下面就是代碼啦:
// saolei.cpp : 定義控制臺應(yīng)用程序的入口點蔑舞。
//
#include "stdafx.h"
#include
#include
#include
#define Boom 10
int a[10][10] = {0};
COORD TempPos[100] ={0};
int nSign = 0;
/************************************
函數(shù)名 : WriteWchar
函數(shù)作用: 在控制臺相應(yīng)的坐標上顯示一串字符
返回值 : void
參數(shù) : int x 橫坐標
參數(shù) : int y 縱坐標
參數(shù) : 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);
}
/************************************
函數(shù)名 : DrawNumber
函數(shù)作用: 在相應(yīng)的坐標上拒担,根據(jù)傳入的數(shù)字,打印相應(yīng)的數(shù)字字符
返回值 : void
參數(shù) : COORD pos 要打印的位置
參數(shù) : int nNumber 要打印的數(shù)字
說明 :
************************************/
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;
}
}
/************************************
函數(shù)名 : GetNumber
函數(shù)作用: 獲取一個點的四周有幾顆雷
返回值 : int
參數(shù) : 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;
}
/************************************
函數(shù)名 : Drawmap
函數(shù)作用: 打印一下地圖
返回值 : void
說明 :
************************************/
void Drawmap()
{
for (int i =0;i<10;i++)
{
for (int j =0;j<10;j++)
{
WriteWchar(j,i,"■");
}
}
}
小編推薦一個學C語言/C++的學習裙【 六九九攻询,四七零从撼,五九六 】,無論你是大牛還是小白钧栖,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學習低零!裙內(nèi)有開發(fā)工具婆翔,很多干貨和技術(shù)資料分享!
/************************************
函數(shù)名 : Init
函數(shù)作用: 隨機生成10個地雷掏婶,然后存到數(shù)組中
返回值 : void
說明 :
************************************/
void Init()
{
srand(time(NULL));
for (int i =0;i<10;i++)
{
int Temp_x = rand()%10;
int Temp_y = rand()%10;
//判斷這個地方是不是已經(jīng)生成一個雷了啃奴,如果沒有,賦值為雷
if (a[Temp_x][Temp_y]!=Boom)
{
a[Temp_x][Temp_y] = Boom;
}
//如果是雷雄妥,就相當于本次生成沒有發(fā)生過最蕾。。老厌。瘟则。。
else
{
i--;
}
}
Drawmap();
}
/************************************
函數(shù)名 : IsClose
函數(shù)作用: 判斷是不是已經(jīng)探測過的點枝秤,由于使用的8方向遞歸的探測醋拧,這樣避免重復(fù)
返回值 : bool
參數(shù) : 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;
}
/************************************
函數(shù)名 : IsKongdi
函數(shù)作用: 判斷一個點是空地,還是雷宿百,如果是空地趁仙,需要做其他處理
返回值 : void
參數(shù) : COORD pos
說明 :
************************************/
bool IsKongdi(COORD pos)
{
int nNumber = 0;
//1 如果是雷,就直接返回一個false說明要掛了
if (a[pos.Y][pos.X] == Boom)
{
return false;
}
//2 如果不是雷垦页,那么就做后續(xù)處理
else
{
//2.1先判斷一下周圍有幾顆雷
nNumber = GetNumber(pos);
if (nNumber!=0){
//有幾顆雷雀费,就打印這個數(shù)字
DrawNumber(pos,nNumber);
return true;
}
else
{
//如果沒有雷,那就先畫空地出來痊焊,然后向周圍擴散去探測其他點
WriteWchar(pos.X,pos.Y," ");
}
}
//2.2點到了空地盏袄,但是周圍沒有雷的情況的處理,繼續(xù)去探測周圍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;
//這個點是不是已經(jīng)探測過了
if (IsClose(posTemp))
continue;
//這個點沒有探測過薄啥,就將其加入到數(shù)組中辕羽,然后使其在以后的探測中,存入
TempPos[nSign++] =posTemp;
IsKongdi(posTemp);
}
return true;
}
/************************************
函數(shù)名 : GetMousePosition
函數(shù)作用: 獲取鼠標點擊的位置垄惧,假如沒有獲取到刁愿,就返回(-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)
{
//如果鼠標點擊的位置被探測過了,就開始下一次循環(huán)
if (IsClose(pos))
{
continue;
}
TempPos[nSign++] =pos;
bool bIskongdi = IsKongdi(pos);
//點到雷了到逊,就直接退出游戲了铣口。
if (false ==bIskongdi)
{
system("cls");
WriteWchar(20,10,"you lose");
getchar();
break;
}
//檢測是不是贏了,贏的條件就是沒有被探測的點的個數(shù)和雷的個數(shù)相等
if (nSign ==90)
{
system("cls");
WriteWchar(20,10,"you win");
}
}
}
return 0;
}
小編推薦一個學C語言/C++的學習裙【 六九九觉壶,四七零脑题,五九六 】,無論你是大牛還是小白铜靶,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學習叔遂!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享!
這些是C/C++能做的
服務(wù)器開發(fā)工程師已艰、人工智能痊末、云計算工程師、信息安全(黑客反黑客)哩掺、大數(shù)據(jù) 舌胶、數(shù)據(jù)平臺、嵌入式工程師疮丛、流媒體服務(wù)器、數(shù)據(jù)控解辆它、圖像處理誊薄、音頻視頻開發(fā)工程師、游戲服務(wù)器锰茉、分布式系統(tǒng)呢蔫、游戲輔助等
項目不是很長,但是注釋我寫的還算明白飒筑,估計大家都可以看得懂片吊,希望對于新手們有一定的幫助,最后协屡,謝謝大家的支持G渭埂!肤晓!