C語(yǔ)言編程項(xiàng)目實(shí)戰(zhàn)《點(diǎn)燈小游戲》

這些是C/C++能做的

服務(wù)器開發(fā)工程師、人工智能、云計(jì)算工程師、信息安全(黑客反黑客)、大數(shù)據(jù) 、數(shù)據(jù)平臺(tái)、嵌入式工程師、流媒體服務(wù)器、數(shù)據(jù)控解、圖像處理、音頻視頻開發(fā)工程師、游戲服務(wù)器、分布式系統(tǒng)、游戲輔助等

C語(yǔ)言是面向過程的,而C++是面向?qū)ο蟮摹和C++的區(qū)別:

C是一個(gè)結(jié)構(gòu)化語(yǔ)言,它的重點(diǎn)在于算法和數(shù)據(jù)結(jié)構(gòu)。C程序的設(shè)計(jì)首要考慮的是如何通過一個(gè)過程,對(duì)輸入(或環(huán)境條件)進(jìn)行運(yùn)算處理得到輸出(或?qū)崿F(xiàn)過程(事務(wù))控制)。

C++,首要考慮的是如何構(gòu)造一個(gè)對(duì)象模型,讓這個(gè)模型能夠契合與之對(duì)應(yīng)的問題域,這樣就可以通過獲取對(duì)象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過程(事務(wù))控制。 所以C與C++的最大區(qū)別在于它們的用于解決問題的思想方法不一樣。之所以說C++比C更先進(jìn),是因?yàn)椤?設(shè)計(jì)這個(gè)概念已經(jīng)被融入到C++之中 ”。

C與C++的最大區(qū)別:在于它們的用于解決問題的思想方法不一樣。之所以說C++比C更先進(jìn),是因?yàn)椤?設(shè)計(jì)這個(gè)概念已經(jīng)被融入到C++之中 ”,而就語(yǔ)言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,錯(cuò)!算法是程序設(shè)計(jì)的基礎(chǔ),好的設(shè)計(jì)如果沒有好的算法,一樣不行。而且,“C加上好的設(shè)計(jì)”也能寫出非常好的東西。

今天給大家?guī)淼氖且粋€(gè)智力小游戲-《點(diǎn)燈游戲》。點(diǎn)燈游戲是一個(gè)十分有趣的智力游戲:有一行N行N列的燈,開始時(shí)全部是滅的,當(dāng)你點(diǎn)擊其中一盞燈時(shí)他的上下左右(若存在的話)狀態(tài)全部改變,現(xiàn)在要求你將全部的燈點(diǎn)亮??赡苈犉饋砗芎?jiǎn)單,當(dāng)格子逐漸增加之后,就會(huì)變得更加困難。


簡(jiǎn)單點(diǎn)來說就是通過點(diǎn)擊,讓屏幕上的黑色方塊全部編程綠色的方塊就可以通關(guān)了。

第一關(guān)很簡(jiǎn)單,下圖中只差最后一步就通關(guān)了:

小編推薦一個(gè)學(xué)C語(yǔ)言/C++的學(xué)習(xí)裙【 二六三,六八八,二七六 】,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享!

第二關(guān)就比較難了,大家可以自己玩玩.


然后看下代碼吧:

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

項(xiàng)目名稱:《點(diǎn)燈游戲》

編譯環(huán)境:VS2015 && easyx

空城老師:QQ746269529

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

#include

#include

#defineMaxNum14//單邊最大格子數(shù)

#defineG_length50//格子邊長(zhǎng)

#defineUSER_LBUTTONDOWN101

#defineUSER_RBUTTONDOWN102

#defineUSER_MBUTTONDOWN103

///////////////////////////////////////////////

void PaintGrid(int Mid_x, int Mid_y, int num, int color);// 繪制游戲格子,初始化格子

void OnLButtonDown(MOUSEMSG m, int num);// 左鍵按下

void OnRButtonDown(int num);// 右鍵按下

void welcome();// 顯示游戲主界面

void goodbye(int num);// 顯示結(jié)束畫面

void NextLevel(int num);// 下一關(guān)

int GetMessage(MOUSEMSG m);// 獲取鼠標(biāo)信息

int DispatchMessage(MOUSEMSG m, int opt);// 分發(fā)鼠標(biāo)信息

int JudgeFull(int num, int array[MaxNum][MaxNum]);// 格子是否填滿

///////////////////////////////////////////////

// 定義游戲格子結(jié)構(gòu)體

struct Grid

{

int left;// 游戲區(qū)域邊界

int right;

int top;

int bottom;

int array[MaxNum][MaxNum];// 記錄格子狀態(tài)

int num;// 記錄邊界格子數(shù)目

}grid;

