c++扑克翻牌游戏

news/2024/11/8 0:40:54/

这是我大一的c++课设作业,代码是自己写的,如果需要用,请私信我。

问题描述
“记忆匹配”( memory matching game )是小孩子喜欢玩的一个益智游戏。首先准备好一墩牌,它由几个“对儿”组成。例如,假定一墩牌里有6张牌,2张是“1”,2张是“2”,另外2张是“3”。现在洗好这墩牌,然后全部反扣在桌面上。玩家选择2张反扣着的牌,把它们翻过来,如果恰好是“一对儿”,就保持它们现在的样子,不要再反扣回去。相反,如果不是“一对儿,就把它们反扣回去。一直这样翻牌,直到最后所有牌都正面朝上。

写一个程序来完成这个记忆游戏。要求使用16张牌,他们按4 x 4排列,用1~8的数字成对标记这些牌。程序应该允许玩家通过一个坐标系来指定要翻的牌。


#include <iostream>
#include <fstream> //文件操作头文件
#include <ctime>   //随机数的头文件
#include <cstdlib>
#include <cstdio>
#include <windows.h> //延时函数的头文件
using namespace std;//定义一个Game类
class Game
{
private:int data[4][4];    //记录翻牌后的数据int display[4][4]; //记录界面上的数据int selected[2];   //定义一个数组,记录用户通过坐标选择的两个数
public:Game() {};virtual ~Game() {}; //虚析构函数void init() //初始化数据{// 初始化所有元素为0for (int j = 0; j < 4; j++){for (int k = 0; k < 4; k++){data[j][k] = 0;}}// 生成随机数int data1[16] = { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8 }; //一个临时数组srand(time(NULL));                                                      //生成随机数for (int i = 0; i < 16; i++){int j = rand() % (16 - i) + i; //随机数的范围if (j != i){// 交换操作int temp = data1[i];data1[i] = data1[j];data1[j] = temp;}}// 将data1数组分成四行四列,形成初始矩阵displayint index = 0;for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){display[i][j] = data1[index++];}}// 将display矩阵(生成的矩阵)写入文件infileofstream fout("infile.txt", ios::app); //以追加的方式打开文件夹for (int j = 0; j < 4; j++){for (int k = 0; k < 4; k++){fout << display[j][k] << ",";}fout << endl;}fout.close(); //关闭文件}//显示界面函数,返回值是布尔类型bool show(int x1, int y1, int x2, int y2){data[x1][y1] = display[x1][y1];//记录界面上的数据赋值给记录翻牌后的数据data[x2][y2] = display[x2][y2];//写入数据到outfile文件,outfile文件就是每次输入两个位置都会记录在里面,然后每次玩游戏之前会清空两个文件ofstream fout("outfile.txt", ios::app);fout << "选择点:" << endl;fout << "[" << x1 + 1 << "," << y1 + 1 << "]  and  [" << x2 + 1 << "," << y2 + 1 << "]" << endl;for (int j = 0; j < 4; j++){for (int k = 0; k < 4; k++){if (data[j][k] == 0){fout << "*"<< "  ";}elsefout << data[j][k] << "  ";}fout << endl;}fout.close(); //关闭文件selected[0] = display[x1][y1];selected[1] = display[x2][y2];for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){if (data[i][j] == 0) //如果为0,则输出*号,否则输出数字{cout << "*  ";}elsecout << data[i][j] << "  ";}cout << endl;cout << endl;}//判断选择的两个数是否相等if (selected[0] == selected[1]){data[x1][y1] = display[x1][y1];data[x2][y2] = display[x2][y2];cout << "bingo!";//选择的两个数是一对}else{data[x1][y1] = 0;data[x2][y2] = 0;}//程序延时3sSleep(3 * 1000);//输入大量换行符,清空界面for (int i = 0; i < 20; i++){cout << endl;}//打印翻转后的界面for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){if (data[i][j] == 0)cout << "*"<< "  ";elsecout << data[i][j] << "  ";;}cout << endl;cout << endl;}//返回计数值if (selected[0] == selected[1]){return true;}elsereturn false;}
}; //Game类结束//输出函数
void print()
{for (int j = 0; j < 4; j++){for (int k = 0; k < 4; k++){cout << "* ";}cout << endl;cout << endl;}
}// 输入函数
void Input(int& x1, int& y1, int& x2, int& y2)//形参是引用
{while (true)//while循环{cout << "Please input the location: x1 y1 x2 y2" << endl;cin >> x1 >> y1 >> x2 >> y2;// 判断输入的坐标是否在范围内if (x1 <= 0 || y1 <= 0 || x2 <= 0 || y2 <= 0 || x1 >= 5 || y1 >= 5 || x2 >= 5 || y2 >= 5){//超出范围,则提示用户输入cout << "Out of the range, please try again!" << endl<< endl;continue;}else{return;}}
}//游戏运行函数
void PlayGame()
{int x1, y1, x2, y2; // 用户输入的坐标int count = 0;      //对用户正确输入点进行计数Game game;game.init();print();// 只要匹配的对数不到8对,就一直进行游戏for (int match_num = 0; match_num < 8;){Input(x1, y1, x2, y2);count++; //计数if (game.show(x1 - 1, y1 - 1, x2 - 1, y2 - 1))match_num++;}cout << "Game over! attempt: " << count << endl; //输出次数
}//主函数int main()
{char flag;cout << "Whether to start play?(Y/N)" << endl; //是否开始游戏cin >> flag;while (flag == 'Y' || flag == 'y'){// 删除之前已保存的文件remove("infile.txt");remove("outfile.txt");PlayGame(); //玩游戏的函数cout << "Try  again?" << endl;cin >> flag;}cout << "Game over!";return 0;
}

