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

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

开始准备

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

效果图:

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

相关推荐
嵌入式学习和实践21 分钟前
C语言-BCD码转换为十进制的测试和说明
c语言·转换·bcd码
喵了meme6 小时前
C语言实战4
c语言·开发语言
智者知已应修善业6 小时前
【求中位数】2024-1-23
c语言·c++·经验分享·笔记·算法
BT-BOX9 小时前
普中开发板基于51单片机贪吃蛇游戏设计
单片机·游戏·51单片机
程序员zgh10 小时前
Linux系统常用命令集合
linux·运维·服务器·c语言·开发语言·c++
90后小陈老师10 小时前
Unity教学 项目2 2D闯关游戏
游戏·unity·游戏引擎
Bigan(安)10 小时前
【奶茶Beta专项】【LVGL9.4源码分析】09-core-obj_class对象类系统
linux·c语言·mcu·arm·unix
程序员zgh11 小时前
常用通信协议介绍(CAN、RS232、RS485、IIC、SPI、TCP/IP)
c语言·网络·c++
Bigan(安)12 小时前
【奶茶Beta专项】【LVGL9.4源码分析】08-theme主题管理
linux·c语言·mcu·arm·unix
了一梨12 小时前
外设与接口:按键输入 (libgpiod)
linux·c语言