序言
一提到开发游戏,很多人都会觉得要很高深的技术,有一种望尘莫及的感觉。其实要编一款小游戏也没有想象的那么难,下面跟着小编一起来看看C语言是如何一步步制作游戏的。
本文的代码下载地址在文章末尾,有需要的同学自取。
《点灯游戏》是一款益智小游戏,游戏的规则十分简单,是时下一款简单易上手的数字小游戏,但又十分虐心。
编译环境:
vs 2019+easyx2019
刚开始学习C语言或者没接触过easyx的伙伴,拿到代码之后肯定有很多的错误,这就是所谓的给了源码也不能运行,所以配置环境和查看报错也是作为编程学习者,必须要掌握的技能。
游戏规则:
只需要点击一个格子,然后以点击的格子为十字中心,周围的格子的状态会发生改变(只有两种状态,亮,灭),你需要把全部的格子点亮,就能赢得游戏的胜利。
开发思路:
第一步,创建一个漂亮的开始界面;
第二步,画出游戏界面;
第三步,定义地图数组,与界面建立联系;
第四步,获取鼠标点击信息,对格子进行处理;
第五步,游戏的胜负判断。
【源码获取】:
源码在C语言/C++交流②群:967051845!资料共享在群文件里面,有需要的可以自行添加获取~
如果对代码有任何建议,都可以添加小编的学习交流群,欢迎大家来讨论~
话不多说,源码展示:
#include<stdio.h>
#include<graphics.h>
#include<conio.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
#define WIN_WIDTH 640
#define WIN_HEIGHT 480
#define GRID_NUM 4 //每一行每一列的格子数
#define GRID_WIDTH 30//格子宽度
struct Grid //格子
{
int top; //上面一条线的x坐标
int down;//下面一条线的x坐标
int left;//左边一条线的y坐标
int right;//右边边一条线的y坐标
int foot; //步数
int map[GRID_NUM][GRID_NUM];
POINT mouse; //鼠标点击的格子的下标
}grid;
MOUSEMSG msg;
IMAGE img;
//开始界面
void Welcome()
{
//播放音乐
mciSendString("open ./slhxq.mp3 alias a", 0, 0, 0);
mciSendString("play a repeat", 0, 0, 0);
//显示背景图片
loadimage(&img, "./bk.jpg",640,480);
putimage(0, 0, &img);
setbkmode(TRANSPARENT);
settextcolor(GREEN);
settextstyle(64, 0, "黑体");
outtextxy(70, 50, "涂格子小游戏");
settextcolor(RED);
settextstyle(16, 0, "宋体");
outtextxy(100, 200, "每点一个格子,上下左右的格子也会做出于现状相反的动作");
outtextxy(100, 240, "总共11关,左键填色,右键重来,中键退出");
outtextxy(400, 320, "作者:顽石老师");
settextstyle(16, 0, "黑体");
outtextxy(400, 340, "^V^");
while (!_kbhit())
{
settextcolor(RGB(0, rand()%256, 0));
outtextxy(280, 400, "按任意键继续!");
Sleep(200);
}
_getch();//按任意键继续
}
void GameInit()
{
// 游戏区域大小,屏幕中心位置x,y,减去总格子宽度的一半
grid.left = WIN_WIDTH/2 - GRID_WIDTH * GRID_NUM / 2;
grid.right = WIN_WIDTH /2 + GRID_WIDTH * GRID_NUM / 2;
grid.top = WIN_HEIGHT / 2 - GRID_WIDTH * GRID_NUM / 2;
grid.down = WIN_HEIGHT / 2 + GRID_WIDTH * GRID_NUM / 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;
}
}
}
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 <= grid.down; y += GRID_WIDTH)
{
line(grid.left, y, grid.right, y);
}
// 外边框
for (int x = 20; x > 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);//画右面的线
}
//绘制格子颜色
int x, y;
for (int i = 0; i < GRID_NUM; i++)
{
for (int k = 0; k < GRID_NUM; k++)
{
x = i * GRID_WIDTH + grid.left;
y = k * GRID_WIDTH + grid.top;
if (grid.map[i][k] == 1)
{
setfillcolor(BLACK);
solidrectangle(x + 1, y + 1, x + GRID_WIDTH - 1, y + GRID_WIDTH - 1);//加1减一是为了让每个格子的边框显示出来
}
else if (grid.map[i][k] == -1)
{
setfillcolor(RGB(0, 150, 0));
solidrectangle(x + 1, y + 1, x + GRID_WIDTH - 1, y + GRID_WIDTH - 1);//加1减一是为了让每个格子的边框显示出来
}
}
}
char foot[20] = "";
sprintf(foot, "步数:%d", grid.foot);
settextcolor(WHITE);
outtextxy(10, 10, foot);
}
void GameControl()
{
if (MouseHit())
{
msg = GetMouseMsg();
if (msg.uMsg == WM_LBUTTONDOWN)
{ //鼠标点击位置在游戏区域时
if (msg.x > grid.left && msg.x<grid.right && msg.y>grid.top && msg.y < grid.down)
{
grid.mouse.x = (msg.x - grid.left) / GRID_WIDTH;
grid.mouse.y = (msg.y - grid.top) / GRID_WIDTH;
grid.map[grid.mouse.x][grid.mouse.y] = -grid.map[grid.mouse.x][grid.mouse.y];//点击的变色
if (grid.mouse.x >= 0 && grid.mouse.x < GRID_NUM - 1)grid.map[grid.mouse.x+1][grid.mouse.y] = -grid.map[grid.mouse.x+1][grid.mouse.y];//右面的变色
if (grid.mouse.x > 0 && grid.mouse.x <= GRID_NUM - 1)grid.map[grid.mouse.x-1][grid.mouse.y] = -grid.map[grid.mouse.x-1][grid.mouse.y];//左面变色
if (grid.mouse.y >= 0 && grid.mouse.y < GRID_NUM - 1)grid.map[grid.mouse.x][grid.mouse.y+1] = -grid.map[grid.mouse.x][grid.mouse.y+1];//下边变色
if (grid.mouse.y > 0 && grid.mouse.y <= GRID_NUM - 1)grid.map[grid.mouse.x][grid.mouse.y-1] = -grid.map[grid.mouse.x][grid.mouse.y-1];//上边变色
grid.foot++;
}
}
}
}
int GameJudge()
{
for (int i = 0; i < GRID_NUM; i++)
{
for (int k = 0; k < GRID_NUM; k++)
{
if (grid.map[i][k] == 1)
{
return 0;
}
}
}
return 1;
}
int main()
{
initgraph(640, 480);
Welcome();
GameInit();
BeginBatchDraw();
while (1)
{
GameControl();
GameDraw();
FlushBatchDraw();
if (GameJudge())
{
HWND hwd = GetHWnd();
MessageBox(hwd, "你赢了~", "提示:", MB_OK);
exit(666);
}
}
return 0;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小编。
另外本程序还需要一部分头文件,想要领取可以添加小编的C语言/C++交流②群:967051845,源码在群文件里
福利来咯~
学习过程很“痛苦”,但是结果大家一定会对自己很满意!
如果觉得学习资料难找的话,可以添加小编的C语言/C++交流群:967051845! 学习资料已经共享在群里了,期待你的加入~