`
pascal4123
  • 浏览: 114692 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一种傻纸牌游戏的Erlang实现

    博客分类:
  • FP
阅读更多

小时候,曾经玩一种2人的纸牌优秀,洗牌之后,一人一半,然后轮流出1张牌,压在牌桌上,越压越高,如果有人出的牌和前面某张相同的点,就把这两张牌中间的牌一起赢取,收回到自己的牌下面。这样下去直到有一方手中无牌认输。

其实,洗牌之后,就已经注定输赢了。

 

 

-module(cards).
-export([shuffle/0]).
-include("card.hrl").

rand_list(L1, L2)->
    case length(L2) of
    0 -> L1;
    N-> 
        Nth = random:uniform(N),
        Elem = lists:nth(Nth,L2),
        L3 = lists:delete(Elem,L2),
        rand_list([Elem|L1], L3)
    end.
    
create_rand_list()->
    L0 = lists:seq(1,4*13,1),
    random:seed(),
    rand_list([],L0).
    
create_times4_list(L)->
    lists:map(fun (X)->lists:map(fun(Y)->#card{value=X,suit=Y} end,?suit_set) end, L).

make_deck([H|Lpos],L2)->
    if 
    length(Lpos) == 0  ->[lists:nth(H, L2)];
    true->[lists:nth(H, L2)|make_deck(Lpos, L2)]
    end.
        
shuffle()->
    L0 = lists:seq(1,13,1),
    L1 = create_times4_list(L0),    
    L2 = lists:flatten(L1),
    L3=create_rand_list(),
    make_deck(L3,L2).

 

 

-module(game).
-export([play_game/0,dealer/0,player/2]).
-include("card.hrl").

play_game() ->
    P0=spawn(game, dealer, []),
    io:format("spawn dealer ~p~n",[P0]).

dealer() ->
    random:seed(now()),                   
    DealerPid = self(),              
    Deck = cards:shuffle(),
    {P1Cards, P2Cards} = lists:split(trunc(length(Deck) / 2), Deck),
    P1 = spawn(game, player, [DealerPid, P1Cards]),
    io:format("spawn player ~p with ~p~n",[P1, P1Cards]), 
    P2 = spawn(game, player, [DealerPid, P2Cards]),
    io:format("spawn player ~p with ~p~n",[P2, P2Cards]),
    P2!{show_card}, 
    dealer([P1, P2], await_card, P2, []). 

loc(Card, [H|NCards]) ->
    if 
        Card#card.value ==  H#card.value -> 1;
        length(NCards) == 0 ->  
            error_logger:warning_msg("no same card!~n"),
            -1024;
        true  -> loc(Card, NCards) + 1
    end.
    
win_card(H,NCards) ->
    Nth = loc(H, NCards),
    if 
        Nth > 0 ->
            {First, Second} = lists:split(Nth, NCards),
            {[H|First], Second};
        true -> []
    end.

opponent(Pids, Pid)->
    [P1, P2] = Pids,
    if 
        P1 == Pid -> P2;
        true -> P1
    end.
               
dealer(Pids, State, Pid, NCards) ->
    io:format("~p ~p~n",[State, NCards]),
    case State of
        await_card ->          
            receive
                {accept, Pid, Card} ->
                    dealer(Pids, check_cards, Pid, [Card|NCards]);
                {give_up, Pid} ->
                    io:format("~p give up! ~p is the winner~n", [Pid, opponent(Pids, Pid)]),
                    end_game(Pids)
            after 2000 ->
                    io:format("~p timeout! ~p is the winner~n", [Pid, opponent(Pids, Pid)]),
                    end_game(Pids)                                      
            end;
        check_cards ->
            [TopCard|RemCards] =  NCards,
            case lists:member(TopCard#card.value, lists:map(fun(X)->X#card.value end,RemCards)) of
                true ->
                    {WinnedCards, RemtainedCards} = win_card(TopCard, RemCards),
                    Pid ! {give_card, WinnedCards},
                    dealer(Pids, await_card, Pid, RemtainedCards);        
                false ->
                    opponent(Pids,Pid)! {show_card},
                    dealer(Pids, await_card, opponent(Pids,Pid), NCards)
            end
    end.
    
end_game(Pids) ->
    lists:foreach(fun(Process) -> exit(Process, kill) end, Pids),
    io:format("Game finished.~n").


player(Dealer, Cards) ->
    receive
        {show_card} ->
            if length(Cards) =< 0 ->         
                Dealer!{give_up, self()};
                true ->
                [H|RemCards] = Cards,                  
                Dealer!{accept, self(), H},
                player(Dealer, RemCards)
            end;
        {give_card, GivenCards} ->
            [H|RemCards] = Cards++GivenCards,
            Dealer!{accept, self(), H},
            player(Dealer, RemCards)
    end. 

 

card.hrl:

 

-define(suit_set, ["Clubs","Diamonds","Hearts","Spades"]).
-record(card, {value, suit}).
 

 

 

>erlc cards.erl

>erlc games.erl

>erl

game:play_game().

 

<0.322.0> give up! <0.323.0> is the winner

Game finished

 

    

 

分享到:
评论

相关推荐

    erlang ranch实现的游戏tcp服务器

    标题"erlang ranch实现的游戏tcp服务器"表明我们将探讨如何利用Ranch库来创建一个针对游戏场景的TCP服务器。在这个项目中,我们可能涉及到以下几个核心知识点: 1. **Erlang语言基础**:Erlang是一种函数式编程语言...

    Erlang游戏.zip

    Erlang是一种面向并发的、函数式编程语言,最初由爱立信开发,用于构建高可用性、分布式系统。在Erlang中,游戏开发是一个有趣且富有挑战性的应用领域,因为它涉及到大量的并发处理和实时交互。让我们深入探讨Erlang...

    erlang的小型游戏服务器

    本项目是一个基于Erlang的小型游戏服务器,使用了Mnesia数据库来存储游戏数据。 Mnesia是Erlang内置的一个分布式数据库管理系统,支持事务处理和实时查询,非常适合实时性要求高的游戏场景。在这个小型游戏服务器中...

    erlang的timer和实现机制

    Erlang是一种面向并发的、动态类型的编程语言,尤其适合构建高可用性和容错性的分布式系统。在Erlang中,`timer`模块是用于处理延时操作和定时任务的关键工具,它提供了丰富的功能,使得开发者能够优雅地处理时间...

    erlang编程 Introducing Erlang

    Erlang是一种函数式编程语言,由爱立信在1986年开发,主要用于构建高可用性、容错性和并发性的分布式系统。"Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,旨在帮助初学者理解和掌握Erlang的核心...

    Erlang emulator 实现分析

    Erlang emulator 实现分析Erlang emulator 实现分析

    KMP(Erlang)代码实现

    Erlang是一种面向并发的编程语言,它采用轻量级进程以及消息传递模型,非常适合于编写并发和分布式系统。Erlang的函数式编程特性以及对模式匹配的支持,为实现KMP算法提供了便利。 在给定的文件内容中,通过Erlang...

    Erlang游戏程序学习完整PDF手册

    Erlang是一种面向并发的、函数式编程语言,特别适合于构建高可靠性、分布式系统,尤其是在游戏开发领域中表现出色。这份"Erlang游戏程序学习完整PDF手册"是一份全面介绍Erlang在游戏开发中应用的学习资料,包含了...

    erlang实现的网游服务器(OpenPoker系统)

    erlang实现的网游服务器(OpenPoker系统)erlang实现的网游服务器(OpenPoker系统)erlang实现的网游服务器(OpenPoker系统)

    Erlang-game-server开发实践.pdf

    * 游戏逻辑层:使用Erlang的Actor模型和gen_fsm行为树来实现游戏逻辑。 * 网络层:使用Ranch和Cowboy框架来实现网络层,处理客户端的连接和通信。 * 数据库层:使用Erlang的ETS、Mnesia、MySQL、MongoDB等数据库来...

    erlang中文基础教程

    Erlang 编程语言是一种功能强大且灵活的编程语言,它提供了一个交互式的 shell 环境,允许用户在其中编写和运行代码。 Erlang Shell 是一个命令行交互环境,类似于 UNIX 和 LINUX 系统的命令行模式。 1. Erlang ...

    远古封神+英雄远征的ERLANG游戏服务器代码

    ERLANG是一种为并发、分布式和容错系统设计的函数式编程语言,因其在实时系统和大规模并发处理中的优秀性能而被广泛应用于游戏服务器开发。这份压缩包包含了这两款游戏的Erlang服务器源码,为深入理解游戏服务器的...

    erlang资源

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,用于构建高可用性、分布式和实时系统。这个“erlang资源”包含两本PDF书籍——《Erlang并发编程》和《Erlang入门手册》,它们是深入...

    Erlang实现遗传算法.docx

    ### Erlang 实现遗传算法详解 #### 一、引言 遗传算法(Genetic Algorithm, GA)是一种模拟自然界中生物进化过程的优化搜索方法。它借鉴了自然选择、遗传、变异等生物进化的机制,通过迭代的方式寻找问题的最优解...

    Erlang官网下载过慢

    Erlang是一种面向并发的、函数式编程语言,主要用于构建高度可扩展的、容错性强的分布式系统。在IT行业中,Erlang因其强大的实时性和处理大量并发连接的能力而被广泛应用于电信、互联网基础设施和实时系统。RabbitMQ...

    erlang port driver test

    Port Driver 提供了一种方式,使得 Erlang 系统能够与外部世界交互,执行低级别的I/O操作或调用非Erlang代码实现的高效算法。 标题 "erlang port driver test" 指的是一个测试项目,这个项目专注于验证和测试 ...

    erlang_gproc_扩展实现Erlang的全局ets

    Erlang是一种面向并发的、函数式编程语言,被广泛应用于分布式系统和高可用性服务。在Erlang中,ETS(Erlang Term Storage)是内置的一种高效、内存中的数据库,用于存储和检索Erlang术语。然而,ETS的一个限制是它...

Global site tag (gtag.js) - Google Analytics