用easy-x可视化 窗口实现俄罗斯方块小游戏

本文展示了一段基于EasyX图形库的C++代码,实现了一个简单的俄罗斯方块游戏。代码中包含了游戏的核心逻辑,如方块生成、移动、旋转、消除行等功能,并给出了游戏界面的绘制方法。通过分析这段代码,读者可以了解如何利用EasyX进行图形界面编程以及基础的游戏逻辑实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • easy-x插件需要自己在官网下载(附上链接)
    https://easyx.cn/
  • 安装好插件后用vs2019打开
  • 然后话不多说,附上源码
#include<iostream>
#include<graphics.h>
#include<time.h>
#include<conio.h>
using namespace std;
int m, n, nindex, score = 0;
int t = 500;
int g_blackTetrisBlock[20][10] = { 0 };
int block[28][4][4] = {
{
	{1,0,0,0},
	{1,1,1,0},
	{0,0,0,0},
	{0,0,0,0},
},{
	{1,1,0,0},
	{1,0,0,0},
	{1,0,0,0},
	{0,0,0,0},
},{
	{1,1,1,0},
	{0,0,1,0},
	{0,0,0,0},
	{0,0,0,0},
},{
	{0,1,0,0},
	{0,1,0,0},
	{1,1,0,0},
	{0,0,0,0},
},{
	{0,0,1,0},
	{1,1,1,0},
	{0,0,0,0},
	{0,0,0,0},
},{
	{1,0,0,0},
	{1,0,0,0},
	{1,1,0,0},
	{0,0,0,0},
},{
	{1,1,1,0},
	{1,0,0,0},
	{0,0,0,0},
	{0,0,0,0},
},{
	{1,1,0,0},
	{0,1,0,0},
	{0,1,0,0},
	{0,0,0,0},
},{
	{1,1,0,0},
	{0,1,1,0},
	{0,0,0,0},
	{0,0,0,0},
},{
	{0,1,0,0},
	{1,1,0,0},
	{1,0,0,0},
	{0,0,0,0},
},{
	{1,1,0,0},
	{0,1,1,0},
	{0,0,0,0},
	{0,0,0,0},
},{
	{0,1,0,0},
	{1,1,0,0},
	{1,0,0,0},
	{0,0,0,0},
},{
	{0,1,1,0},
	{1,1,0,0},
	{0,0,0,0},
	{0,0,0,0},
},{
	{1,0,0,0},
	{1,1,0,0},
	{0,1,0,0},
	{0,0,0,0},
},{
	{0,1,1,0},
	{1,1,0,0},
	{0,0,0,0},
	{0,0,0,0},
},{
	{1,0,0,0},
	{1,1,0,0},
	{0,1,0,0},
	{0,0,0,0},
},{
	{0,1,0,0},
	{1,1,1,0},
	{0,0,0,0},
	{0,0,0,0},
},{
	{1,0,0,0},
	{1,1,0,0},
	{1,0,0,0},
	{0,0,0,0},
},{
	{1,1,1,0},
	{0,1,0,0},
	{0,0,0,0},
	{0,0,0,0},
},{
	{0,1,0,0},
	{1,1,0,0},
	{0,1,0,0},
	{0,0,0,0},
},{
	{1,1,1,1},
	{0,0,0,0},
	{0,0,0,0},
	{0,0,0,0},
},{
	{1,0,0,0},
	{1,0,0,0},
	{1,0,0,0},
	{1,0,0,0},
},{
	{1,1,1,1},
	{0,0,0,0},
	{0,0,0,0},
	{0,0,0,0},
},{
	{1,0,0,0},
	{1,0,0,0},
	{1,0,0,0},
	{1,0,0,0},
},{
	{1,1,0,0},
	{1,1,0,0},
	{0,0,0,0},
	{0,0,0,0},
}, {
	{1,1,0,0},
	{1,1,0,0},
	{0,0,0,0},
	{0,0,0,0},
}, {
	{1,1,0,0},
	{1,1,0,0},
	{0,0,0,0},
	{0,0,0,0},
}, {
	{1,1,0,0},
	{1,1,0,0},
	{0,0,0,0},
	{0,0,0,0},
}
};
void swap(int& a, int& b) {
	int t = a;
	a = b;
	b = t;
}
void oncreate(int n) {
	for (int i = 0; i < 4; i++) {
		for (int j = 0; j < 4; j++) {
			if (g_blackTetrisBlock[i][j + 3] != 2)
				g_blackTetrisBlock[i][j + 3] = block[n][i][j];
		}
	}
}
void drawrectangle() {
	for (int i = 0; i < 20; i++) {
		for (int j = 0; j < 10; j++)
		{
			if (g_blackTetrisBlock[i][j] == 0)
			{
				setfillcolor(WHITE);
				solidrectangle(30 * j, 30 * i, 30 * (j + 1), 30 * (i + 1));
			}
			if (g_blackTetrisBlock[i][j] == 1)
			{
				setfillcolor(BLUE);
				fillrectangle(30 * j, 30 * i, 30 * (j + 1), 30 * (i + 1));
			}
			if (g_blackTetrisBlock[i][j] == 2) {
				setfillcolor(RED);
				fillrectangle(30 * j, 30 * i, 30 * (j + 1), 30 * (i + 1));
			}
		}

	}
}
void judge1() {
	for (int i = 0; i < 20; i++) {
		int k = 1;
		for (int j = 0; j < 10; j++)
		{
			if (g_blackTetrisBlock[i][j] == 0)
			{
				k = 0;
			}
		}
		if (k) {
			score += 2;
			for (int j = 0; j < 10; j++)
			{
				g_blackTetrisBlock[i][j] = 0;
			}
			for (int x = i - 1; x >= 0; x--)
			{
				for (int y = 0; y < 10; y++)
				{
					swap(g_blackTetrisBlock[x][y], g_blackTetrisBlock[x + 1][y]);
				}
			}
		}
	}
}
void tran2() {
	for (int i = 0; i < 20; i++) {
		for (int j = 0; j < 10; j++) {
			if (g_blackTetrisBlock[i][j] == 1)
				g_blackTetrisBlock[i][j] = 2;
		}
	}
	judge1();
}
void transform(int n) {
	int d = 0, d1 = 0, a = 20, b = 10;
	for (int i = 0; i < 20; i++) {
		for (int j = 0; j < 10; j++) {
			if (g_blackTetrisBlock[i][j] == 1)
			{
				if (i <= a)
					a = i;

				if (j <= b)
					b = j;
				break;
			}
		}
	}
	int r = 3, w = 2;
	if (n >= 20 && n < 24)
		r = 4, w = 3;
	for (int x = r; x >= 0; x--) {
		for (int y = r; y >= 0; y--)
		{
			if (a + x > 19 || b + y > 10 || g_blackTetrisBlock[a + x - 1][b + y - 1] == 2)
			{
				d1 = 1;
				break;
			}
		}
		if (d1)
			break;
	}
	if (!d1) {
		for (int x = w; x >= 0; x--)
			for (int y = w; y >= 0; y--)
				g_blackTetrisBlock[a + x][b + y] = block[n][x][y];
	}
}
void judge2() {
	for (int i = 0; i < 20; i++) {
		for (int j = 0; j < 10; j++)
		{
			if (g_blackTetrisBlock[i][j] == 2 && g_blackTetrisBlock[i - 1][j] == 1) {
				tran2();
				m = 1;
			}

			if (g_blackTetrisBlock[19][j] == 1)
			{
				tran2();
				m = 1;
			}
		}
	}
}

