#include<iostream>
#include<cstdlib>//有rand函数，可以生成随机数
#include<ctime>//有time函数，获得当前系统时间
#include<windows.h>//操作系统相关的命令，使用这个头文件 
using namespace std;
int num[5][5];//下标从1开始使用，存储4x4的二维数组，存储卡片背面的数字
int f[9];//记录1-8的数字每个数字出现了几次（0-1之间的次数是合法的） 
int cnt;//玩游戏的轮数 
bool arr[5][5];//记录每张卡牌是否已经被翻开，初始值0（false）默认值没翻开 
int main(){
	cout<<"记忆卡片游戏规则"<<endl;
	cout<<"现有16张数字卡牌，由数字1到8组成，每个数字只出现2次"<<endl; //Ctrl+e快速复制当前行 
	cout<<"游戏者需要将卡牌翻至背面，找到所有相同数字的卡牌"<<endl; 
	cout<<"每一轮只允许翻两张卡牌"<<endl; 
	cout<<"如果卡牌数字相同，翻牌成功，保留数字显示"<<endl; 
	cout<<"如果卡牌数字不相同，翻牌失败，返回原来的背面"<<endl; 
	cout<<"测试游戏者找到所有相同数字卡牌所需的轮数"<<endl; 
	cout<<"按下任意按键开始"<<endl; 
	system("pause");//暂停，直至游戏者按下任意键再继续游戏
	cout<<endl; 
	srand(time(0));//设置随机数的种子，给生成随机数的函数rand做的准备工作
	//1、用随机数填充4x4的方阵里的所有数字卡牌，规则是由数字1到8组成，每个数字只出现2次 
	for(int i=1;i<=4;i++){
		for(int j=1;j<=4;j++){
			while(1){//循环生成随机数，判断这个数是否次数不到2次才使用此数字，退出循环 
				int temp=rand()%8+1;//生成1到8之间的一个随机数字
				if(f[temp]<2){//使用temp数字次数不到2次，可以使用它 
					num[i][j]=temp;//使用这个数字放在第i行第j列里 
					f[temp]++;//temp使用次数加1 
					break;//退出循环 
				} 
			} 
		}
	} 
	//2、显示4x4的方阵里的所有数字卡牌的*那面
	for(int i=1;i<=4;i++){
		for(int j=1;j<=4;j++){
			cout<<"* ";
		}
		cout<<endl;
	} 
	//3开始游戏：进入循环
	while(1){ 
		cnt++;//进入一次循环，就是一轮游戏
		int sum=0;//已经翻出来的牌的个数，初始值是0
		cout<<"请输入要翻开的第一张卡牌的行号和列号：";
		int ix,iy;
		cin>>ix>>iy;
		arr[ix][iy]=true;//标记第ix行第iy列这张卡牌已经被翻开
		system("cls");//清除控制台的屏幕（之前显示的所有信息都会被清除）
		for(int i=1;i<=4;i++){
			for(int j=1;j<=4;j++){
				if(arr[i][j]) cout<<num[i][j]<<" ";//如果已经被翻开，显示数字 
				else cout<<"* ";//否则就显示* 
			}
			cout<<endl; 
		} 
		cout<<"请输入要翻开的第二张卡牌的行号和列号：";
		int ia,ib;
		cin>>ia>>ib;
		arr[ia][ib]=true;//标记第ia行第ib列这张卡牌已经被翻开
		system("cls");//清除控制台的屏幕（之前显示的所有信息都会被清除）
		for(int i=1;i<=4;i++){
			for(int j=1;j<=4;j++){
				if(arr[i][j]) cout<<num[i][j]<<" ";//如果已经被翻开，显示数字 
				else cout<<"* ";//否则就显示* 
			}
			cout<<endl; 
		} 
		if(num[ix][iy]==num[ia][ib]){//判断被翻开的两张牌上的数字是否是一样的 
			cout<<"恭喜您，本轮翻牌成功!"<<endl; 
		} else{
			cout<<"很遗憾，本轮翻牌失败！"<<endl;
			arr[ix][iy]=false;//标记为未被翻牌成功的状态，下轮还是显示* 
			arr[ia][ib]=false;//标记为未被翻牌成功的状态，下轮还是显示* 
		}
		cout<<"2秒后进入下一轮"<<endl;
		Sleep(2000);//休眠2秒，停顿2000毫秒后，再继续运行程序 
		system("cls");//清除屏幕内容
		for(int i=1;i<=4;i++){
			for(int j=1;j<=4;j++){
				if(arr[i][j]) cout<<num[i][j]<<" ";//如果已经被翻开，显示数字 
				else cout<<"* ";//否则就显示* 
			}
			cout<<endl; 
		}
		if(sum==16){//所有牌都被翻过来了 
			cout<<endl;
			cout<<"一共经过"<<cnt<<"轮，才完成整个游戏的任务！"<<endl;
			return 0;//程序结束 
		} 
	} 
	return 0;
}
//1206004-记忆卡牌游戏.cpp
