** card.rb (Kartenklasse) **
Ich habe attr_reader verwendet, damit die Kartendaten für jede Karte nicht neu geschrieben werden können (damit die Daten nicht beschädigt werden).
** deck.rb (Deckklasse) **
Bei der Erstellung der Instanz habe ich sichergestellt, dass das Deck gemischt und getestet wurde.
Ich habe die Deck-Generation mit jeder Anweisung so präzise wie möglich geschrieben.
Wenn Sie mithilfe von Klassenvariablen eine Karte ziehen, wird jetzt gezählt, wie viele Karten in Ihrem Deck gezogen werden.
** player.rb (Spielerklasse) **
Um Spielern und Dealern gemeinsam zu sein, habe ich der Klassenvariablen eine Instanz des Decks zugewiesen und das Deck verwendet, um dasselbe Deck zu verwenden.
** Judge.rb (Urteilsklasse) ** ――Die Klasse zum Beurteilen habe ich aus Gründen der Klarheit gewagt, ein Modul getrennt vom Spieler zu verwenden.
** test.rb (Funktionsprüfungstest) ** --minitest ist * "Einführung in Ruby für diejenigen, die professionell werden möchten" *, und ich habe es seit dem Schreiben nicht mehr verwendet, also habe ich es verwendet, um mein Verständnis zu vertiefen.
** main.rb (Hauptdatei, in der Blackjack ausgeführt wird) **
Aus Gründen der Klarheit habe ich zuerst nur den Gesamtfluss des Spiels geschrieben »Von dort aus habe ich über die notwendigen Klassen und Methoden nachgedacht und sie hinzugefügt.
--Kein Bett. (Geplant, zu einem späteren Zeitpunkt implementiert zu werden)
card.rb
class Card
attr_reader :mark, :number
def initialize(mark, number)
@mark = mark.freeze
@number = number.freeze
end
def convert
if @number == 'J' || @number == 'Q' || @number == 'K'
10
elsif @number == 'A'
1
else
@number.to_i
end
end
end
deck.rb
require './card'
class Deck
attr_accessor :cards
@@draw_count = 0
def initialize
@cards = []
create
@cards = @cards.shuffle
end
def create
nums = ['A', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K']
mark = ['❤︎', '♦︎', '♤', '♧']
mark.each do |m|
nums.each do |n|
@cards << Card.new(m, n)
end
end
end
def draw
cards[@@draw_count]
end
def draw_count
@@draw_count += 1
end
#Kartenreferenzmethode zum Testen
def show
52.times do |n|
puts "[ #{cards[n].mark} #{cards[n].number} ]"
end
end
end
player.rb
require './deck'
require './judge'
class Player
include Judge
attr_accessor :hands, :total_score, :name
@@deck = Deck.new
def initialize(name: "Spieler")
@hands = []
@total_score = 0
@name = name
end
def draw
self.hands << @@deck.draw
self.total_score += @@deck.draw.convert
@@deck.draw_count
end
def show
puts "#{self.name}Ist in deiner Hand"
self.hands.each do |hand|
puts "[ #{hand.mark} #{hand.number} ]"
end
puts "[Gesamtpunktzahl#{@total_score} ]"
end
#Testmethode
def test
puts "Prüfung --------"
end
def total_score_calc
self.hands.each do |hand|
@total_score += hand.convert
end
#puts "gesamt"#{@total_score}」"
end
def reset
self.hands = []
self.total_score = 0
end
def in_blackjack
self.hands << Card.new("♦︎", "J")
self.hands << Card.new("♦︎", "A")
end
end
judge.rb
module Judge
# def game_judge(target)
# if self.total_score > target.total_score
# puts "Ihre Gesamtpunktzahl[ #{self.total_score} ]"
# puts "Gesamtpunktzahl des Händlers[ #{target.total_score} ]"
# puts 'Du gewinnst'
# elsif self.total_score == target.total_score
# puts "Ihre Gesamtpunktzahl[ #{self.total_score} ]"
# puts "Gesamtpunktzahl des Händlers[ #{target.total_score} ]"
# puts 'Es ist eine Zeichnung'
# else
# puts "Ihre Gesamtpunktzahl[ #{self.total_score} ]"
# puts "Gesamtpunktzahl des Händlers[ #{target.total_score} ]"
# puts 'Du verlierst'
# end
# end
def blackjack?
if self.hands[1].number == "A" || self.hands[0].number == "A"
if self.hands[0].number == "J" || self.hands[0].number == "Q"|| self.hands[0].number == "K" || \
self.hands[1].number == "J" || self.hands[1].number == "Q"|| self.hands[1].number == "K"
self.total_score = "schwarzer Jack"
true
else
false
end
else
false
end
end
def burst?
if self.total_score > 21
true
else
false
end
end
end
test.rb
require 'minitest/autorun'
require './player'
class BlackJackTest < Minitest::Test
#Die Markierung auf der Testkarte wird mit "♦ ︎" vereinheitlicht.
@@test_J = Card.new('♦︎', 'J')
@@test_Q = Card.new('♦︎', 'Q')
@@test_K = Card.new('♦︎', 'K')
@@test_A = Card.new('♦︎', 'A')
@@test_5 = Card.new('♦︎', 5)
@@test_10 = Card.new('♦︎', 10)
@@test_player = Player.new
def test_blackjack?
blackjack_player = Player.new
blackjack_player.hands << @@test_A
blackjack_player.hands << @@test_J
assert blackjack_player.blackjack?
blackjack_player.reset
blackjack_player.hands << @@test_J
blackjack_player.hands << @@test_A
assert blackjack_player.blackjack?
blackjack_player.reset
blackjack_player.hands << @@test_Q
blackjack_player.hands << @@test_A
assert blackjack_player.blackjack?
blackjack_player.reset
blackjack_player.hands << @@test_A
blackjack_player.hands << @@test_Q
assert blackjack_player.blackjack?
blackjack_player.reset
blackjack_player.hands << @@test_A
blackjack_player.hands << @@test_K
assert blackjack_player.blackjack?
blackjack_player.reset
blackjack_player.hands << @@test_K
blackjack_player.hands << @@test_A
assert blackjack_player.blackjack?
#falsches Muster
# blackjack_player.reset
# blackjack_player.hands << @@test_A
# blackjack_player.hands << @@test_10
# assert blackjack_player.blackjack?
# blackjack_player.reset
# blackjack_player.hands << @@test_5
# blackjack_player.hands << @@test_5
# assert blackjack_player.blackjack?
# blackjack_player.reset
# blackjack_player.hands << @@test_J
# blackjack_player.hands << @@test_Q
# assert blackjack_player.blackjack?
end
def test_burst?
burst_player = Player.new
burst_player.hands << @@test_J
burst_player.hands << @@test_J
burst_player.hands << @@test_5
burst_player.total_score_calc
burst_player.total_score
assert burst_player.burst?
# false
# burst_player.reset
# burst_player.hands << @@test_10
# burst_player.total_score
# assert burst_player.burst?
end
def test_total_score_calc
total_score_calc_player = Player.new
total_score_calc_player.hands << @@test_10
total_score_calc_player.hands << @@test_5
total_score_calc_player.total_score_calc
assert_equal 15, total_score_calc_player.total_score
# false
#assert_equal 10, total_score_calc_player.total_score
end
def test_convert
assert_equal 10, @@test_J.convert
assert_equal 10, @@test_Q.convert
assert_equal 10, @@test_K.convert
assert_equal 1, @@test_A.convert
assert_equal 5, @@test_5.convert
end
def test_draw_count
deck = Deck.new
assert_equal 1, @@test_player.draw
assert_equal 2, @@test_player.draw
assert_equal 3, @@test_player.draw
end
end
main.rb
require './player'
lose_message =<<~TEXT
Du verlierst
TEXT
win_message =<<~TEXT
Du gewinnst
TEXT
game_draw_message =<<~TEXT
Es ist eine Zeichnung
TEXT
error_message = "Ungültiges Zeichen. Tippen Sie es wieder ein"
class Play
attr_accessor :player, :dealer
def initialize
@player = Player.new
@dealer = Player.new(name: "Händler")
end
def test
@player.draw
@player.draw
@player.show
end
end
while true #Schleifenverarbeitung für die Wiedergabe
#Verarbeitung der ersten Runde
player = Player.new
dealer = Player.new(name: "Händler")
puts "Willkommen bei Blackjack"
puts "Karten verteilen"
player.draw
player.draw
dealer.draw
dealer.show
#Blackjack Test
# dealer.reset
# dealer.in_blackjac
# dealer.show
# player.reset
# player.in_blackjack
# player.show
#Verarbeitung, um zu bestätigen, dass der Spieler kein Blackjack ist
if player.blackjack?
puts "schwarzer Jack!"
player.show
else
player.show
puts h_or_s_message =<<~TEXT
Bitte auswählen
Push「h」,schlagen
Push「s」,Stand
TEXT
end
#Treffer, Standverarbeitung (Spieler ist an der Reihe)
while true
#Im Falle von Blackjack der Prozess des gewaltsamen Stehens
if player.blackjack?
command = 's'
else
command = gets.chomp #Wählen Sie Treffer oder Stand
end
#Bearbeitung bei Treffer
if command == "h"
while true
player.draw
if player.burst? #Überprüfen Sie, ob ein Burst vorliegt
player.show
puts "platzen! !!"
puts lose_message
break
end
#Bestätigung der Gesamtpunktzahl nach der Auslosung
player.show
#Beim Maximalwert (21) wird der Stand zwangsweise bearbeitet.
if player.total_score == 21
puts 'Die Gesamtpunktzahl hat das Maximum erreicht'
command = 's'
break
end
#Wenn es nicht der Maximalwert ist, drücken Sie erneut oder verarbeiten Sie
puts "Möchten Sie es noch einmal ziehen?"
puts h_or_s_message
while true
command = gets.chomp #Wieder schlagen oder stehen Auswahl
if command == 'h'
break
elsif command == 's'
break
else
puts error_message
redo
end
end
#Schlag- oder Standhandhabung
if command == 'h'
redo
elsif command == 's'
break
end
end
#Erzwungene Terminierungsverarbeitung zum Zeitpunkt des Bursts
if player.burst?
break
end
else
# h,Verarbeitung, wenn andere als s eingegeben werden
puts error_message
redo
end
#Bearbeitung am Stand (Händler an der Reihe)
if command == 's'
#Dealer-Handling, wenn der Spieler Blackjack ist
if player.blackjack?
dealer.draw
dealer.show
if !dealer.blackjack?
puts win_message
break
else
puts game_draw_message
break
end
end
#Der Prozess, den der Dealer so lange durchführt, bis der Spieler gewinnt
while player.total_score > dealer.total_score
dealer.draw
dealer.show
if dealer.burst?
puts 'platzen!'
puts win_message
break
elsif dealer.total_score == 21 && player.total_score == 21
break
end
end
if dealer.burst? #Wenn es einen Burst gibt, endet die Verarbeitung
break
elsif dealer.total_score == 21 && player.total_score == 21 #Überprüfen Sie, ob die anderen den Maximalwert nicht erreicht haben
puts game_draw_message
break
else
puts lose_message
break
end
end
end
#Wiederholungsverarbeitung
puts <<~TEXT
Möchten Sie noch einmal spielen?
Bitte auswählen
Push「h」,Ja
Push「s」,Nein
TEXT
while true
command = gets.chomp #Wählen Sie die Wiedergabe
if command == "h"
command = nil
break
elsif command == "s"
break
else
puts error_message
redo
end
end
#Wiederholungsverarbeitung
if command == nil
redo
else
break
end
end
Zuerst habe ich "p" anstelle von minitest verwendet, aber Ich habe verstanden, dass die Arbeit schneller sein würde, wenn ich sie verwenden würde.
Wenn Sie nicht "test" in das erste Wort des Methodennamens von minitest einfügen Ich habe völlig vergessen, es nicht zu testen und ich war besorgt über 2 Tage, aber lol
Sie werden Ihr Verständnis vertiefen, wenn Sie Dinge, die Sie noch nie benutzt haben, aktiv nutzen.
Es gibt noch viele Orte, die umgestaltet werden können, Ich war es fast leid, es zu schaffen, also schrieb ich einmal Qiita.
Recommended Posts