c++揭秘2024春晚刘谦老师的魔术,快来看看吧

封面:

c++揭秘2024春晚刘谦老师的魔术,快来看看吧_第1张图片

源码:

#include 
#include 
#include  

using namespace std;

struct Card {
	int value; // 用数字代表扑克牌,简化处理
};

// 打印牌堆
void printDeck(const vector& deck) {
	for (auto& card : deck) {
		cout << card.value << " ";
	}
	cout << endl;
}

// 步骤 2: 根据给定的名字字数移动牌
void moveCardsForName(vector& deck, int nameLength) {
	rotate(deck.begin(), deck.begin() + nameLength, deck.end());
}

// 步骤 3: 取出牌堆顶的牌并放置在一旁
Card takeTopCard(vector& deck) {
	Card topCard = deck.front();
	deck.erase(deck.begin()); // 移除顶部牌
	return topCard;
}

// 步骤 4: 根据地域移动牌
void moveCardsByRegion(vector& deck, int cardsToMove) {
	// 假设“地域”只影响移动的牌数
	rotate(deck.begin(), deck.begin() + cardsToMove, deck.end());
}

// 步骤 5: 根据性别移除牌
void removeCardsByGender(vector& deck, char gender) {
	int removeCount = (gender == 'M') ? 1 : 2;
	deck.erase(deck.begin(), deck.begin() + removeCount);
}

// 步骤 6: 循环移动牌
void cycleCards(vector& deck, const string& phrase) {
	for (size_t i = 0; i < phrase.length(); ++i) {
		Card card = deck.front();
		deck.erase(deck.begin());
		deck.push_back(card); // 将顶部牌移动到底部
	}
}

// 步骤 7: 执行最终操作,直到只剩一张牌,然后比较
bool finalOperationAndCompare(vector& deck, const Card& asideCard) {
	while (deck.size() > 1) {
		cout << "弃牌之前手里卡牌为: ";
		printDeck(deck);
		
		deck.push_back(deck.front()); // 将顶部牌移动到底部
		cout << "将顶部卡牌移至底部: ";
		printDeck(deck);
		
		deck.erase(deck.begin()); // 移除现在的顶部牌(原第二张牌,刚才移动过的)
		cout << "取出新的卡牌: ";
		printDeck(deck);
		
		deck.erase(deck.begin()); // 再次移除顶部牌,对应扔掉的操作
		cout << "移除下一张顶牌(弃牌): ";
		printDeck(deck);
	}
	
	cout << "最后一张牌为: " << deck.front().value << endl;
	cout << "之前步骤3,藏在屁股后面的卡牌为: " << asideCard.value << endl;
	
	return deck.front().value == asideCard.value;
}

int main() {
	// 初始化牌堆,每张牌各有两张
	vector deck = { {1}, {2}, {3}, {4}, {1}, {2}, {3}, {4} };
	
	cout << "初始卡牌: ";
	printDeck(deck);
	
	// 模拟魔术步骤
	moveCardsForName(deck, 3); // 假设名字长度为3
	cout << "移动卡牌后的名称: ";
	printDeck(deck);
	
	Card asideCard = takeTopCard(deck); // 执行步骤3并记下牌堆顶的牌
	cout << "抽取第一张卡牌藏在屁股后面: ";
	printDeck(deck);
	cout << "藏起来的卡牌是: " << asideCard.value << endl;
	
	moveCardsByRegion(deck, 2); // 假设是北方人
	cout << "执行步骤4,判断南北方人: ";
	printDeck(deck);
	
	removeCardsByGender(deck, 'M'); // 假设是男性
	cout << "执行步骤5,按性别删除卡牌: ";
	printDeck(deck);
	
	cycleCards(deck, "见证奇迹的时刻"); // 循环移动牌
	cout << "执行步骤6,循环移动卡牌后: ";
	printDeck(deck);
	
	cout << "执行步骤7,从牌堆顶开始,每次先将牌堆顶的一张牌放在牌堆底,再扔掉牌堆顶的一张牌,重复以上操作直到只剩一张牌" << endl;
	// 执行最终操作并比较
	bool isMagicSuccessful = finalOperationAndCompare(deck, asideCard);
	if (isMagicSuccessful) {
		cout << "魔术成功!最后一张牌与预留的牌相符。" << endl;
	}
	else {
		cout << "魔术失败!最后一张牌与预留的牌不符。" << endl;
	}
	
	return 0;
}

点评:

你这代码写得挺有意思的,模拟了刘谦老师在春晚的魔术步骤。代码逻辑清晰,每个步骤都通过函数实现了,这样方便理解和调试。

我注意到,你的Card结构体里只有一个value字段,简化了扑克牌的表示。这样做确实能减少代码复杂度,专注于魔术逻辑的实现。

moveCardsForNamemoveCardsByRegioncycleCards这些函数都用到了std::rotate,这是一个很高效的算法,用于旋转容器中的元素。你正确地根据名字长度、地域影响的牌数和短语长度来旋转牌堆。

removeCardsByGender函数根据性别移除牌,这里假设男性移除一张,其他性别移除两张,这个逻辑也挺有意思的,算是给魔术增加了一些随机性。

finalOperationAndCompare函数实现了魔术的最后一步,通过循环移动和移除牌堆顶的牌,直到只剩一张牌,然后和之前预留的牌进行比较。这个过程中,你还打印了每一步的牌堆状态,方便跟踪和调试。

整体来说,你的代码实现了一个很有趣的魔术模拟,逻辑清晰,代码简洁。如果有什么需要改进或者优化的地方,欢迎随时交流。

你可能感兴趣的:(c++,c++,开发语言)