C语言零基础项目:涂格子(点灯)游戏!详细思路+源码分享

每天一个c语言小项目,提升自己的编程能力!
点灯游戏是一个十分有趣的智力游戏:有一行n行n列的灯,开始时全部是灭的,当你点击其中一盏灯时他的上下左右(若存在的话)状态全部改变,现在要求你在限定的时间内以最少地步数,将全部的灯点亮。
例如一开始有5×5共25盏灯,都处于关的状态,现在要想办法把25盏灯全打开,每次只能开/关一盏灯,但由于电路原因,和它相邻的四盏灯也会改变开/关状态,于是想把25盏灯全打开就有一定难度。
(本期代码有两个版本)
编译环境:visual c++ 6.0 / vs2019/2022,easyx插件
代码版本一:
#include #include #define maxnum 14 //单边最大格子数#define g_length 30 //格子边长#define user_lbuttondown 101#define user_rbuttondown 102#define user_mbuttondown 103///////////////////////////////////////////////void paintgrid(int mid_x, int mid_y, int num, int color); // 绘制游戏格子,初始化格子void onlbuttondown(mousemsg m, int num); // 左键按下void onrbuttondown(int num); // 右键按下void onmbuttondown(); // 中键按下*暂无定义*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= 0 && nx 0 && nx = 0 && ny 0 && ny <= num-1) grid.array[nx][ny-1] = -grid.array[nx][ny-1]; // 扫描填色 for(nx=0; nx 代码版本二:
#include#include//easyx图形库#include#include//包含躲媒体1设备接口头文件#pragma comment(lib,winmm.lib)#define win_width 640#define win_height 480#define grid_width 30//格子宽度#define grid_num 4//每一行格子的数量struct grid //格子结构,结构体,类首字母大写{ int top;//上面一条线的y int down; int left; int right; int foot;//玩家走了多少步 int map[grid_num][grid_num]; int x;//保存鼠标点击的数组下标 int y;}grid;mousemsg msg;//int a=0;image img;//保存背景图片//欢迎界面void welcome(){ /* 错误 1 error c2665: “loadimage”: 2 个重载中没有一个可以转换所有参数类型 什么问题?字符集问题1,在字符串前面加上l 2,在字符串前面加上_t(str) 推荐 3,修改项目字符集属性 */ mcisendstring(open ./森林幻想曲.mp3 alias bgm,0,0,0);//向多媒体设备接口发送一个字符串 mcisendstring(play bgm repeat, 0, 0, 0);//重复播放音乐 //sleep(10000); //mcisendstring(close bgm, 0, 0, 0);//关闭音乐 loadimage(&img, ./bk.jpg, win_width, win_height);//加载图片 putimage(0, 0, &img); setbkmode(transparent);//设置文字背景颜色透明 settextcolor(green); settextstyle(50, 0, 楷体);//设置字体大小,类型 char str[] = 涂格子游戏(点灯游戏); int twidth = textwidth(str)/2;//让文字居中显示 outtextxy(win_width / 2 - twidth, 20, str); while (!_kbhit())//如果没有按键就一直循环 { settextcolor(rgb(rand() % 256, rand() % 256,rand() % 256)); outtextxy(180, 300, 按任意键继续...); sleep(300); } _getch();//等待按键,没有按键,就一直等待}//初始化数据void gameinit(){ grid.top = win_height / 2 - grid_num*grid_width / 2;//获取上面的y坐标 grid.down = win_height / 2 + grid_num*grid_width / 2;//获取下面的y坐标 //理解不? grid.left = win_width / 2 - grid_num*grid_width / 2; grid.right = win_width / 2 + grid_num*grid_width / 2; grid.foot = 0; //双重循环初始化二维数组 for (int i = 0; i < grid_num; i++) { for (int k = 0; k < grid_num; k++) { grid.map[i][k] = 1;//黑色为1,绿色为-1 } }}//把数据通过图形界面的方式展示出来void gamedraw(){ cleardevice(); putimage(0, 0, &img); //绘制格子 setlinecolor(rgb(0, 200, 0)); //循环绘制格子线条 for (int x = grid.left; x <= grid.right; x+=grid_width) { line(x, grid.top, x, grid.down);//画竖线 } for (int y = grid.top; y 10; x--) { line(grid.left - x, grid.top - x, grid.right + x, grid.top - x); line(grid.left - x, grid.down + x, grid.right + x, grid.down + x); line(grid.left - x, grid.top - x, grid.left - x, grid.down + x); line(grid.right + x, grid.top - x, grid.right + x, grid.down + x); } grid.map[2][2] = -1; //填充游戏格子为黑色 int x, y; for (int i = 0; i grid.down) { grid.y = (msg.x - grid.left) / grid_width; grid.x = (msg.y - grid.top) / grid_width; grid.map[grid.x][grid.y] = -grid.map[grid.x][grid.y];//改变颜色 if (grid.x >= 0 && grid.x 0 && grid.x = 0 && grid.y = 0 && grid.y <= grid_num - 1) { grid.map[grid.x][grid.y-1] = -grid.map[grid.x][grid.y-1]; } } }}int main(){ initgraph(win_width, win_height); welcome(); gameinit(); beginbatchdraw(); while (1) { gamedraw(); flushbatchdraw(); gamecontrol(); } return 0;}  
大家赶紧去动手试试吧!


空间受限型应用中的PMBus热插拔电路介绍
三星芯片工厂断电,第一季度DRAM不会价格上涨
高通已经向华为重启供货并加速推动全球5G部署
硕博电子工程机械控制器:宇通重工电动装载机的智慧引擎
一种用于同步磁阻牵引电机的新型取向钢叠片转子铁心
C语言零基础项目:涂格子(点灯)游戏!详细思路+源码分享
7个摄像头+前置雷达+激光雷达,为何还出现Uber自动驾驶事故!
Facebook又一次推出了两款全新的Oculus VR设备
iPhone11销量惨淡 苹果手机或成第二个三星
双边与开关电源电子电路设计图
美国三院院士图灵奖得主Manuel Blum: 如何为机器赋予意识?
自动驾驶芯片市场的巨大潜力吸引一大批玩家入局
台湾新商机应无线网络兴起而发掘
远距离4G无线广播音柱 离线广播音柱
焊盘焊接0.1平方的导线出现断裂原因
动力电池“退役潮”今年将开始爆发 将经历怎样的考验?
智能家居创新对物联网状态意味着什么?
中国广电携手中兴通讯建设低频频段5G网络,加速推动低频5G产业链成熟
微软IoT使用现状研究报告发布
刷bios失败会怎么样_刷bios失败怎么自救