栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

神奇形色牌

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

神奇形色牌

目录

一,规则

二,图片制作

三,代码


一,规则

正确的一组牌是指,四个特征都不同的三张牌。

还有另外一个版本,如果三张牌完全相同也可以,这感觉像是不限牌数不限轮次的玩法,可能是看谁先玩到一个分数。

接下来我将实现无限版。

二,图片制作

首先利用PPT快速画出27张图

此处已经用opencv做过resize了

然后再用opencv生成其他图:

int main()
{
	for (int k = 1; k <= 27; k++)
	{
		string s = to_string(k);
		Mat img = imread("D:/set/img (" + s + ").png", 1);
		Mat img2 = Mat(Size(img.cols, img.rows * 2), img.type());
		for (int i = 0; i < img2.rows; i++)for (int j = 0; j < img.cols; j++)
		{
			img2.at(i, j) = img.at(i % img.rows, j);
		}
		s = "D:/set/" + to_string(k+100) + ".png";
		imwrite(s, img2);
	}
	return 0;
}

 同理得到三个元素的27张图,一共81张图

 然后全部变成同尺寸的图

全都是宽400高660pixel的图片。

图包下载

三,代码

利用81张图片做成小游戏。

每次如果无解就加3张牌,有解的话去掉这3张牌之后,如果少于12张就补3张。

完整代码V1:


#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
using namespace cv;

#pragma comment(lib,"../x64/vc14/lib/opencv_world452.lib")
#pragma comment(lib,"../x64/vc14/lib/opencv_world452d.lib")


int row = 3;
int theRatio = 4;
int w = 400/ theRatio, h = 660/ theRatio, type = 16;
vectorv;
Mat imgs;
Mat allImg[81];

void draw(int k, int n)
{
	int col = v.size() / row, r = k / col, c = k % col;
	Mat img = allImg[n];
	for (int i = 0; i < img.rows; i++)for (int j = 0; j < img.cols; j++)
	{
		imgs.at(i + r * h, j + c * w) = img.at(i, j);
	}
}
void draw(int k)//在第k张牌的位置出一张新牌
{
	draw(k, rand() % 81);
}
void drawAll()//根据v来显示所有图片
{
	int col = v.size() / row;
	imgs = Mat(Size(w * col, h * row), type);
	for (int i = 0; i < row * col; i++)draw(i, v[i]);
}

void Init()
{
	for (int i = 0; i < 81; i++) {
		allImg[i] = imread("D:/set/img (" + to_string(i+1) + ").png", 1);
		resize(allImg[i], allImg[i], Size(w, h), 0, 0);
	}
	
	int col = v.size() / row;
	drawAll();
}

void add3()
{
	v.push_back(rand() % 81);
	v.push_back(rand() % 81);
	v.push_back(rand() % 81);
}

void Play()
{
	imshow("img", imgs);
	int a, b, c;
	waitKey(0);
	cout << "输入3张牌的序号(1-"<> a;
	if (a <= 0 || a > v.size()) {
		add3();
		return Init();
	}
	cin >> b >> c;
	if (b <= 0 || b > v.size())return Play();
	if (c <= 0 || c > v.size())return Play();
	a--, b--, c--;
	vectorid = { a,b,c };
	sort(id.begin(), id.end());
	v.erase(v.begin() + c);
	v.erase(v.begin() + b);
	v.erase(v.begin() + a);
	if (v.size() < 12)add3();
	drawAll();
}

int main()
{
	srand((unsigned)time(NULL));
	while(v.size() < 12)v.push_back(rand() % 81);
	int col = v.size() / row;
	imgs = Mat(Size(w * col, h * row), type);
	Init();
	while(true)Play();
	return 0;
}

作为电子版游戏,相对实体版的优势在于可以做校验,所以可以补充一下校验。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/779187.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号