C语言编程项目实战《点灯小游戏》

这些是C/C++能做的

服务器开发工程师、人工智能、云计算工程师、信息安全(黑客反黑客)、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等

C语言是面向过程的,而C++是面向对象的。C和C++的区别:

C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。

C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。

C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。

今天给大家带来的是一个智力小游戏-《点灯游戏》。点灯游戏是一个十分有趣的智力游戏:有一行N行N列的灯,开始时全部是灭的,当你点击其中一盏灯时他的上下左右(若存在的话)状态全部改变,现在要求你将全部的灯点亮。可能听起来很简单,当格子逐渐增加之后,就会变得更加困难。


简单点来说就是通过点击,让屏幕上的黑色方块全部编程绿色的方块就可以通关了。

第一关很简单,下图中只差最后一步就通关了:

小编推荐一个学C语言/C++的学习裙【 二六三,六八八,二七六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

第二关就比较难了,大家可以自己玩玩.


然后看下代码吧:

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

项目名称:《点灯游戏》

编译环境:VS2015 && easyx

空城老师:QQ746269529

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

#include

#include

#defineMaxNum14//单边最大格子数

#defineG_length50//格子边长

#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);// 显示结束画面

void NextLevel(int num);// 下一关

int GetMessage(MOUSEMSG m);// 获取鼠标信息

int DispatchMessage(MOUSEMSG m, int opt);// 分发鼠标信息

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

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

// 定义游戏格子结构体

struct Grid

{

int left;// 游戏区域边界

int right;

int top;

int bottom;

int array[MaxNum][MaxNum];// 记录格子状态

int num;// 记录边界格子数目

}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();

}

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

// 获取鼠标信息

int GetMessage(MOUSEMSG m)

{

//鼠标循环

switch (m.uMsg)

{

case WM_LBUTTONDOWN:

return USER_LBUTTONDOWN;

case WM_RBUTTONDOWN:

return USER_RBUTTONDOWN;

case WM_MBUTTONDOWN:

return USER_MBUTTONDOWN;

}

return 0;

}

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

// 分发消息

int DispatchMessage(MOUSEMSG m, int opt)

{

switch (opt)

{

case USER_LBUTTONDOWN:

// 左键填色

OnLButtonDown(m, grid.num);

// 判断是否填满

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

{

grid.num++;

// 格子数目超过最大值通关

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

{

// 计算位置

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

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

// 转换格子状态

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);

} 小编推荐一个学C语言/C++的学习裙【 二六三,六八八,二七六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

}

}

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

// 右键按下清空

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);

}

}

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

// 显示下一关

// 参数:

//num:下一关的边界格子数

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"下一关");

FlushBatchDraw();

Sleep(16);

setfillcolor(BLACK);

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

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

}

EndBatchDraw();

// 绘制下一关格子

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

}

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

// 判断格子是否填满

// 参数:

//num:单边格子数目

//array:生成数组接收实参

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;

}

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

// 绘制游戏格子,初始化格子

// 参数:

//Mid_x:屏幕中心 x 坐标

//Mid_y:屏幕中心 y 坐标

//num:单边格子数目

//color:格子线条颜色

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

{

int x, y, nx, ny;

// 游戏区域大小

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"点灯游戏");

settextcolor(YELLOW);

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

outtextxy(100, 200, L"每点一个格子,上下左右的格子也会做出于现状相反的动作");

outtextxy(100, 240, L"总共11关,左键填色,右键重来,中键退出");

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

// 实现闪烁的"按任意键继续"

int c = 255;

while (!_kbhit())

{

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

outtextxy(280, 400, L"按任意键继续");

c -= 8;

if (c < 0) c = 255;

Sleep(20);

}

_getch();

cleardevice();

}

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

// 显示结束画面

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"通关");

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

}

else

{

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

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

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

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

}小编推荐一个学C语言/C++的学习裙【 二六三,六八八,二七六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

while (!_kbhit())

{

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

c -= 8;

if (c < 0) c = 255;

Sleep(20);

}

_getch();

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容