#============================================================================== # ■ Card_base #------------------------------------------------------------------------------ #  カードゲームの土台クラス #============================================================================== class Card_base #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :totalcard attr_accessor :interval_x attr_accessor :interval_y attr_accessor :slidetime attr_accessor :turntime attr_accessor :player_z attr_accessor :talon_x attr_accessor :talon_y attr_accessor :talon_z attr_accessor :trash_x attr_accessor :trash_y attr_accessor :trash_z attr_accessor :replenishment attr_accessor :rank_number attr_accessor :rank_suit attr_accessor :cardname attr_accessor :light attr_accessor :changelist attr_accessor :pot attr_reader :talon attr_reader :players attr_reader :trash attr_reader :cards #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize #初期設定 @totalcard = 53 #使用するカードの枚数 @interval_x = 96 #カードを横に並べる時の隣との間隔 @interval_y = 0 #カードを縦に並べる時の隣との間隔 @slidetime = 20 #カードのスライドに要するフレーム数 @turntime = 10 #カードの反転に要するフレーム数 @player_z = 300 #プレイヤーの基準z座標 @talon_x = 560 #山札のx座標 @talon_y = 140 #山札のy座標 @talon_z = 200 #山札の基準z座標 @trash_x = 80 #捨て札のx座標 @trash_y = 140 #捨て札のy座標 @trash_z = 100 #捨て札の基準z座標 @replenishment = true #trueなら山札が無くなった時に捨て札から継ぎ足す @rank_number = [14,2,3,4,5,6,7,8,9,10,11,12,13] #数字の強さ @rank_suit = [3,2,1,0] #スートの強さ @cardname = "card_" @light = true @changelist = {1 =>"A",11 =>"J",12 =>"Q",13=>"K"}#数字の変換パターン #以上設定 @pot = 0 @preoriginal = 0 @talon = Array.new @trash = Array.new @players = Array.new @select = Array.new @cards = Array.new end #-------------------------------------------------------------------------- # ● 山札作成 #-------------------------------------------------------------------------- def make_talon for i in 0...@players.size rob_allcard(i) end @trash.clear if @cards == [] for i in 0...@totalcard @cards[i] = Card_view.new(i,@rank_number,@rank_suit,@light, @changelist, @cardname) @cards[i].x = @talon_x @cards[i].y = @talon_y end end @talon.randpackplus(0, @totalcard - 1, 0, @totalcard - 1) for i in 0...@talon.size @cards[@talon[i]].z = @talon_z + @totalcard - i end set_taloncards() move_forcing() end #-------------------------------------------------------------------------- # ● 山札から1枚引く #-------------------------------------------------------------------------- def draw_talon if @talon.size == 0 if @replenishment replenishment_talon() else return nil end end return @talon.shift end #-------------------------------------------------------------------------- # ● 捨て札を山札に補充する #-------------------------------------------------------------------------- def replenishment_talon @trash.shuffle(0) @talon += @trash.dup @trash.clear move_forcing() set_taloncards() move_forcing() end #-------------------------------------------------------------------------- # ● 山札をシャッフルする #-------------------------------------------------------------------------- def shuffle_talon @talon.shuffle() end #-------------------------------------------------------------------------- # ● 捨て札をシャッフルする #-------------------------------------------------------------------------- def shuffle_trash @trash.shuffle() end #-------------------------------------------------------------------------- # ● 山札のカードを配置 #-------------------------------------------------------------------------- def set_taloncards(time = @slidetime) return if @talon == [] for i in 0...@talon.size @cards[@talon[i]].slide_set(@talon_x, @talon_y, time) @cards[@talon[i]].turn_set(@turntime) if @cards[@talon[i]].open @cards[@talon[i]].z = @talon_z + @totalcard - i end end #-------------------------------------------------------------------------- # ● 捨て札のカードを配置 #-------------------------------------------------------------------------- def set_trashcards(time = @slidetime) return if @trash == [] for i in 0...@trash.size @cards[@trash[i]].slide_set(@trash_x, @trash_y, time) @cards[@trash[i]].turn_set(@turntime) if @cards[@trash[i]].open @cards[@trash[i]].z = @trash_z + i end end #-------------------------------------------------------------------------- # ● プレイヤー作成 #-------------------------------------------------------------------------- def make_player(hand = 0, x = 0, y = 0, tip = 0) @players.push Card_player.new(hand, x, y, tip) take_card(@players.size - 1, hand) if hand > 0 end #-------------------------------------------------------------------------- # ● プレイヤーのカードを配置 #-------------------------------------------------------------------------- def set_playercards(player) for i in 0...@players[player].hand.size x = @players[player].x + i * @interval_x y = @players[player].y + i * @interval_y @cards[@players[player].hand[i]].slide_set(x, y, @slidetime) @cards[@players[player].hand[i]].z = @player_z +player + i end end #-------------------------------------------------------------------------- # ● プレイヤー消去 #-------------------------------------------------------------------------- def dispose_player(player) rob_allcard(player) @players.delete_at(player) end #-------------------------------------------------------------------------- # ● プレイヤーのx座標確認 #-------------------------------------------------------------------------- def player_x(player) return @players[player].x end #-------------------------------------------------------------------------- # ● プレイヤーのy座標確認 #-------------------------------------------------------------------------- def player_y(player) return @players[player].y end #-------------------------------------------------------------------------- # ● プレイヤーの手札確認 #-------------------------------------------------------------------------- def player_hand(player) return @players[player].hand.dup end #-------------------------------------------------------------------------- # ● プレイヤーのチップ数確認 #-------------------------------------------------------------------------- def player_tip(player) return @players[player].tip end #-------------------------------------------------------------------------- # ● プレイヤーの位置変更 #-------------------------------------------------------------------------- def coordinates_player(player, x, y) @players[player].change_position(x, y) end #-------------------------------------------------------------------------- # ● プレイヤーの手札操作(扱い注意) #-------------------------------------------------------------------------- def player_hand_interference(player) return @players[player].hand end #-------------------------------------------------------------------------- # ● チップ数変更 #-------------------------------------------------------------------------- def change_tip(player, tip) @players[player].change_tip(tip) end #-------------------------------------------------------------------------- # ● チップ加算 #-------------------------------------------------------------------------- def increases_tip(player, tip) @players[player].increases_tip(tip) end #-------------------------------------------------------------------------- # ● チップ減算 #-------------------------------------------------------------------------- def decreases_tip(player, tip) @players[player].decreases_tip(tip) end #-------------------------------------------------------------------------- # ● プレーヤーにチップを支払う #-------------------------------------------------------------------------- def pay_tip(player) @players[player].increases_tip(@pot) @pot = 0 end #-------------------------------------------------------------------------- # ● プレイヤー1からプレイヤー2へチップを支払う #-------------------------------------------------------------------------- def pass_tip(player1, player2, tip) @players[player1].decreases_tip(tip) @players[player2].increases_tip(tip) end #-------------------------------------------------------------------------- # ● プレイヤーに山札からカードを渡す #-------------------------------------------------------------------------- def take_card(player, times = 1) for i in 1..times card = draw_talon() @players[player].take_card(card) set_playercards(player) end end #-------------------------------------------------------------------------- # ● 全プレイヤーに山札から1枚ずつカードを渡す #-------------------------------------------------------------------------- def distribution_card(number) number = @totalcard if number > @totalcard while number > 0 for i in 0...players.size card = draw_talon() @players[i].take_card(card) set_playercards(i) move_forcing() number -= 1 break if number == 0 end end end #-------------------------------------------------------------------------- # ● プレイヤーのカードを1枚捨てる #-------------------------------------------------------------------------- def rob_card(player, card) @trash.push @players[player].dispose_card(card) set_trashcards() set_playercards(player) end #-------------------------------------------------------------------------- # ● プレイヤーのカードを全部捨てる #-------------------------------------------------------------------------- def rob_allcard(player) for i in 0...@players[player].hand.size @trash.push @players[player].dispose_card(0) end set_trashcards() end #-------------------------------------------------------------------------- # ● プレイヤーのカードを1枚交換する #-------------------------------------------------------------------------- def exchange_card(player, card) oldcard = @players[player].exchange_card(card, draw_talon()) @trash.push oldcard set_trashcards() set_playercards(player) end #-------------------------------------------------------------------------- # ● プレイヤーのカードを全部交換する #-------------------------------------------------------------------------- def exchange_allcard(player) times = @players[player].hand.size rob_allcard(player) take_card(player, times) end #-------------------------------------------------------------------------- # ● プレイヤー1からプレイヤー2へカードを1枚渡す #-------------------------------------------------------------------------- def pass_card(player1, player2, card) card = @players[player1].dispose_card(card) @players[player2].take_card(card) set_playercards(player2) end #-------------------------------------------------------------------------- # ● プレイヤー1からプレイヤー2へカードを全部渡す #-------------------------------------------------------------------------- def pass_allcard(player1, player2) for i in 0...@players[player1].hand.size card = @players[player1].dispose_card(0) @players[player2].take_card(card) end set_playercards(player2) end #-------------------------------------------------------------------------- # ● プレイヤー1とプレイヤー2がカードを1枚交換する #-------------------------------------------------------------------------- def trad_card(player1, player2, card1, card2) card1 = @players[player1].dispose_card(card1) card2 = @players[player2].dispose_card(card2) @players[player1].take_card(card1) @players[player2].take_card(card2) set_playercards(player1) set_playercards(player2) end #-------------------------------------------------------------------------- # ● プレイヤー1とプレイヤー2がカードを全部交換する #-------------------------------------------------------------------------- def trad_allcard(player1, player2) card1 = Array.new card2 = Array.new for i in 0...@players[player1].hand.size card1.push @players[player1].dispose_card(0) end for i in 0...@players[player2].hand.size card2.push @players[player2].dispose_card(0) end for i in 0...card2.size @players[player1].take_card(card2[i]) end for i in 0...card1.size @players[player2].take_card(card1[i]) end set_playercards(player1) set_playercards(player2) end #-------------------------------------------------------------------------- # ● プレイヤーのカードを1枚移動する #-------------------------------------------------------------------------- def move_card(player, card, x, y, time = @slidetime) @cards[@players[player].hand[card]].slide_set(x, y, time) end #-------------------------------------------------------------------------- # ● プレイヤーのカードを1枚相対的に移動する #-------------------------------------------------------------------------- def relativemove_card(player, card, x, y, time = @slidetime) x = @players[player].x + card * @interval_x + x y = @players[player].y + card * @interval_y + y @cards[@players[player].hand[card]].slide_set(x, y, time) end #-------------------------------------------------------------------------- # ● プレイヤーのカードを全部移動する #-------------------------------------------------------------------------- def move_allcard(player, x, y, time = @slidetime) @players[player].each{|i| @cards[i].slide_set(x, y, time) } end #-------------------------------------------------------------------------- # ● プレイヤーのカードを1枚反転 #-------------------------------------------------------------------------- def turn_card(player, card, time = @turntime) @cards[@players[player].hand[card]].turn_set(time) end #-------------------------------------------------------------------------- # ● プレイヤーのカードをオープンする #-------------------------------------------------------------------------- def open_allcard(player, time = @turntime) @players[player].hand.each{|i| @cards[i].turn_set(time) unless @cards[i].open } end #-------------------------------------------------------------------------- # ● プレイヤーのカードをクローズする #-------------------------------------------------------------------------- def close_allcard(player, time = @turntime) @players[player].hand.each{|i| @cards[i].turn_set(time) if @cards[i].open } end #-------------------------------------------------------------------------- # ● プレイヤーのカードを全部反転 #-------------------------------------------------------------------------- def turn_allcard(player, time = @turntime) @players[player].hand.each{|i| @cards[i].turn_set(time) } end #-------------------------------------------------------------------------- # ● ウエイト #-------------------------------------------------------------------------- def wait(time) while time > 0 time -= 1 Graphics.update end end #-------------------------------------------------------------------------- # ● キー入力待ちウエイト #-------------------------------------------------------------------------- def entry_wait loop do Input.update Graphics.update if Input.trigger?(Input::A) || Input.trigger?(Input::B) || Input.trigger?(Input::C) return end end end #-------------------------------------------------------------------------- # ● カードの移動・反転が終わるまでウエイト #-------------------------------------------------------------------------- def move_forcing loop do moving = false for i in 0...@cards.size @cards[i].move moving = true if @cards[i].slide || @cards[i].turn end break unless moving Graphics.update end end #-------------------------------------------------------------------------- # ● カードの移動・反転を進める #-------------------------------------------------------------------------- def update @cards.each{|i|i.move} end #-------------------------------------------------------------------------- # ● カーソル処理を使用するプレイヤー選択 #-------------------------------------------------------------------------- def select_player(player) @select.push Card_select.new(@players[player].hand.size, 0, @players[player].x,@players[player].y,@interval_x,@interval_y,@cardname) end #-------------------------------------------------------------------------- # ● カーソル処理を破棄 #-------------------------------------------------------------------------- def dispose_select_cursor @select[@select.size-1].dispose @select.pop end #-------------------------------------------------------------------------- # ● プレイヤーのカードを選択 #-------------------------------------------------------------------------- def select_card card = @select[@select.size-1].select return card end #-------------------------------------------------------------------------- # ● 選択したカードを捨てる #-------------------------------------------------------------------------- def select_rob_card(player, min=0, max=@players[player].hand.size) select_player(player) max = @players[player].hand.size if max == 0 selectcards = Array.new loop do card = select_card() if card == nil next if selectcards.size < min selectcards.sort! for i in 0...selectcards.size rob_card(player, selectcards[i]) end dispose_select_cursor return else if selectcards.include?(card) selectcards.delete(card) else selectcards.push card if selectcards.size < max end end for i in 0...selectcards.size @cards[@players[player].hand[selectcards[i]]].flash(Color.new(255, 255, 255, 255), 2) end @cards.each{|i|i.update} Graphics.update end end #-------------------------------------------------------------------------- # ● 選択しなかったカードを捨てる #-------------------------------------------------------------------------- def nonselect_rob_card(player, min=0, max=@players[player].hand.size) select_player(player) max = @players[player].hand.size if max == 0 selectcards = Array.new loop do card = select_card() if card == nil next if selectcards.size < min array = Array.new(@players[player].hand.size){|i|i} selectcards = array - selectcards selectcards.sort! for i in 0...selectcards.size rob_card(player, selectcards[i]) end dispose_select_cursor return else if selectcards.include?(card) selectcards.delete(card) else selectcards.push card if selectcards.size < max end end for i in 0...selectcards.size @cards[@players[player].hand[selectcards[i]]].flash(Color.new(255, 255, 255, 255), 2) end @cards.each{|i|i.update} Graphics.update end end #-------------------------------------------------------------------------- # ● 選択したカードを交換 #-------------------------------------------------------------------------- def select_exchange_card(player, min=0, max=@players[player].hand.size) select_player(player) max = @players[player].hand.size if max == 0 selectcards = Array.new loop do card = select_card() if card == nil next if selectcards.size < min selectcards.sort! for i in 0...selectcards.size exchange_card(player, selectcards[i]) end dispose_select_cursor return else if selectcards.include?(card) selectcards.delete(card) else selectcards.push card if selectcards.size < max end end for i in 0...selectcards.size @cards[@players[player].hand[selectcards[i]]].flash(Color.new(255, 255, 255, 255), 2) end @cards.each{|i|i.update} Graphics.update end end #-------------------------------------------------------------------------- # ● 選択しなかったカードを交換 #-------------------------------------------------------------------------- def nonselect_exchange_card(player, min=0, max=@players[player].hand.size) select_player(player) selectcards = Array.new loop do card = select_card() if card == nil next if selectcards.size < min array = Array.new(@players[player].hand.size){|i|i} selectcards = array - selectcards selectcards.sort! for i in 0...selectcards.size exchange_card(player, selectcards[i]) end dispose_select_cursor return else if selectcards.include?(card) selectcards.delete(card) else selectcards.push card if selectcards.size < max end end for i in 0...selectcards.size @cards[@players[player].hand[selectcards[i]]].flash(Color.new(255, 255, 255, 255), 2) end @cards.each{|i|i.update} Graphics.update end end #-------------------------------------------------------------------------- # ● 選択したカードを別のプレイヤーに渡す #-------------------------------------------------------------------------- def select_pass_card(player1,player2,min=0,max=@players[player].hand.size) select_player(player1) max = @players[player1].hand.size if max == 0 selectcards = Array.new loop do card = select_card() if card == nil next if selectcards.size < min selectcards.sort! for i in 0...selectcards.size pass_card(player1, player2, selectcards[i]) end dispose_select_cursor return else if selectcards.include?(card) selectcards.delete(card) else selectcards.push card if selectcards.size < max end end for i in 0...selectcards.size @cards[@players[player1].hand[selectcards[i]]].flash(Color.new(255, 255, 255, 255), 2) end @cards.each{|i|i.update} Graphics.update end end #-------------------------------------------------------------------------- # ● 選択肢の処理 #-------------------------------------------------------------------------- def select_menu(item, s_x = 0, s_y = 0, i_x = @interval_x, i_y = @interval_y) select = Card_menu.new(item, s_x, s_y, i_x, i_y, @cardname) value = select.select select.dispose return value end #-------------------------------------------------------------------------- # ● 数値入力の処理 #-------------------------------------------------------------------------- def select_value(x, y, original = @preoriginal, min=0, max=9999999999) select = Card_value.new(x, y, original, min, max, @cardname) value = select.select select.dispose return value end #-------------------------------------------------------------------------- # ● 数値入力でチップを賭ける #-------------------------------------------------------------------------- def bet_tip(player, x = 0, y = 0, min=0, max=players[player].tip) max=players[player].tip if max > players[player].tip select = Card_value.new(x, y, @preoriginal, min, max, @cardname) value = select.select select.dispose decreases_tip(player, value) @pot += value @preoriginal = value return value end #-------------------------------------------------------------------------- # ● 2枚のカードのうち数字の強い方を判定する #-------------------------------------------------------------------------- def comparison_munber(card1,card2) rank1 = card1 / @rank_suit.size rank2 = card2 / @rank_suit.size return 0 if @rank_number[rank1] == nil && @rank_number[rank2] == nil return 1 if @rank_number[rank1] == nil return -1 if @rank_number[rank2] == nil if @rank_number[rank1] > @rank_number[rank2] return 1 elsif @rank_number[rank1] < @rank_number[rank2] return -1 else return 0 end end #-------------------------------------------------------------------------- # ● 2枚のカードのうちスートの強い方を判定する #-------------------------------------------------------------------------- def comparison_suit(card1,card2) rank1 = card1 % @rank_suit.size rank2 = card2 % @rank_suit.size if @rank_suit[rank1] > @rank_suit[rank2] return 1 elsif @rank_suit[rank1] < @rank_suit[rank2] return -1 else return 0 end end #-------------------------------------------------------------------------- # ● 数字の強さを基準に並び替える #-------------------------------------------------------------------------- def sort_munber(hand) return hand.sort!{|a, b| comparison_munber(a,b) == 0 ? comparison_suit(a,b) : comparison_munber(a,b)} end #-------------------------------------------------------------------------- # ● スートの強さを基準に並び替える #-------------------------------------------------------------------------- def sort_suit(hand) return hand.sort!{|a, b| comparison_suit(a,b) == 0 ? comparison_munber(a,b) : comparison_suit(a,b)} end #-------------------------------------------------------------------------- # ● 数字、スート、ジョーカーの頻度集計 #-------------------------------------------------------------------------- def frequency_amount(hand) hand.sort! number = Array.new(@rank_number.size ,0) suit = Array.new(@rank_suit.size ,0) joker = 0 hand.each{|i| if i < @rank_number.size * @rank_suit.size number[i / @rank_suit.size] += 1 suit[i % @rank_suit.size] += 1 else joker += 1 end } return [number,suit,joker] end #-------------------------------------------------------------------------- # ● 同スート判定 #-------------------------------------------------------------------------- def same_suit?(hand) frequency = frequency_amount(hand) number = frequency[0] suit = frequency[1] joker = frequency[2] value = suit.search_max() if value[0] + joker == hand.size return true end return false end #-------------------------------------------------------------------------- # ● シークエンス判定 #-------------------------------------------------------------------------- def sequence?(hand) frequency = frequency_amount(hand) number = frequency[0] suit = frequency[1] joker = frequency[2] value = number.search_max() if value[0] == 1 return true if value[hand.size - joker] - value[1] == hand.size-1 || value[hand.size - joker] - value[1] + joker <= hand.size-1 end return false end #-------------------------------------------------------------------------- # ● ポーカー専用:ファイブジョーカー判定 #-------------------------------------------------------------------------- def poker_fivejoker?(hand) frequency = frequency_amount(hand) number = frequency[0] suit = frequency[1] joker = frequency[2] value = number.search_max() if joker == 5 return true end return false end #-------------------------------------------------------------------------- # ● ポーカー専用:ロイヤルストレートフラッシュ判定 #-------------------------------------------------------------------------- def poker_royalflush?(hand) hand.sort! if [[0,36,40,44,48],[1,37,41,45,49],[2,38,42,46,50], [3,39,43,47,51]].include?(hand) return true end return false end #-------------------------------------------------------------------------- # ● ポーカー専用:ファイブカード判定 #-------------------------------------------------------------------------- def poker_fivecard?(hand) frequency = frequency_amount(hand) number = frequency[0] suit = frequency[1] joker = frequency[2] value = number.search_max() if value[0] + joker == 5 return true end return false end #-------------------------------------------------------------------------- # ● ポーカー専用:ストレートフラッシュ判定 #-------------------------------------------------------------------------- def poker_straightflush?(hand) if poker_flush?(hand) && poker_straight?(hand) return true end return false end #-------------------------------------------------------------------------- # ● ポーカー専用:フォーカード判定 #-------------------------------------------------------------------------- def poker_fourcard?(hand) frequency = frequency_amount(hand) number = frequency[0] suit = frequency[1] joker = frequency[2] value = number.search_max() if value[0] + joker == 4 return true end return false end #-------------------------------------------------------------------------- # ● ポーカー専用:フルハウス判定 #-------------------------------------------------------------------------- def poker_fullhouse?(hand) frequency = frequency_amount(hand) number = frequency[0] suit = frequency[1] joker = frequency[2] value = number.search_max() if value[0] + joker == 3 if value.size == 3 return true else value2 = number.search_max(0,12,2) if value[0] == 3 and value2[0] == 2 return true end end end return false end #-------------------------------------------------------------------------- # ● ポーカー専用:フラッシュ判定 #-------------------------------------------------------------------------- def poker_flush?(hand) frequency = frequency_amount(hand) number = frequency[0] suit = frequency[1] joker = frequency[2] value = suit.search_max() if value[0] + joker == 5 return true end return false end #-------------------------------------------------------------------------- # ● ポーカー専用:ストレート判定 #-------------------------------------------------------------------------- def poker_straight?(hand) frequency = frequency_amount(hand) number = frequency[0] suit = frequency[1] joker = frequency[2] value = number.search_max() if value[0] == 1 return true if value[5 - joker] - value[1] == 4 || value[5 - joker] - value[1] + joker <= 4 if value[1] == 0 value.delete_at(1) value.push 13 return true if value[5 - joker] - value[1] == 4 || value[5 - joker] - value[1] + joker <= 4 end end return false end #-------------------------------------------------------------------------- # ● ポーカー専用:スリーカード判定 #-------------------------------------------------------------------------- def poker_threecard?(hand) frequency = frequency_amount(hand) number = frequency[0] suit = frequency[1] joker = frequency[2] value = number.search_max() if value[0] + joker == 3 return true end return false end #-------------------------------------------------------------------------- # ● ポーカー専用:ツーペア判定 #-------------------------------------------------------------------------- def poker_twopair?(hand) frequency = frequency_amount(hand) number = frequency[0] suit = frequency[1] joker = frequency[2] value = number.search_max() if value[0] + joker == 2 && value.size == 3 return true end return false end #-------------------------------------------------------------------------- # ● ポーカー専用:ワンペア判定 #-------------------------------------------------------------------------- def poker_onepair?(hand) frequency = frequency_amount(hand) number = frequency[0] suit = frequency[1] joker = frequency[2] value = number.search_max() if value[0] + joker == 2 return true end return false end #-------------------------------------------------------------------------- # ● ブラックジャック専用:得点計算 #-------------------------------------------------------------------------- def blackjack_score(hand) score = 0 ace = 0 hand.each{|i| score += i / @rank_suit.size > 9 ? 10 : i / @rank_suit.size + 1 ace += 1 if i < 4 } while ace > 0 score += 10 if score <= 11 ace -= 1 end return score end #-------------------------------------------------------------------------- # ● 全てのカードを抹消する #-------------------------------------------------------------------------- def dispose_allcard @cards.each{|i|i.dispose} @cards = Array.new end end #============================================================================== # ■ Card_base #------------------------------------------------------------------------------ #  カード表示クラス # #============================================================================== class Card_view < Sprite #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :value #整理番号 attr_reader :suit #スート attr_reader :number #数字 attr_reader :open #表向きフラグ attr_reader :slide #移動中フラグ attr_reader :turn #回転中フラグ #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(value, rank_number, rank_suit, light, changelist, cardname) super() @value = value @rank_number = rank_number @rank_suit = rank_suit @light = light @changelist = changelist @cardname = cardname @open = false @slide = false @slide_x = x @slide_y = y @move_x = 0 @move_y = 0 @turn = false @turncount = 0 @turn_x = 0 if @value < @rank_number.size * @rank_suit.size @suit = @value % @rank_suit.size @number = @value / @rank_suit.size + 1 else @suit = @rank_suit.size @number = @rank_number.size end write_card() self.ox = self.bitmap.width / 2 self.oy = self.bitmap.height / 2 end #-------------------------------------------------------------------------- # ● カード描画 #-------------------------------------------------------------------------- def write_card if @open if @light if @value < @rank_number.size * @rank_suit.size self.bitmap = Bitmap.new("Graphics/Pictures/"+@cardname+"#{@suit}") else self.bitmap = RPG::Cache.picture(@cardname + "joker") return end self.bitmap.font.color = Color.new(0, 0, 0) self.bitmap.draw_text(3, 3, 24, 24, change_value(@number)) self.bitmap.draw_text(self.bitmap.width-27, self.bitmap.height-27, 24, 24, change_value(@number),2) else if @value < @rank_number.size * @rank_suit.size self.bitmap = RPG::Cache.picture(@cardname + "#{@value}") else self.bitmap = RPG::Cache.picture(@cardname + "joker") return end end else self.bitmap = RPG::Cache.picture(@cardname + "back") end end #-------------------------------------------------------------------------- # ● 数値変換 #-------------------------------------------------------------------------- def change_value(value) if @changelist[value] == nil return "#{value}" else return @changelist[value] end end #-------------------------------------------------------------------------- # ● カードの移動設定 #-------------------------------------------------------------------------- def slide_set(x, y, time) if time > 0 Audio.se_play("Audio/SE/card_se_slide",80) @slide = true @slide_x = x @slide_y = y @move_x = (x - self.x) / time @move_y = (y - self.y) / time else @slide = false self.x = x self.y = y end end #-------------------------------------------------------------------------- # ● カードの回転設定 #-------------------------------------------------------------------------- def turn_set(time) if time > 1 Audio.se_play("Audio/SE/card_se_turn",80) @turn = true @turncount = time / 2 @turn_x = 1.0 / @turncount else @turn = false @open = @open? false : true write_card() end end #-------------------------------------------------------------------------- # ● カードの移動・反転処理 #-------------------------------------------------------------------------- def move #移動処理 if @slide self.x += @move_x self.y += @move_y if @move_x > 0 self.x = @slide_x if self.x > @slide_x else self.x = @slide_x if self.x < @slide_x end if @move_y > 0 self.y = @slide_y if self.y > @slide_y else self.y = @slide_y if self.y < @slide_y end if self.x == @slide_x && self.y == @slide_y @slide = false end end #反転処理 if @turn if @turncount > 0 self.zoom_x -= @turn_x @turncount -= 1 if @turncount == 0 @open = @open? false : true write_card() end else self.zoom_x += @turn_x if self.zoom_x > 1 self.zoom_x = 1 @turn = false end end end self.update end end #============================================================================== # ■ Card_base #------------------------------------------------------------------------------ #  プレイヤー(カード一時保有)クラス # #============================================================================== class Card_player #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :x attr_reader :y attr_reader :hand attr_reader :tip #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(hand, x, y, tip) @x = x @y = y @tip = tip @hand = Array.new end #-------------------------------------------------------------------------- # ● 位置変更 #-------------------------------------------------------------------------- def change_position(x,y) @x = x @y = y end #-------------------------------------------------------------------------- # ● チップ変更 #-------------------------------------------------------------------------- def change_tip(tip) @tip = tip end #-------------------------------------------------------------------------- # ● チップ加算 #-------------------------------------------------------------------------- def increases_tip(tip) @tip += tip end #-------------------------------------------------------------------------- # ● チップ減算 #-------------------------------------------------------------------------- def decreases_tip(tip) @tip -= tip end #-------------------------------------------------------------------------- # ● カードを引く #-------------------------------------------------------------------------- def take_card(value) if value != nil @hand.push value end end #-------------------------------------------------------------------------- # ● カードを捨てる #-------------------------------------------------------------------------- def dispose_card(value) number = @hand[value] @hand.delete_at(value) return number end #-------------------------------------------------------------------------- # ● カードを交換する #-------------------------------------------------------------------------- def exchange_card(oldcard, newcard) number = @hand[oldcard] if newcard == nil @hand.delete_at(oldcard) else @hand[oldcard] = newcard end return number end end #============================================================================== # ■ Card_base #------------------------------------------------------------------------------ #  項目選択クラス # #============================================================================== class Card_select #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(item_x,item_y,start_x,start_y,interval_x,interval_y,cardname) @cardname = cardname @cursor = Sprite.new @cursor.bitmap = RPG::Cache.picture(@cardname+"cursor") @cursor.ox = @cursor.bitmap.width / 2 @cursor.oy = @cursor.bitmap.height / 2 @cursor.x = start_x @cursor.y = start_y @cursor.z = 1000 @item_x = item_x @item_y = item_y @start_x = start_x @start_y = start_y @interval_x = interval_x @interval_y = interval_y @select_x = 0 @select_y = 0 end #-------------------------------------------------------------------------- # ● 選択処理 #-------------------------------------------------------------------------- def select loop do Input.update Graphics.update if Input.trigger?(Input::A) Audio.se_play("Audio/SE/"+ @cardname+ "se_decision",80) return @select_x * @select_y + @select_x end if Input.trigger?(Input::B) Audio.se_play("Audio/SE/"+ @cardname+ "se_cancel",80) return nil end if Input.trigger?(Input::C) Audio.se_play("Audio/SE/"+ @cardname+ "se_decision",80) return @select_x * @select_y + @select_x end if Input.trigger?(Input::UP) Audio.se_play("Audio/SE/"+ @cardname+ "se_cursor",80) @select_y += 1 @select_y = 0 if @select_y >= @item_y end if Input.trigger?(Input::DOWN) Audio.se_play("Audio/SE/"+ @cardname+ "se_cursor",80) @select_y -= 1 @select_y = @item_y -1 if @select_y < 0 end if Input.trigger?(Input::LEFT) Audio.se_play("Audio/SE/"+ @cardname+ "se_cursor",80) @select_x -= 1 @select_x = @item_x -1 if @select_x < 0 end if Input.trigger?(Input::RIGHT) Audio.se_play("Audio/SE/"+ @cardname+ "se_cursor",80) @select_x += 1 @select_x = 0 if @select_x >= @item_x end @cursor.x = @start_x + @interval_x * @select_x @cursor.y = @start_y + @interval_y * @select_y end end #-------------------------------------------------------------------------- # ● 画像開放 #-------------------------------------------------------------------------- def dispose @cursor.dispose end end #============================================================================== # ■ Card_menu #------------------------------------------------------------------------------ #  クロスメニューによる項目選択クラス # #============================================================================== class Card_menu #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(item, start_x, start_y, interval_x, interval_y,cardname) @cardname = cardname @cursor = Sprite.new @cursor.bitmap = RPG::Cache.picture("card_cursor") @cursor.ox = @cursor.bitmap.width / 2 @cursor.oy = @cursor.bitmap.height / 2 @item = item @cursor.x = start_x @cursor.y = start_y @cursor.z = 1000 @start_x = start_x @start_y = start_y @interval_x = interval_x @interval_y = interval_y @select = 0 @value_view =Array.new(@item.size) x = @start_x y = @start_y for i in 0...@item.size @value_view[i] = Sprite.new @value_view[i].bitmap = Bitmap.new(640,24) @value_view[i].bitmap.draw_text(0,0,640,24,@item[i]) @value_view[i].x = x @value_view[i].y = y @value_view[i].z = 1000 x += @interval_x y += @interval_y end end #-------------------------------------------------------------------------- # ● 選択処理 #-------------------------------------------------------------------------- def select loop do Input.update Graphics.update if Input.trigger?(Input::A) Audio.se_play("Audio/SE/"+ @cardname+ "se_decision",80) return @select end if Input.trigger?(Input::B) Audio.se_play("Audio/SE/"+ @cardname+ "se_cancel",80) return @select end if Input.trigger?(Input::C) Audio.se_play("Audio/SE/"+ @cardname+ "se_decision",80) return @select end if Input.trigger?(Input::UP) Audio.se_play("Audio/SE/"+ @cardname+ "se_cursor",80) @select -= 1 @select = @item.size - 1 if @select < 0 end if Input.trigger?(Input::DOWN) Audio.se_play("Audio/SE/"+ @cardname+ "se_cursor",80) @select += 1 @select = 0 if @select >= @item.size end if Input.trigger?(Input::LEFT) Audio.se_play("Audio/SE/"+ @cardname+ "se_cursor",80) @select -= 1 @select = @item.size - 1 if @select < 0 end if Input.trigger?(Input::RIGHT) Audio.se_play("Audio/SE/"+ @cardname+ "se_cursor",80) @select += 1 @select = 0 if @select >= @item.size end @cursor.x = @start_x + @interval_x * @select @cursor.y = @start_y + @interval_y * @select end end #-------------------------------------------------------------------------- # ● 画像開放 #-------------------------------------------------------------------------- def dispose @value_view.each{|i|i.dispose} @cursor.dispose end end #============================================================================== # ■ Card_value #------------------------------------------------------------------------------ #  数値入力クラス # #============================================================================== class Card_value #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(start_x, start_y, original, min, max, cardname) @cardname = cardname @digit = 0 loop do @digit +=1 break if max < 10 ** @digit end @value_view =Array.new(@digit) x = start_x y = start_y for i in 0...@value_view.size @value_view[i] = Sprite.new @value_view[i].bitmap = Bitmap.new(24,24) @value_view[i].x = x @value_view[i].y = y @value_view[i].z = 1000 x -= 24 end @start_x = start_x @start_y = start_y @min = min @min = 0 if @min < 0 @max = max @cursor = Sprite.new @cursor.bitmap = Bitmap.new(24,24) @cursor.bitmap.fill_rect(0, 0, 24, 24, Color.new(127, 127, 255, 127)) @cursor.x = start_x @cursor.y = start_y @cursor.z = 1001 @value = original @value = @min if @value < @min @value = @max if @value > @max @select = 0 @prepartial = Array.new(@digit,-1) @partial = Array.new(@digit,0) write_value() end #-------------------------------------------------------------------------- # ● 選択処理 #-------------------------------------------------------------------------- def select loop do Input.update Graphics.update if Input.trigger?(Input::A) Audio.se_play("Audio/SE/"+ @cardname+ "se_decision",80) return @value end if Input.trigger?(Input::B) Audio.se_play("Audio/SE/"+ @cardname+ "se_cancel",80) return @value end if Input.trigger?(Input::C) Audio.se_play("Audio/SE/"+ @cardname+ "se_decision",80) return @value end if Input.trigger?(Input::UP) Audio.se_play("Audio/SE/"+ @cardname+ "se_cursor",80) @value += 10 ** @select @value = @max if @value > @max end if Input.trigger?(Input::DOWN) Audio.se_play("Audio/SE/"+ @cardname+ "se_cursor",80) @value -= 10 ** @select @value = @min if @value < @min end if Input.trigger?(Input::LEFT) Audio.se_play("Audio/SE/"+ @cardname+ "se_cursor",80) @select += 1 @select = 0 if @select > @digit-1 end if Input.trigger?(Input::RIGHT) Audio.se_play("Audio/SE/"+ @cardname+ "se_cursor",80) @select -= 1 @select = @digit-1 if @select < 0 end write_value() @cursor.x = @start_x - 24 * @select end end #-------------------------------------------------------------------------- # ● 数値描画 #-------------------------------------------------------------------------- def write_value for i in 0...@digit @partial[i] = (@value / (10 ** i)) % 10 if @prepartial[i] != @partial[i] @prepartial[i] = @partial[i] @value_view[i].bitmap.clear @value_view[i].bitmap.draw_text(0,0,24,24,"#{@partial[i]}",1) end end end #-------------------------------------------------------------------------- # ● 画像開放 #-------------------------------------------------------------------------- def dispose @value_view.each{|i|i.dispose} @cursor.dispose end end #============================================================================== # ■ 配列操作系メソッド集 #------------------------------------------------------------------------------ #  作ったメソッドを適当に保存しておくところ # # 乱数一括代入 # randpack(min, max, [start[, goal]]) # # 部分的昇順ソート # partialsort_up([start[, goal]]) # # 部分的降順ソート # partialsort_down([start[, goal]]) # # 最大値検索 # search_max([start[, goal[, border]]]) # # 最小値検索 # search_min([start[, goal[, border]]]) # # 後方移動 # move_back([target[, start[, goal]]]) # # 前方移動 # move_front([target[, start[, goal]]]) # # シャッフル # shuffle([start[, goal]]) # # 重複無しの乱数一括代入 # randpackplus(min, max, [start[, goal]]) #============================================================================== class Array #-------------------------------------------------------------------------- # ● 乱数一括代入 2005/7/24 #-------------------------------------------------------------------------- def randpack(min, max, start = 0, goal = self.size - 1) #min=乱数の最小値,max=乱数の最大値,start=範囲の最初, goal=範囲の最後 for pointer in start..goal #変数pointerの値を変数startから変数goalまで変動させながらループ self[pointer] = rand(max - min + 1) + min #変数pointerで指定したツクール変数に変数minから変数maxまでの乱数を代入 end return self end #-------------------------------------------------------------------------- # ● 部分的昇順ソート 2005/7/24 #-------------------------------------------------------------------------- def partialsort_up(start = 0, goal = self.size - 1) #start=範囲の最初, goal=範囲の最後 start = 0 if start < 0 #値を範囲内に収める goal = self.size - 1 if goal > self.size - 1 #値を範囲内に収める array = self[start..goal] #配列初期化 array.sort! #配列をソートする self[start..goal] = array #元の配列に代入 return self end #-------------------------------------------------------------------------- # ● 部分的降順ソート 2005/7/24 #-------------------------------------------------------------------------- def partialsort_down(start = 0, goal = self.size - 1) #start=範囲の最初, goal=範囲の最後 start = 0 if start < 0 #値を範囲内に収める goal = self.size - 1 if goal > self.size - 1 #値を範囲内に収める array = self[start..goal] #配列初期化 array.sort! #配列をソートする array.reverse! #配列を逆順に並び替える self[start..goal] = array #元の配列に代入 return self end #-------------------------------------------------------------------------- # ● 最大値検索 2005/7/24 #-------------------------------------------------------------------------- def search_max(start = 0, goal = self.size - 1, border = nil) #start=範囲の最初, goal=範囲の最後, border=調べる数値の最大値 start = 0 if start < 0 #値を範囲内に収める goal = self.size - 1 if goal > self.size - 1 #値を範囲内に収める max_variable = [] #最大値とその番号を記録する配列 for pointer in start..goal #変数pointerをstartからgoalまで繰り返す if border == nil || border >= self[pointer] #ボーダーが無いか、現在の変数がボーダー以下の時 if max_variable[0] == nil || max_variable[0] < self[pointer] #最大値がまだ記録されてないか、現在の変数が記録した最大値より大きい時 max_variable = [self[pointer],pointer] #最大値に現在の変数とその変数の番号を代入 elsif max_variable[0] == self[pointer] #現在の変数が記録した最大値と同じ時 max_variable.push pointer #配列に変数の番号を追加 end end end return max_variable #最大値とその番号の配列を返す end #-------------------------------------------------------------------------- # ● 最小値検索 2005/7/24 #-------------------------------------------------------------------------- def search_min(start = 0, goal = self.size - 1, border = nil) #start=範囲の最初, goal=範囲の最後, border=調べる数値の最大値 start = 0 if start < 0 #値を範囲内に収める goal = self.size - 1 if goal > self.size - 1 #値を範囲内に収める max_variable = [] #最小値とその番号を記録する配列 for pointer in start..goal #変数pointerをstartからgoalまで繰り返す if border == nil || border <= self[pointer] #ボーダーが無いまたは現在の変数がボーダー以上の時 if max_variable[0] == nil || max_variable[0] > self[pointer] #最小値がまだ記録されてないか、現在の変数が記録した最小値より小さい時 max_variable = [self[pointer],pointer] #最小値に現在の変数とその変数の番号を代入 elsif max_variable[0] == self[pointer] #現在の変数が記録した最小値と同じ時 max_variable.push pointer #配列に変数の番号を追加 end end end return max_variable #最小値とその番号の配列を返す end #-------------------------------------------------------------------------- # ● 後方移動 2004/8/18 #-------------------------------------------------------------------------- def move_back(target = 0, start = 0, goal = self.size - 1) #target=移動する数値,start=範囲の最初,goal=範囲の最後 start = 0 if start < 0 #値を範囲内に収める goal = self.size - 1 if goal > self.size - 1 #値を範囲内に収める pointer = start #範囲の最初から順番に移動する変数 k = 0 #ターゲットの個数を記録する変数 while (pointer + k <= goal) #変数pointer + kの値が範囲内にある間ループ while (self[pointer + k] == target && pointer + k <= goal) #k個分先の変数がターゲットなら k += 1 #ターゲットの個数1個追加 end #以上繰り返し self[pointer] = self[pointer + k] #変数k個分先の変数を代入(前に詰める) pointer += 1 #変数を1つ移動する end #以上繰り返し while (k > 0) #見つかったターゲットの個数だけ繰り返す k -= 1 #ターゲット数を1つ減らす self[goal - k] = target #範囲の後ろをtargetで埋める end return self end #-------------------------------------------------------------------------- # ● 前方移動 2004/8/18 #-------------------------------------------------------------------------- def move_front(target = 0, start = 0, goal = self.size - 1) #target=移動する数値,start=範囲の最初,goal=範囲の最後 start = 0 if start < 0 #値を範囲内に収める goal = self.size - 1 if goal > self.size - 1 #値を範囲内に収める pointer = goal #範囲の最後から順番に移動する変数 k = 0 #ターゲットの個数を記録する変数 while (pointer - k >= start) #変数pointer - kの値が範囲内にある間ループ while (self[pointer - k] == target && pointer - k >= start) #k個分先の変数がターゲットなら k += 1 #ターゲットの個数1個追加 end #以上繰り返し self[pointer] = self[pointer - k] #変数k個分先の変数を代入(前に詰める) pointer -= 1 #変数を1つ移動する end #以上繰り返し while (k > 0) #見つかったターゲットの個数だけ繰り返す k -= 1 #ターゲット数を1つ減らす self[start + k] = target #範囲の後ろをtargetで埋める end return self end #-------------------------------------------------------------------------- # ● シャッフル 2005/7/24 #-------------------------------------------------------------------------- def shuffle(start = 0, goal = self.size - 1) #start=範囲の最初, goal=範囲の最後 start = 0 if start < 0 #値を範囲内に収める goal = self.size - 1 if goal > self.size - 1 #値を範囲内に収める for pointer in start...goal #変数pointerの値を変数startから変数goalまで変動させながらループ other = rand(goal - pointer + 1) + pointer #現在の位置以降の範囲からランダムに1つ選択 self[pointer], self[other] = self[other], self[pointer] #2変数を交換 end return self end #-------------------------------------------------------------------------- # ● 重複無しの乱数一括代入 2005/7/24 #-------------------------------------------------------------------------- def randpackplus(min, max, start = 0, goal = self.size - 1) #min=乱数の最小値,max=乱数の最大値,start=範囲の最初, goal=範囲の最後 array = [] #配列初期化 for pointer in min..max #変数pointerの値を変数minから変数maxまで変動させながらループ array.push pointer #pointerの値を順次代入 end for pointer in 0...array.size - 1 #変数pointerの値を変数startから変数array.size - 1まで変動させながらループ other = rand(array.size - pointer) + pointer #現在の位置以降の範囲からランダムに1つ選択 array[pointer], array[other] = array[other], array[pointer] #2変数を交換 end while array.size <= goal - start #arrayの要素数が部分配列と同じ数になるまで array.push 0 #配列の末尾に0を追加する end for pointer in start..goal #変数pointerの値を変数startから変数goalまで変動させながらループ self[pointer] = array[pointer - start] #元の変数に順次代入 end return self end end