|
// 文件: LandlordGameMode.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameMode.h"
#include "LandlordCard.h"
#include "LandlordGameMode.generated.h"
// 牌型类型
UENUM(BlueprintType)
enum class ECardPattern : uint8
{
Single, // 单张
Pair, // 对子
Triple, // 三张
Sequence, // 顺子
Bomb, // 炸弹
Rocket // 王炸
};
// 游戏阶段
UENUM()
enum class EGamePhase : uint8
{
DealCards, // 发牌
BidLandlord, // 叫地主
Playing, // 出牌阶段
GameOver
};
UCLASS()
class MMOGAME_API ALandlordGameMode : public AGameMode
{
GENERATED_BODY()
public:
// 初始化游戏
UFUNCTION(BlueprintCallable, Category = "Landlord")
void StartGame(const TArray<APlayerController*>& Players);
// 网络同步属性
UPROPERTY(ReplicatedUsing = OnRep_GameState)
FString CurrentGameState;
protected:
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
private:
// 玩家列表(最多3人)
UPROPERTY(Replicated)
TArray<APlayerController*> Players;
// 当前出牌玩家索引
UPROPERTY(Replicated)
int32 CurrentPlayerIndex = 0;
// 地主索引
UPROPERTY(Replicated)
int32 LandlordIndex = -1;
// 当前桌面牌组
UPROPERTY(Replicated)
TArray<ULandlordCard*> CurrentTableCards;
// 生成完整牌组
void GenerateDeck();
// 处理玩家出牌
UFUNCTION(Server, Reliable, WithValidation)
void Server_PlayCards(APlayerController* Player, const TArray<ULandlordCard*>& Cards);
// 验证牌型合法性
bool ValidateCardPattern(const TArray<ULandlordCard*>& Cards);
// 判断能否压过上家牌
bool CanBeatPreviousCards(const TArray<ULandlordCard*>& NewCards);
// 同步游戏状态
UFUNCTION()
void OnRep_GameState();
};
// 文件: LandlordPlayerController.h
UCLASS()
class MMOGAME_API ALandlordPlayerController : public APlayerController
{
GENERATED_BODY() |
|