神奇形色牌
【摘要】
目录
一,规则
二,图片制作
三,代码
一,规则
正确的一组牌是指,四个特征都不同的三张牌。
还有另外一个版本,如果三张牌完全相同也可以,这感觉像是不限牌数不限轮次的玩法,可能是看谁先玩到一个分数。
接下来我将实现无限版。
二,图片制作
首先利用PPT快速画出27张图
此处已经用opencv做过...
目录
一,规则
正确的一组牌是指,四个特征都不同的三张牌。
还有另外一个版本,如果三张牌完全相同也可以,这感觉像是不限牌数不限轮次的玩法,可能是看谁先玩到一个分数。
接下来我将实现无限版。
二,图片制作
首先利用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<Vec3b>(i, j) = img.at<Vec3b>(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<iostream>
-
#include<string>
-
#include<vector>
-
#include<algorithm>
-
#include<map>
-
#include<opencv2/opencv.hpp>
-
#include<opencv2/highgui.hpp>
-
#include<opencv2/core/mat.hpp>
-
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;
-
vector<int>v;
-
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<Vec3b>(i + r * h, j + c * w) = img.at<Vec3b>(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-"<<v.size()<<"),0 代表无解\n";
-
cin >> 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--;
-
vector<int>id = { 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;
-
}
作为电子版游戏,相对实体版的优势在于可以做校验,所以可以补充一下校验。
文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/nameofcsdn/article/details/123776601
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)