这个别踩白块游戏是楼主跟着教程一步一步敲出来的,也是第一个较为高级的互动式项目(我目前觉得很高级哈哈),会尽量的将细节和注意事项解释清楚方便后来的小伙伴学习参谋。(如有错误还望提出海涵)
开始准备
下载VS(Visual Studio)---我们接下来会在这个里面操作(注意不要安装到C盘)
安装EasyX图形库---我们现在安装的VS都是2026版本的,但是这个EasyX不支持最新版本,见------
创建界面-绘制窗口
c
#include <graphics.h>
#include <stdio.h>
int main()
{
//1.创建界面 width:宽度 height:高度 单位:px
initgraph(500, 480);
//卡屏(就是让程序一直进行着,防止窗口关闭-方法不唯一)
getchar();
return 0;
}
tip:卡屏也可以用哪一个死循环。
窗口坐标原点在左上角,X轴水平向右坐标依此变大,Y轴水平向下坐标依此变大。
创建界面-绘制白块

四个属性值 left top right bottom 构建一个矩形
宽:|left-right|,高: |top-bottom|
eg:
c
#include <graphics.h>
#include <stdio.h>
int main()
{
//1.创建界面 width:宽度 height:高度 单位:px
initgraph(500, 480);
//设置线条的颜色
setlinecolor(BLACK);
//根据格子数量4行 5列 求得:格子的宽度:100 高度:120
//本质上讲 格子就是一个矩形
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 5; j++) {
//通过分析找出来不同方块的坐标变化规律
//再通过for循环嵌套渲染出大量白块
fillrectangle(j * 100, i * 120, j * 100 + 100, i * 120 + 120);
}
}
//卡屏(就是让程序一直进行着,防止窗口关闭-方法不唯一)
getchar();
return 0;
}
目前效果图:

tip:将绘制白块的代码封装到一个函数中方便后期调用和修改。
创建界面-绘制黑块
eg:
c
#include <graphics.h>
#include <stdio.h>
#include <time.h>
#define N 5
int Map[N];//定义了一个数组 存储黑块的位置
//随机产生黑块的坐标
void InitBlack() {
for (int i = 0; i < N - 1; i++) {
Map[i] = rand() % N;//0~4
printf("%d\n", Map[i]);
}
}
//根据随机存储在数组中的数据 产生黑块
void DrawBlack() {
for (int i = 0; i < N-1; i++) {
fillrectangle(Map[i] * 100, i * 120, Map[i] * 100 + 100, i * 120 + 120);
}
}
//绘制界面
void Draw() {
//设置线条的颜色
setlinecolor(BLACK);
//根据格子数量4行 5列 求得:格子的宽度:100 高度:120
//本质上讲 格子就是一个矩形
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 5; j++) {
//通过分析找出来不同方块的坐标变化规律
//再通过for循环嵌套渲染出大量白块
fillrectangle(j * 100, i * 120, j * 100 + 100, i * 120 + 120);
}
}
setfillcolor(BLACK);//格子填充颜色
DrawBlack();//绘制黑色方块在白色底面的背景下
}
int main()
{
srand((unsigned)time(NULL));//通过时间做随机数的种子
//1.创建界面 width:宽度 height:高度 单位:px
initgraph(500, 480,SHOWCONSOLE);
InitBlack();//初始化黑格子的位置
Draw();//绘制界面
//卡屏(就是让程序一直进行着,防止窗口关闭-方法不唯一)
getchar();
return 0;
}
tip:通过做大量的封装函数大大增加的代码的可读性与调用。
在 EasyX 图形库中,initgraph(500, 480, SHOWCONSOLE) 最后一个参数 SHOWCONSOLE 是控制台显示控制标志,用于指定初始化图形窗口时,是否同时显示控制台窗口。
效果图:

获取鼠标消息
eg:
c
while (1) {
MOUSEMSG msg;
msg = GetMouseMsg();//捕捉鼠标消息
if (msg.uMsg == WM_LBUTTONDOWN) {
printf("鼠标左键按下:");
printf("%d,%d\n", msg.x, msg.y);
}
else if (msg.uMsg == WM_RBUTTONDOWN) {
printf("鼠标右键按下:");
printf("%d,%d\n", msg.x, msg.y);
}
}
效果图:

响应鼠标消息
计算过程:

源码:
c
#include <graphics.h>
#include <stdio.h>
#include <time.h>
#define N 5
int Map[N];//定义了一个数组 存储黑块的位置
int MapX, MapY,Score;
//随机产生黑块的坐标
void InitBlack() {
for (int i = 0; i < N - 1; i++) {
Map[i] = rand() % N;//0~4
//printf("%d\n", Map[i]);
}
}
//根据随机存储在数组中的数据 产生黑块
void DrawBlack() {
for (int i = 0; i < N-1; i++) {
fillrectangle(Map[i] * 100, i * 120, Map[i] * 100 + 100, i * 120 + 120);
}
}
//绘制界面
void Draw() {
BeginBatchDraw();
cleardevice();//清屏
setlinecolor(BLACK);//设置线条的颜色
setfillcolor(WHITE);//格子填充颜色
//根据格子数量4行 5列 求得:格子的宽度:100 高度:120
//本质上讲 格子就是一个矩形
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 5; j++) {
//通过分析找出来不同方块的坐标变化规律
//再通过for循环嵌套渲染出大量白块
fillrectangle(j * 100, i * 120, j * 100 + 100, i * 120 + 120);
}
}
setfillcolor(BLACK);//格子填充颜色
DrawBlack();//绘制黑色方块在白色底面的背景下
EndBatchDraw();
}
bool Play() {
MOUSEMSG msg;//定义变量存储鼠标消息
msg = GetMouseMsg();//捕捉鼠标的消息
switch (msg.uMsg) {
case WM_LBUTTONDOWN://鼠标左键按下
//根据鼠标点击的坐标 计算出对应的小标
MapY = msg.y / 120;//120是白块 黑块的高度
MapX= msg.x / 100;//100是白块 黑块的高度
if (Map[3] == MapX && MapY == 3) {
for (int i = 3; i > 0; i--) {
Map[i] = Map[i - 1];
}
Map[0] = rand() % N;//随机产生一个新的黑格子
Score += 10;
printf("你点击到了黑方块!\n");
}
else {
printf("你点击到了白方块!\n");
return true;
}
break;
}
return false;
}
int main()
{
srand((unsigned)time(NULL));//通过时间做随机数的种子
//1.创建界面 width:宽度 height:高度 单位:px
initgraph(500, 480);
InitBlack();//初始化黑格子的位置
while (1) {
Draw();//绘制界面
if (Play()) {
char str[128];
snprintf(str, sizeof(str), "总计消除格子:%d,总计得分:%d", Score / 10, Score);
MessageBox(GetHWnd(), str, "Game Over!", MB_OK);
exit(0);//结束程序
}
}
//卡屏(就是让程序一直进行着,防止窗口关闭-方法不唯一)
getchar();
return 0;
}
/*while (1) {
MOUSEMSG msg;
msg = GetMouseMsg();//捕捉鼠标消息
if (msg.uMsg == WM_LBUTTONDOWN) {
printf("鼠标左键按下:");
printf("%d,%d\n", msg.x, msg.y);
}
else if (msg.uMsg == WM_RBUTTONDOWN) {
printf("鼠标右键按下:");
printf("%d,%d\n", msg.x, msg.y);
}
}*/
效果图:

这是楼主跟做的小程序,优化和功能上可能没有那么完美,但是跟做一遍也会感觉收获了一些东西并且当程序亮起的那一刻很有成就感!