Fortran

トランプゲーム(未完)

能書き

トランプ大統領の国連演説が良かったので、トランプゲームを作ろうと思いました。

しかし、眠いので途中まで。

実行結果 ポーカーゲーム

手札交換無し、判定は目視で。
本当はアメリカン・ページワンを作りたかったので、またそのうち。

  heart    4    club     Q
  club     5    heart    5
  club     6    club     4
  diamond  3    spade    J
  club     7    spade    6
 続行するには何かキーを押してください . . .

ソースプログラム

半分に割って、交互に並べるきり方の、逆過程をやったのですが、

        deck = [deck(::2), deck(2::2)]  

全くきれずに団子になるので、任意の場所で割って乗せるきり方を加えました。

    module m_cards
      implicit none
      character(len = *), parameter :: mark(*) = ['club', 'diamond', 'heart', 'spade']
      character(len = 2), parameter :: num (*) = [' A', ' 2', ' 3', ' 4', ' 5', ' 6', ' 7', ' 8' ,' 9', '10', ' J', ' Q', ' K']
      enum, bind(c) 
        enumerator :: club, diamond, heart, spade
        enumerator :: ace,  jack = 11, queen, king
      end enum

      integer, parameter :: noc = 52, ns = 4, nc = noc / ns      
      type :: t_card
        character(len = len(mark(1))) :: mark 
        character(len = 2) :: num
      end type    
    contains
      type(t_card) function to_card(i) 
        integer, intent(in) :: i
        to_card = t_card( mark((i - 1) / nc + 1), num(nc + modulo(i, -nc)) )
      end function to_card
    end module m_cards

    program Console2
      use m_cards
      implicit none
      type (t_card) :: hands(5, 2)
      integer :: i, j, k, n, deck(52)
      real :: r
      forall (i = 1:noc) deck(i) = i   ! [1:noc]
      call random_seed()
      call random_number(r)
      n = 10 + int(200 * r)
      ! shuffle
      do i = 1, n
        deck = [deck(2::2), deck(::2)]    
        call random_number(r)
        n = int(noc * r) + 1
        deck = [deck(n:), deck(:n - 1)]
      end do
      ! deal
      k = 0 
      do i = 1, size(hands, 1)
        do j = 1, size(hands, 2)
          k = k + 1 
          hands(i, j) = to_card(deck(k))  
        end do    
      end do
      ! print 
      do i = 1, 5
        print "(2(a8, ' ', a, '   '))", hands(i, :)
      end do 
    end program Console2