poker

Table of Contents

~suzuki/lects/meta-ruby/lects/poker ~suzuki/lects/meta-ruby/lects/note

1 pokerゲームのテスト駆動開発

1.1 目的

ソフトウェア構成論で作ったポーカーを, rubyで作り直し,ruby での開発を体験してみましょう。

テスト駆動開発っぽくやってみましょう。

emacs org-mode でやりましょう。

1.2 ポーカーゲーム開発ストーリー

モジュール分けやモジュールの機能については,Prog Wikky - 講義内容 を参考にしてください。

1.3 テスト駆動開発については

1.4 test-unit

2 開発概要

2.1 クラスの構造

module Poker
  class Card
    
  end
  class Deck
    
  end
  class Hand
    
  end
  class Player
    
  end
  class Play
    
  end
end

2.2 ディレクトリ構造

~/COMM/bin/lstree ../poker

3 文芸的プログラムによる開発

例えばcardモジュールは,poker/card.org に作成し,org-babel の :tangle でtest/の下にテストを,src/の下にクラスを,作りましょう。

3.1 card module

3.1.1 card

3.1.2 Card.new, suit, no

  1. test
    require 'test/unit'
    require 'card'
    
    class Test_Card < Test::Unit::TestCase
      
      def setup
        @sa = Card.new(Card::SPADE, Card::ACE)
        @sk = Card.new(Card::SPADE, Card::KING)
      end
    
      def test_card
        assert_equal(Card, @sa.class)
        assert_equal(Card::SPADE, @sa.suit)
        assert_equal(Card::ACE, @sa.no)
        assert_equal(Card::CLUB, @sa.suit)
        assert_equal(Card::KING, @sa.no) 
     end
    end
    
    # C-C C-v C-t
    require 'rubygems'
    require 'test/unit'
    'end'
    
  2. 実装 card, .suit, .no
    # C-c C-v C-t 
    # card.rb
    
    class Card
      SPADE = 4
      HEART = 3
      DIAMOND = 2
      CLUB = 1
    
      ACE = 14
      KING = 13
      QUEEN = 12
      JACK = 11
    
      attr_reader :suit, :no
      
      def initialize(suit, no)
        @suit = suit
        @no = no
      end
    end
    
  3. テスト
        (defvar org-babel-sh-command "bash"
        "Command used to invoke a shell.
        This will be passed to  `shell-command-on-region'") ;;C-x C-e
    
    echo $SHELL
    
    ~/.rbenv/shims/ruby -I./src/ test/test_card.rb
    ruby -I./src/ test/test_card.rb
    echo 'end'
    

3.1.3 .compare

  1. test
    require 'test/unit'
    require 'card'
    
    class Test_Card_compare < Test::Unit::TestCase
      
      def setup
        @sa = Card.new(Card::SPADE, Card::ACE)
        @sk = Card.new(Card::SPADE, Card::KING)
        @ca = Card.new(Card::CLUB, Card::ACE)
        @ck = Card.new(Card::CLUB, Card::KING)
      end
    
      def test_card
        assert_equal(1, @sa.compare(sk))
        assert_equal(-1, @sk.compare(sa))
        assert_equal(0, @sk.compare(sk))
     end
    end
    
    # C-C C-v C-t
    require 'rubygems'
    require 'test/unit'
    'end'
    
  2. implement
  3. do test

3.1.4 .tos

  1. deck module
    1. deck
    2. Deck.new, .draw,
      1. test
        require 'test/unit'
        require 'card'
        require 'deck'
        
        class Test_Deck < Test::Unit::TestCase
          
          def setup
        
          end
        
          def test_deck
            assert_equal(Deck, @sa.class)
            assert_equal(Deck::SPADE, @sa.suit)
            assert_equal(Deck::ACE, @sa.no)
            @sa.suit=Deck::CLUB
            @sa.no=Deck::KING
            assert_equal(Deck::CLUB, @sa.suit)
            assert_equal(Deck::KING, @sa.no) 
         end
        end
        
      2. 実装 deck, .suit, .no
        # C-c C-v C-t 
        # deck.rb
        
        class Deck
          SPADE = 4
          HEART = 3
          DIAMOND = 2
          CLUB = 1
        
          ACE = 14
          KING = 13
          QUEEN = 12
          JACK = 11
        
          attr_accessor :suit, :no
          
          def initialize(suit, no)
            @suit = suit
            @no = no
          end
        
        end
        
      3. テスト
            (defvar org-babel-sh-command "bash"
            "Command used to invoke a shell.
            This will be passed to  `shell-command-on-region'")
        
        ruby -I./src/ test/test_deck.rb
        echo 'end'
        
    3. .compare
    4. .tos

      ##+include: hand.org ##+include: player.org ##+include: play.org

4 emacs/org-mode/ruby のこと

4.1 org-mode

4.1.1 ソースコードをファイルへ書き出す

C-C C-v C-t
#+BEGIN_SRC ruby :tangle example/test_card.rb :mkdirp yes
,require 'rubygems'
,require 'test/unit'
'end'
#+END_SRC
require 'rubygems'
require 'test/unit'
end'

4.1.2 ob-shell

  1. ob-sh.el ソースコード
    1. sh の shell 指定
      (defvar org-babel-sh-command "sh"
        "Command used to invoke a shell.
      This will be passed to  `shell-command-on-region'")
      
    2. sh-ブロックの ruby が ~/.rbenv/shims/ruby ではない時

      ~/.rbevn/shims/ruby が動かないときは, sh-ブロックに :session を指定して, 動かして,シェルバッファに移動して,

Author: Masayuki Suzuki

Created: 2015-12-19 土 19:33

Emacs 24.5.1 (Org mode 8.2.10)

Validate