自制假钢琴块游戏(Easyx)

 这是通过学习自制的一个小游戏,类似钢琴块,只不过黑块不会自动下落

#include<easyx.h>
#include<graphics.h>
#include<stdio.h>
#include<time.h> 
#include<windows.h>
#define N 4
 
void First();
void draw();
void DrawBlack();
void InitBlack();
bool Play();
int Map[N];
int MapX, MapY,Score=0;

int main() {
	srand((unsigned)time(NULL));//sand()用于设置随机数生成的种子
	/*
	void srand(unsigned int seed);
	通过设定不同的种子值,使调用rand()函数产生的随机数序列不同
	如果不设定种子,每次程序运行生成的随机数序列都相同
	*/
	initgraph(1000, 800);//初始化图形窗口
	First();
	setlinecolor(BLACK);//设置线条颜色
	InitBlack();
	while (1) {
		draw();
		if (Play()) {
			char str[128];
			sprintf_s(str, "总计得分%d", Score);//Visual Studio中是sprintf_s,其实原本是sprintf
			/*
			将整型、浮点型或字符型的数据组合为一个新的字符串
			类似printf();
			*/
			MessageBox(GetHWnd(), str, "Game Over", MB_OK);//MessageBox常用于向用户提示重要信息的交互方式
			/*
			int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);
			-  hWnd :消息框所属窗口的句柄,如果为 NULL ,则消息框没有所属窗口。
            -  lpText :要显示在消息框中的文本内容。
            -  lpCaption :消息框的标题。
            -  [1]【uType】 :消息框的类型,包括按钮类型(如确定、取消、是、否等)、图标类型(如信息图标、警告图标、错误图标等)等。
			-  GetHwnd()获取窗口句柄,然后自定义
			*/
			exit(0);//终止程序运行
			/*
			exit与return 的区别:
			-  return 从函数中返回值并结束函数执行
			-  exit 无论在哪个函数中调用,都会直接终止整个程序,同时执行一些清理操作
			*/
		}
	}
}

void First() {
    settextcolor(WHITE);//设置文本颜色
	settextstyle(120, 0, "楷体");//(字体大小(高度charheight),字体间距(charspace),字体(fontname))
	outtextxy(380, 100, "钢块");//(输出的X坐标,输出的Y坐标,输出的内容)
	settextstyle(80, 0, "楷体");
	outtextxy(340, 230, "游戏规则");
	settextstyle(30, 0, "楷体");
	outtextxy(350, 400, "点击最下行中黑色方块");
	outtextxy(300, 450, "一旦点击到白色方块将游戏结束");
	Sleep(5000);//让程序睡眠5000毫秒
}

void draw() {
	BeginBatchDraw();//开启批量绘制
	cleardevice();//清除初始化界面上的额外内容
	setlinecolor(BLACK);
	setfillcolor(WHITE);//设置填充色
	for (int i = 0; i < 4; i++) {
		for (int j = 0; j < 4; j++) {
			fillrectangle(j * 250, i * 200, 250+j*250, 200+i*200);//绘制填充颜色的矩形
			/*
			(X1,Y1,X2,Y2);(X1,Y1)为矩形的左上角的坐标,(X2,Y2)为矩形右下角的坐标
			*/
		}
	}	
	setfillcolor(BLACK);//设置填充色
	DrawBlack();
	EndBatchDraw();
}

void InitBlack() {
	for (int i = 0; i < N; i++) {
		Map[i] = rand() % N;//0到N-1之间的随机数
    } 
}

void DrawBlack(){
	setfillcolor(BLACK);
	for (int i = 0; i < N; i++) {
		fillrectangle(Map[i] * 250, i * 200, 250 + Map[i] * 250, 200 + i * 200);
	}
}

bool Play() {//bool类型
	MOUSEMSG msg;//一种鼠标信息结构体
	msg = GetMouseMsg();//获取鼠标信息
	switch (msg.uMsg) {
	case WM_LBUTTONDOWN://鼠标左键点击。右键点击为WM_RBUTTONDOWN 
		MapX = msg.x / 250;//鼠标点击的坐标X
		MapY = msg.y / 200;//鼠标点击的坐标Y
		if (Map[3]==MapX&&MapY==3) {
			for (int i = 3; i > 0;i--) {
				Map[i] = Map[i - 1];
			}
			Map[0] = rand() % N;
			Score += 1;
			printf("你点击到了黑块!\n");
		}
		else {
			printf("未点击到黑快!\n");
			return true;
		}
		break;
	}
	return false;
}

//[1]【uType】
/*
MB_OK:只有一个“确定”按钮
MB_OKCANCEL:有“确定”和“取消”按钮
MB_YESNO:有“是”和“否”按钮
MB_ICONINFORMATION:显示信息图表
MB_ICONINWARNING:显示警告图标
MB_ICONERROR:显示错误图标
*/

 这是成品的视频

钢块录屏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值