///////////////////////////////////////////////

void main()

{

int opt, end = 0;

grid.num = 4;

welcome();

PaintGrid(320, 240, grid.num, RGB(0, 255, 0));

MOUSEMSG m;

while (end != 1)

{

m = GetMouseMsg();

opt = GetMessage(m);

end = DispatchMessage(m, opt);

}

goodbye(grid.num);

closegraph();

}

///////////////////////////////////////////////

// 獲取鼠標(biāo)信息

int GetMessage(MOUSEMSG m)

{

//鼠標(biāo)循環(huán)

switch (m.uMsg)

{

case WM_LBUTTONDOWN:

return USER_LBUTTONDOWN;

case WM_RBUTTONDOWN:

return USER_RBUTTONDOWN;

case WM_MBUTTONDOWN:

return USER_MBUTTONDOWN;

}

return 0;

}

///////////////////////////////////////////////

// 分發(fā)消息

int DispatchMessage(MOUSEMSG m, int opt)

{

switch (opt)

{

case USER_LBUTTONDOWN:

// 左鍵填色

OnLButtonDown(m, grid.num);

// 判斷是否填滿

if (JudgeFull(grid.num, grid.array) == 1)

{

grid.num++;

// 格子數(shù)目超過最大值通關(guān)

if (grid.num>MaxNum)

{

return 1;

break;

}

else

NextLevel(grid.num);

}

break;

case USER_RBUTTONDOWN:

// 右鍵清除

OnRButtonDown(grid.num);

break;

case USER_MBUTTONDOWN:

return 1;

break;

}

return 0;

}

///////////////////////////////////////////////

// 左鍵按下

void OnLButtonDown(MOUSEMSG m, int num)

