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

  • 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;
}

  • 运行后结果是这样子的:
    在这里插入图片描述
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 游戏需求 随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充给定的区域,若填满一条便消掉,记分,当达到一定的分数时,过关,设置几个关卡,每关方块下落的速度不同,若在游戏中各形状填满了给定区域,为输者。 2.游戏界面需求: 良好的用户界面,有关数显示和分数显示,以及下一个方块显示。让方块在一定的区域内运动和变形,该区域用一种颜色表明 。还需用另一种颜色把该区域围起来,宽度适中,要实现美感。 3.游戏形状(方块)需求: 良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),各个方块要能实现它的变形,可设为顺时针或逆 时针变形,一般为逆时针。 4.输入与输出: 用户根据需要输入上(输出旋转效果)、左右(输出移动效果)、下(输出加速下沉效果)、空格(沉底)、P(暂停)、ESC(退出)。 2.游戏界面需求: 良好的用户界面,有关数显示和分数显示,以及下一个方块显示。让方块在一定的区域内运动和变形,该区域用一种颜色表明 。还需用另一种颜色把该区域围起来,宽度适中,要实现美感。 3.游戏形状(方块)需求: 良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),各个方块要能实现它的变形,可设为顺时针或逆 时针变形,一般为逆时针。 4.输入与输出: 用户根据需要输入上(输出旋转效果)、左右(输出移动效果)、下(输出加速下沉效果)、空格(沉底)、P(暂停)、ESC(退出)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值