void move() {
	if (!_kbhit())
	{
		judge2();
		for (int i = 18; i >= 0; i--) {
			for (int j = 9; j >= 0; j--) {
				if (g_blackTetrisBlock[i][j] == 1)
				{
					swap(g_blackTetrisBlock[i][j], g_blackTetrisBlock[i + 1][j]);
				}
			}
		}
	}
	else
	{
		int w = 1;
		int b = _getch();
		if (b == 112) {
			getchar();
		}
		if (b == 224) {
			int c = _getch();
			switch (c)
			{
			case 75:
				for (int i = 0; i < 20; i++) {
					for (int j = 0; j < 10; j++) {
						if (g_blackTetrisBlock[i][j] == 1)
						{
							if (g_blackTetrisBlock[i][j - 1] == 2 || j == 0)
							{
								w = 0;
							}
						}
					}
				}
				if (w)
				{
					for (int i = 0; i < 20; i++) {
						for (int j = 1; j < 10; j++) {
							if (g_blackTetrisBlock[i][j] == 1 && g_blackTetrisBlock[i][j - 1] == 0)
							{

								swap(g_blackTetrisBlock[i][j], g_blackTetrisBlock[i][j - 1]);
							}
						}
					}
				}
				break;
			case 77:
				for (int i = 0; i < 20; i++) {
					for (int j = 0; j < 10; j++) {
						if (g_blackTetrisBlock[i][j] == 1)
						{
							if (g_blackTetrisBlock[i][j + 1] == 2 || j == 9)
							{
								w = 0;
							}
						}
					}
				}
				if (w) {
					for (int i = 0; i < 20; i++) {
						for (int j = 8; j >= 0; j--) {
							if (g_blackTetrisBlock[i][j] == 1 && g_blackTetrisBlock[i][j + 1] == 0)
							{
								swap(g_blackTetrisBlock[i][j], g_blackTetrisBlock[i][j + 1]);
							}
						}
					}
				}
				break;
			case 72:
				nindex++;
				transform(nindex);
				if (nindex % 4 == 3)
					nindex = 4 * n - 1;
				break;
			case 80:
				t = 100;
				break;
			}
		}
	}
}
void predictnext(int n) {
	outtextxy(330, 20, "下一个方块:");
	for (int i = 0; i < 4; i++)
		for (int j = 0; j < 4; j++)
		{
			if (block[n][i][j] == 0)
			{
				setfillcolor(WHITE);
				solidrectangle(340 + 30 * j, 50 + 30 * i, 370 + 30 * j, 80 + 30 * i);
			}
			if (block[n][i][j] == 1) {
				setfillcolor(BLUE);
				fillrectangle(340 + 30 * j, 50 + 30 * i, 370 + 30 * j, 80 + 30 * i);
			}
		}
}
int endplay() {
	for (int j = 0; j < 10; j++)
		if (g_blackTetrisBlock[0][j] == 2)
			return 1;
	return 0;
}
int main() {
	int n1;
	char s[20] = "";
	initgraph(500, 600);
	setbkcolor(WHITE);
	cleardevice();
	setlinecolor(BLACK);
	srand((unsigned int)time(NULL));
	settextcolor(GREEN);
	settextstyle(20, 10, "宋体");
	outtextxy(310, 220, "按↑变形");
	outtextxy(310, 240, "按↓加速下移");
	outtextxy(310, 260, "按←左移");
	outtextxy(310, 280, "按→右移");
	outtextxy(310, 300, "按 p 暂停");
	n1 = rand() % 7;
	while (1) {
		sprintf_s(s, "当前得分:%d", score);
		outtextxy(310, 200, s);
		t = 500;
		m = 0;
		n = n1;
		n1 = rand() % 7;
		oncreate(4 * n);
		nindex = 4 * n;
		predictnext(4 * n1);
		if (endplay())
			break;
		while (true)
		{
			line(301, 0, 301, 600);
			drawrectangle();
			move();
			Sleep(t);

			if (m)
			{
				break;
			}
		}

	}
	settextcolor(GREEN);
	outtextxy(330, 330, "Game Over!");
	getchar();
	return 0;
}

  • 运行后结果是这样子的:
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值