神奇形色牌

举报
用户已注销 发表于 2022/03/28 01:44:43 2022/03/28
【摘要】 目录 一,规则 二,图片制作 三,代码 一,规则 正确的一组牌是指,四个特征都不同的三张牌。 还有另外一个版本,如果三张牌完全相同也可以,这感觉像是不限牌数不限轮次的玩法,可能是看谁先玩到一个分数。 接下来我将实现无限版。 二,图片制作 首先利用PPT快速画出27张图 此处已经用opencv做过...

目录

一,规则

二,图片制作

三,代码


一,规则

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

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

接下来我将实现无限版。

二,图片制作

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

此处已经用opencv做过resize了

然后再用opencv生成其他图:


  
  1. int main()
  2. {
  3. for (int k = 1; k <= 27; k++)
  4. {
  5. string s = to_string(k);
  6. Mat img = imread("D:/set/img (" + s + ").png", 1);
  7. Mat img2 = Mat(Size(img.cols, img.rows * 2), img.type());
  8. for (int i = 0; i < img2.rows; i++)for (int j = 0; j < img.cols; j++)
  9. {
  10. img2.at<Vec3b>(i, j) = img.at<Vec3b>(i % img.rows, j);
  11. }
  12. s = "D:/set/" + to_string(k+100) + ".png";
  13. imwrite(s, img2);
  14. }
  15. return 0;
  16. }

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

 然后全部变成同尺寸的图

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

图包下载

三,代码

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

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

完整代码V1:


  
  1. #include<iostream>
  2. #include<string>
  3. #include<vector>
  4. #include<algorithm>
  5. #include<map>
  6. #include<opencv2/opencv.hpp>
  7. #include<opencv2/highgui.hpp>
  8. #include<opencv2/core/mat.hpp>
  9. using namespace std;
  10. using namespace cv;
  11. #pragma comment(lib,"../x64/vc14/lib/opencv_world452.lib")
  12. #pragma comment(lib,"../x64/vc14/lib/opencv_world452d.lib")
  13. int row = 3;
  14. int theRatio = 4;
  15. int w = 400/ theRatio, h = 660/ theRatio, type = 16;
  16. vector<int>v;
  17. Mat imgs;
  18. Mat allImg[81];
  19. void draw(int k, int n)
  20. {
  21. int col = v.size() / row, r = k / col, c = k % col;
  22. Mat img = allImg[n];
  23. for (int i = 0; i < img.rows; i++)for (int j = 0; j < img.cols; j++)
  24. {
  25. imgs.at<Vec3b>(i + r * h, j + c * w) = img.at<Vec3b>(i, j);
  26. }
  27. }
  28. void draw(int k)//在第k张牌的位置出一张新牌
  29. {
  30. draw(k, rand() % 81);
  31. }
  32. void drawAll()//根据v来显示所有图片
  33. {
  34. int col = v.size() / row;
  35. imgs = Mat(Size(w * col, h * row), type);
  36. for (int i = 0; i < row * col; i++)draw(i, v[i]);
  37. }
  38. void Init()
  39. {
  40. for (int i = 0; i < 81; i++) {
  41. allImg[i] = imread("D:/set/img (" + to_string(i+1) + ").png", 1);
  42. resize(allImg[i], allImg[i], Size(w, h), 0, 0);
  43. }
  44. int col = v.size() / row;
  45. drawAll();
  46. }
  47. void add3()
  48. {
  49. v.push_back(rand() % 81);
  50. v.push_back(rand() % 81);
  51. v.push_back(rand() % 81);
  52. }
  53. void Play()
  54. {
  55. imshow("img", imgs);
  56. int a, b, c;
  57. waitKey(0);
  58. cout << "输入3张牌的序号(1-"<<v.size()<<"),0 代表无解\n";
  59. cin >> a;
  60. if (a <= 0 || a > v.size()) {
  61. add3();
  62. return Init();
  63. }
  64. cin >> b >> c;
  65. if (b <= 0 || b > v.size())return Play();
  66. if (c <= 0 || c > v.size())return Play();
  67. a--, b--, c--;
  68. vector<int>id = { a,b,c };
  69. sort(id.begin(), id.end());
  70. v.erase(v.begin() + c);
  71. v.erase(v.begin() + b);
  72. v.erase(v.begin() + a);
  73. if (v.size() < 12)add3();
  74. drawAll();
  75. }
  76. int main()
  77. {
  78. srand((unsigned)time(NULL));
  79. while(v.size() < 12)v.push_back(rand() % 81);
  80. int col = v.size() / row;
  81. imgs = Mat(Size(w * col, h * row), type);
  82. Init();
  83. while(true)Play();
  84. return 0;
  85. }

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

文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nameofcsdn/article/details/123776601

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。