老實說,如果用一個數組來記錄發牌的數目會很簡單,但是,由於設計類的時候我設計了isChoosen這個變量,所以,我是直接調用的這個變量查看的某張牌是否被選中了。
實現功能:
InitGame.h
#pragma once
#include "BasicCardGroup.h"
#include "PukeCards.h"
class InitGame {
BasicCardGroup player1;
BasicCardGroup player2;
BasicCardGroup player3;
BasicCardGroup player4;
BasicCardGroup leftcards;
PukeCards puke;
void get_handcards(BasicCardGroup& player);
void get_leftcards();
void view_handcards(BasicCardGroup& player);
public:
//獲取手牌
void player_get_handcards();
//展示所有手牌
void player_view_handcards();
//展示剩餘手牌
void view_leftcards();
InitGame();
};
InitGame.cpp
在發牌時遇到了一些問題,比如說,我一開始想要設置一個指針變量來指向撲克牌堆的,讓後通過引用來直接改變撲克的isChoosen屬性。但是後來發現,如果使用引用當隨機到的curnum重複的時候,會造成引用錯誤——引用無法重新賦值。並且這個錯誤在VS裏面不會報錯,只會無間斷的運行程序。並且由於一開始的類設定的原因,指針變量也不能使用。所以,我直接寫了一個宏定義。 #define curcard (puke.show_cardgroup()[curnum]) 將 curcard 直接替換成撲克卡組的當前撲克,從某些意義上,這也算是實現了引用,C++真是太有趣了。
#include "InitGame.h"
#include <iostream>
#define curcard (puke.show_cardgroup()[curnum])
using namespace std;
void InitGame::get_handcards(BasicCardGroup& player)
{
//升級遊戲需要獲取6張手牌,後期發牌可以添加多線程操作
for (int i = 0; i < 25; i++)
{
int curnum = (rand() % 108);
//如果當前卡牌未獲取
do {
if (!curcard.isChoosen) {
curcard.isChoosen = true;
player.set_cardgroup(curcard);
break;
}
else {
curnum = (curnum + 1) % 108;
continue;
}
} while (true);
}
}
void InitGame::get_leftcards()
{
for (auto& i : puke.show_cardgroup()) {
if (!i.isChoosen) {
leftcards.set_cardgroup(i);
}
}
}
void InitGame::player_get_handcards()
{
get_handcards(player1);
get_handcards(player2);
get_handcards(player3);
get_handcards(player4);
get_leftcards();
cout << "已完成發牌操作" << endl;
}
void InitGame::player_view_handcards()
{
cout << "player1 的手牌" << endl;
view_handcards(player1);
cout << endl;
cout << "player2 的手牌" << endl;
view_handcards(player2);
cout << endl;
cout << "player3 的手牌" << endl;
view_handcards(player3);
cout << endl;
cout << "player4 的手牌" << endl;
view_handcards(player4);
cout << endl;
}
void InitGame::view_handcards(BasicCardGroup& player)
{
player.view_cardgroup();
}
void InitGame::view_leftcards()
{
cout << "剩餘卡牌爲:" << endl;
leftcards.view_cardgroup();
}
InitGame::InitGame()
{
player_get_handcards();
}