{

int nx, ny, x, y;

if (m.x>grid.left && m.xgrid.top && m.y

{

// 計(jì)算位置

nx = (int)(m.x - grid.left) / G_length;

ny = (int)(m.y - grid.top) / G_length;

// 轉(zhuǎn)換格子狀態(tài)

grid.array[nx][ny] = -grid.array[nx][ny];

if (nx >= 0 && nx < num - 1) grid.array[nx + 1][ny] = -grid.array[nx + 1][ny];

if (nx > 0 && nx <= num - 1) grid.array[nx - 1][ny] = -grid.array[nx - 1][ny];

if (ny >= 0 && ny < num - 1) grid.array[nx][ny + 1] = -grid.array[nx][ny + 1];

if (ny > 0 && ny <= num - 1) grid.array[nx][ny - 1] = -grid.array[nx][ny - 1];

// 掃描填色

for (nx = 0; nx

for (ny = 0; ny

{

if (grid.array[nx][ny] == 1)

setfillcolor(GREEN);

else

setfillcolor(BLACK);

x = nx * G_length + grid.left;

y = ny * G_length + grid.top;

solidrectangle(x + 1, y + 1, x + G_length - 1, y + G_length - 1);

}?小編推薦一個(gè)學(xué)C語(yǔ)言/C++的學(xué)習(xí)裙【 二六三,六八八,二七六 】,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享!

}

}

///////////////////////////////////////////////

// 右鍵按下清空

void OnRButtonDown(int num)

{

int x, y, nx, ny;

for (x = 0; x

for (y = 0; y

grid.array[x][y] = -1;

for (nx = 0; nx

for (ny = 0; ny

{

setfillcolor(BLACK);

x = nx*G_length + grid.left;

y = ny*G_length + grid.top;

solidrectangle(x + 1, y + 1, x + G_length - 1, y + G_length - 1);

}

}

///////////////////////////////////////////////

// 顯示下一關(guān)

// 參數(shù):

//num:下一關(guān)的邊界格子數(shù)

void NextLevel(int num)

{

// 清屏

BeginBatchDraw();

for (int y = 0; y <= 480; y += 5)

{

setlinecolor(RGB(0, 255, 0));

settextcolor(RGB(0, 255, 0));

line(0, y, 640, y);

line(0, 480 - y, 640, 480 - y);

outtextxy(300, y, L"下一關(guān)");

FlushBatchDraw();

Sleep(16);

setfillcolor(BLACK);

solidrectangle(0, y + 4, 640, y - 5);

solidrectangle(0, 480 - y, 640, 480 - y + 5);

}

EndBatchDraw();

// 繪制下一關(guān)格子

PaintGrid(320, 240, num, RGB(0, 255, 0));

}

///////////////////////////////////////////////

// 判斷格子是否填滿

// 參數(shù):

//num:單邊格子數(shù)目

//array:生成數(shù)組接收實(shí)參

int JudgeFull(int num, int array[MaxNum][MaxNum])

{

int c = -1;

int nx = 0, ny = 0;

while (nx

{

for (nx = 0; nx

for (ny = 0; ny

if (array[nx][ny] == 1)

continue;

else

return c;

}

c = 1;

return c;

}

///////////////////////////////////////////////

// 繪制游戲格子,初始化格子

// 參數(shù):

//Mid_x:屏幕中心 x 坐標(biāo)

//Mid_y:屏幕中心 y 坐標(biāo)

//num:單邊格子數(shù)目

//color:格子線條顏色

void PaintGrid(int Mid_x, int Mid_y, int num, int color)

{

int x, y, nx, ny;

// 游戲區(qū)域大小

grid.left = Mid_x - num*G_length / 2;

grid.right = Mid_x + num*G_length / 2;

grid.top = Mid_y - num*G_length / 2;

grid.bottom = Mid_y + num*G_length / 2;

// 繪制格子

setlinecolor(color);

for (x = grid.left; x <= grid.right; x += G_length)

{

line(x, grid.top, x, grid.bottom);

Sleep(10);

}

for (y = grid.top; y <= grid.bottom; y += G_length)

{

line(grid.left, y, grid.right, y);

Sleep(10);

}

// 外邊框

for (x = 20; x>10; x--)

{

line(grid.left - x, grid.top - x, grid.right + x, grid.top - x);

line(grid.left - x, grid.bottom + x, grid.right + x, grid.bottom + x);

line(grid.left - x, grid.top - x, grid.left - x, grid.bottom + x);

line(grid.right + x, grid.top - x, grid.right + x, grid.bottom + x);

Sleep(5);

}

// 清空單元格

for (x = 0; x

for (y = 0; y

grid.array[x][y] = -1;

for (nx = 0; nx

for (ny = 0; ny

{

setfillcolor(BLACK);

x = nx * G_length + grid.left;

y = ny * G_length + grid.top;

solidrectangle(x + 1, y + 1, x + G_length - 1, y + G_length - 1);

}

}

///////////////////////////////////////////////

// 顯示游戲主界面

void welcome()

{

// 初始化窗口

initgraph(640, 480);

// 輸出屏幕提示

cleardevice();

settextcolor(RGB(0, 255, 0));

settextstyle(64, 0, L"華文彩云");

outtextxy(70, 50, L"點(diǎn)燈游戲");

settextcolor(YELLOW);

settextstyle(16, 0, L"華文彩云");

outtextxy(100, 200, L"每點(diǎn)一個(gè)格子,上下左右的格子也會(huì)做出于現(xiàn)狀相反的動(dòng)作");

outtextxy(100, 240, L"總共11關(guān),左鍵填色,右鍵重來,中鍵退出");

settextstyle(16, 0, L"華文彩云");

// 實(shí)現(xiàn)閃爍的"按任意鍵繼續(xù)"

int c = 255;

while (!_kbhit())

{

settextcolor(RGB(0, c, 0));

outtextxy(280, 400, L"按任意鍵繼續(xù)");

c -= 8;

if (c < 0) c = 255;

Sleep(20);

}

_getch();

cleardevice();

}

///////////////////////////////////////////////

// 顯示結(jié)束畫面

void goodbye(int num)

{

int c = 255;

// 清屏

BeginBatchDraw();

for (int y = 0; y <= 480; y += 5)

{

setlinecolor(RGB(0, 255, 0));

line(0, y, 640, y);

line(0, 480 - y, 640, 480 - y);

FlushBatchDraw();

Sleep(16);

setfillcolor(BLACK);

solidrectangle(0, y + 4, 640, y - 5);

solidrectangle(0, 480 - y, 640, 480 - y + 5);

}

EndBatchDraw();

//判斷顯示文字

if (num == MaxNum + 1)

{

settextcolor(RGB(0, c, 0));

settextstyle(48, 0, L"華文彩云");

outtextxy(280, 200, L"通關(guān)");

settextstyle(20, 0, L"華文彩云");

}

else

{

settextcolor(RGB(0, c, 0));

settextstyle(48, 0, L"華文彩云");

outtextxy(200, 200, L"再接再厲");

settextstyle(20, 0, L"華文彩云");

}小編推薦一個(gè)學(xué)C語(yǔ)言/C++的學(xué)習(xí)裙【 二六三,六八八,二七六 】,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享!

while (!_kbhit())

{

settextcolor(RGB(0, c, 0));

c -= 8;

if (c < 0) c = 255;

Sleep(20);

}

_getch();

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容