别踩白块游戏(附源代码)

这个别踩白块游戏是楼主跟着教程一步一步敲出来的,也是第一个较为高级的互动式项目(我目前觉得很高级哈哈),会尽量的将细节和注意事项解释清楚方便后来的小伙伴学习参谋。(如有错误还望提出海涵)

开始准备

下载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);
		}
	}*/

效果图:

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

相关推荐
炘爚10 小时前
C语言(文件操作)
c语言·开发语言
上海云盾-小余11 小时前
游戏盾与应用防护联动:一站式业务安全防御体系搭建指南
安全·游戏
W.D.小糊涂11 小时前
gpu服务器安装windows+ubuntu24.04双系统
c语言·开发语言·数据库
C羊驼12 小时前
C语言:两天打鱼,三天晒网
c语言·经验分享·笔记·算法·青少年编程
本喵是FW14 小时前
C语言手记1
java·c语言·算法
炘爚16 小时前
C语言(const的指针定义的区别)
c语言
前端不太难16 小时前
经典游戏 Claw 的引擎是怎么被逆向出来的
游戏·状态模式
Z9fish17 小时前
sse哈工大C语言编程练习47
c语言·数据结构·算法
本喵是FW17 小时前
C语言手记2
c语言·开发语言
魔士于安18 小时前
Unity星球资源,八大星球,带fps显示
游戏·unity·游戏引擎·贴图·模型