http://www.ppmy.cn/news/218903.html

相关文章

数字动态翻牌器

数字动态翻牌器 最近项目里使用到了数字翻牌器&#xff0c;于是自己写了一个&#xff0c;动态的翻牌器 第一步创建一个组件页面&#xff0c;NumberCount.vue 思路&#xff1a;大概就是显示几位数&#xff0c;然后从0开始滚动到当前的数值的位置&#xff0c;在每一个位置都有…

翻纸牌游戏

有一种纸牌游戏&#xff0c;很有意思&#xff0c;给你N张纸牌&#xff0c;一字排开&#xff0c;纸牌有正反两面&#xff0c;开始的纸牌可能是一种乱的状态&#xff08;有些朝正&#xff0c;有些朝反&#xff09;&#xff0c;现在你需要整理这些纸牌。但是麻烦的是&#xff0c;每…

翻牌游戏概率模拟

假如有9张扣着的牌&#xff0c;其中7张普通牌各自翻出猫的概率相同&#xff0c;比如5%能翻出来( 95%翻出来不是猫)&#xff0c;一 张简单牌&#xff0c;翻出来猫的概率是20%&#xff0c;一张困难牌&#xff0c;翻出来猫的概率是1%。我现在有三轮翻牌机会&#xff0c;每轮都可以…

Js 简单实现翻牌小游戏

1.简介 非常简单的一个网络消消乐翻牌小游戏的实现&#xff0c;代码量较少&#xff0c;不过遇到的bug和自行开发的步骤十分有纪念意义。 2.核心代码块 生成随机数列&#xff0c;确定图片随机分布 function getImgIndex(is){var index parseInt(Math.random()*8)1;if(is[in…

翻牌动画

效果如下(可兼容移动端)&#xff1a; css部分&#xff1a; <style type"text/css"> *, *:before, *:after { box-sizing: border-box; } html { font-size: 18px; line-height: 1.5; font-weight: 300; color: #333; font-family: "Nunito …

js 翻牌小游戏

js 翻牌小游戏 效果图 链接 PC端翻牌小游戏 需求分析 生成两组顺序随机的1-8数据卡片需要有翻转效果两次翻转数据不相等&#xff0c;回复原状两次翻转数据相等&#xff0c;卡片相等&#xff0c;不能再被点击当所有卡片不能被点击游戏结束限制最大点击次数50次 HTML结构 &…

JAVA记忆翻牌游戏制作

游戏功能需求说明代码编写 1 框架搭建2 主要技术难点 21 图片面板对应的图片索引获取22 图片面板 3 完整代码 游戏截图 1启动后界面2开始游戏界面3游戏结束界面 1 游戏功能需求说明 该游戏主要模拟常见的翻牌游戏&#xff0c;即找到所有两两相同的牌认为游戏成功&#xff0c;主…

js实现翻牌游戏

在我的项目中需要在里面添加一个翻牌游戏&#xff0c;就研究了一下&#xff0c;在这里只实现了基本的效果。不多说&#xff0c;和大家分享一下。 说到翻牌游戏&#xff0c;大致分为以下几个步骤&#xff1a; 绘制正反面卡牌-------------->洗牌----------------------->…