找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 106|回复: 10

写个斗地主的!

[复制链接]

432

主题

3379

回帖

4673

积分

论坛元老

积分
4673
发表于 昨天 21:35 | 显示全部楼层 |阅读模式
// 文件: 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()
回复

使用道具 举报

432

主题

3379

回帖

4673

积分

论坛元老

积分
4673
 楼主| 发表于 昨天 21:36 | 显示全部楼层
网页链接 LandlordGameMode.generated,LandlordGameMode.generated) 端显示手牌
UFUNCTION(Client, Reliable)
void Client_UpdateHandCards(const TArray<ULandlordCard*>& Card
回复

使用道具 举报

432

主题

3379

回帖

4673

积分

论坛元老

积分
4673
 楼主| 发表于 昨天 21:36 | 显示全部楼层
UCLASS()
class MMOGAME_API ALandlordGameMode : public AGameMode
{
// ...原有代码...
// 当前最高叫分(0=不叫,1/2/3分)
UPROPERTY(Replicated)
int32 CurrentMaxBid = 0;
// 抢地主次数(用于抢地主阶段)
UPROPERTY(Replicated)
int32 GrabCount = 0;
// 玩家加倍状态(索引对应Players数组)
UPROPERTY(Replicated)
TArray<bool> PlayerDoubleStatus;
// 总倍数(底分*地主叫分*加倍次数)
UPROPERTY(Replicated)
int32 TotalMultiplier = 1;
};
回复

使用道具 举报

432

主题

3379

回帖

4673

积分

论坛元老

积分
4673
 楼主| 发表于 昨天 21:37 | 显示全部楼层
// 开始叫地主阶段
void ALandlordGameMode::StartBidPhase()
{
CurrentGamePhase = EGamePhase::BidLandlord;
CurrentPlayerIndex = FMath::RandRange(0, 2); // 随机先叫玩家
CurrentMaxBid = 0;
NotifyPlayerTurn(); // 通知客户端轮到谁叫分
}
// 处理玩家叫分(服务器端验证)
void ALandlordGameMode::Server_HandleBid(APlayerController* Player, int32 BidScore)
{
if (CurrentGamePhase != EGamePhase::BidLandlord) return;
int32 PlayerIdx = Players.Find (Player);
if (PlayerIdx != CurrentPlayerIndex) return;
// 叫分必须比当前最高分高,或不叫(0)
if (BidScore > 0 && BidScore <= CurrentMaxBid) return;
CurrentMaxBid = FMath::Max(CurrentMaxBid, BidScore);
// 通知所有玩家叫分结果
Multicast_UpdateBidStatus(PlayerIdx, BidScore);
// 判断是否结束叫分
if (CurrentMaxBid == 3 || (AllPlayersPassed() && CurrentMaxBid > 0))
{
DetermineLandlord();
}
else
{
AdvanceToNextPlayer();
}
}
// 确定地主
void ALandlordGameMode::DetermineLandlord()
{
LandlordIndex = CurrentPlayerIndex; // 最后叫分的玩家成为地主
AddBottomCardsToLandlord(); // 分配底牌
EnterDoublePhase(); // 进入加倍阶段
}
回复

使用道具 举报

432

主题

3379

回帖

4673

积分

论坛元老

积分
4673
 楼主| 发表于 昨天 21:37 | 显示全部楼层
// 进入加倍阶段
void ALandlordGameMode::EnterDoublePhase()
{
CurrentGamePhase = EGamePhase::DoubleBet;
PlayerDoubleStatus.Init (false, Players.Num());
NotifyDoublePhaseStart(); // 通知客户端显示加倍UI
}
// 处理玩家加倍选择
void ALandlordGameMode::Server_HandleDouble(APlayerController* Player, bool bDouble)
{
int32 PlayerIdx = Players.Find(Player);
if (PlayerIdx == INDEX_NONE) return;
PlayerDoubleStatus[PlayerIdx] = bDouble;
// 更新总倍数
if (bDouble) TotalMultiplier *= 2;
// 所有玩家选择完毕后开始出牌
if (PlayerDoubleStatus.Find(false) == INDEX_NONE)
{
StartPlayingPhase();
}
}
回复

使用道具 举报

424

主题

3321

回帖

4602

积分

论坛元老

积分
4602
发表于 昨天 21:38 | 显示全部楼层
6
回复

使用道具 举报

432

主题

3379

回帖

4673

积分

论坛元老

积分
4673
 楼主| 发表于 昨天 21:38 | 显示全部楼层
// 游戏结束时计算仙乐豆变化
void ALandlordGameMode::CalculateGameResult()
{
int32 BaseScore = 100; // 基础分
int32 FinalScore = BaseScore * TotalMultiplier;
// 地主胜利
if (bLandlordWin)
{
Players[LandlordIndex]->AddCurrency(FinalScore * 2);
网页链接  ([&](APlayerController* Player) {
Player->DeductCurrency(FinalScore);
});
}
else // 农民胜利
{
Players[LandlordIndex]->DeductCurrency(FinalScore * 2);
OtherPlayers.ForEach([&](APlayerController* Player) {
Player->AddCurrency(FinalScore);
});
}
}
回复

使用道具 举报

428

主题

3202

回帖

4493

积分

论坛元老

积分
4493
发表于 昨天 21:38 | 显示全部楼层
你这样我们怎么摸鱼

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

425

主题

3356

回帖

4640

积分

论坛元老

积分
4640
发表于 昨天 21:39 | 显示全部楼层
这完全不像11个G的代码啊!几个k吧? 11个G到底更新了个麻将?
回复

使用道具 举报

450

主题

3363

回帖

4719

积分

论坛元老

积分
4719
发表于 昨天 21:39 | 显示全部楼层
你这样搞不能混工资了,太不懂事了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|诛仙论坛 |网站地图|网站地图

GMT+8, 2025-6-20 14:40 , Processed in 0.084164 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表