Rubyサンプルコードです。Rubyも参照のこと。
Rubyによるちょっとしたゲーム。自作ですが、作業所のみんなで開発したPerlのプログラムを参考にしています。
class Player
def initialize(name, hp, atk)
@name = name
@hp = hp
@atk = atk
end
def name()
return @name
end
def damaged(power)
puts "#{@name}は#{power}ダメージを受けた。"
@hp -= power
end
def attack(player)
puts "#{@name}は#{player.name()}を攻撃した。"
player.damaged(@atk)
end
def print_hp()
puts "#{@name}の残りHPは#{@hp}になった。"
end
end
player1 = Player.new("戦士", 100, 10)
player2 = Player.new("魔法使い", 50, 15)
boss = Player.new("ボス", 1000, 20)
for i in 1..5 do
puts "ターン#{i}"
player1.attack(boss)
player2.attack(boss)
boss.attack(player1)
boss.attack(player2)
player1.print_hp()
player2.print_hp()
boss.print_hp()
print "\n"
end
出力:
ターン1 戦士はボスを攻撃した。 ボスは10ダメージを受けた。 魔法使いはボスを攻撃した。 ボスは15ダメージを受けた。 ボスは戦士を攻撃した。 戦士は20ダメージを受けた。 ボスは魔法使いを攻撃した。 魔法使いは20ダメージを受けた。 戦士の残りHPは80になった。 魔法使いの残りHPは30になった。 ボスの残りHPは975になった。 ターン2 戦士はボスを攻撃した。 ボスは10ダメージを受けた。 魔法使いはボスを攻撃した。 ボスは15ダメージを受けた。 ボスは戦士を攻撃した。 戦士は20ダメージを受けた。 ボスは魔法使いを攻撃した。 魔法使いは20ダメージを受けた。 戦士の残りHPは60になった。 魔法使いの残りHPは10になった。 ボスの残りHPは950になった。 ターン3 戦士はボスを攻撃した。 ボスは10ダメージを受けた。 魔法使いはボスを攻撃した。 ボスは15ダメージを受けた。 ボスは戦士を攻撃した。 戦士は20ダメージを受けた。 ボスは魔法使いを攻撃した。 魔法使いは20ダメージを受けた。 戦士の残りHPは40になった。 魔法使いの残りHPは-10になった。 ボスの残りHPは925になった。 ターン4 戦士はボスを攻撃した。 ボスは10ダメージを受けた。 魔法使いはボスを攻撃した。 ボスは15ダメージを受けた。 ボスは戦士を攻撃した。 戦士は20ダメージを受けた。 ボスは魔法使いを攻撃した。 魔法使いは20ダメージを受けた。 戦士の残りHPは20になった。 魔法使いの残りHPは-30になった。 ボスの残りHPは900になった。 ターン5 戦士はボスを攻撃した。 ボスは10ダメージを受けた。 魔法使いはボスを攻撃した。 ボスは15ダメージを受けた。 ボスは戦士を攻撃した。 戦士は20ダメージを受けた。 ボスは魔法使いを攻撃した。 魔法使いは20ダメージを受けた。 戦士の残りHPは0になった。 魔法使いの残りHPは-50になった。 ボスの残りHPは875になった。
ブラウザでRubyをコンパイル・実行できるPaiza.io上で開発しました。
継承を使って魔法を実装したバージョン。
class Player
def initialize(name, hp, atk)
@name = name
@hp = hp
@atk = atk
end
def name()
return @name
end
def damaged(power)
puts "#{@name}は#{power}ダメージを受けた。"
@hp -= power
end
def attack(player)
puts "#{@name}は#{player.name()}を攻撃した。"
player.damaged(@atk)
end
def print_hp()
puts "#{@name}の残りHPは#{@hp}になった。"
end
end
class Mage < Player
def initialize(name, hp, atk)
super
end
def attack(player)
puts "#{@name}は#{player.name()}に大魔法エクスカリバーを唱えた。"
player.damaged(@atk + 100)
end
end
player1 = Player.new("戦士", 100, 10)
player2 = Mage.new("魔法使い", 50, 15)
boss = Player.new("ボス", 1000, 20)
for i in 1..5 do
puts "ターン#{i}"
player1.attack(boss)
player2.attack(boss)
boss.attack(player1)
boss.attack(player2)
player1.print_hp()
player2.print_hp()
boss.print_hp()
print "\n"
end
出力:
ターン1 戦士はボスを攻撃した。 ボスは10ダメージを受けた。 魔法使いはボスに大魔法エクスカリバーを唱えた。 ボスは115ダメージを受けた。 ボスは戦士を攻撃した。 戦士は20ダメージを受けた。 ボスは魔法使いを攻撃した。 魔法使いは20ダメージを受けた。 戦士の残りHPは80になった。 魔法使いの残りHPは30になった。 ボスの残りHPは875になった。 ターン2 戦士はボスを攻撃した。 ボスは10ダメージを受けた。 魔法使いはボスに大魔法エクスカリバーを唱えた。 ボスは115ダメージを受けた。 ボスは戦士を攻撃した。 戦士は20ダメージを受けた。 ボスは魔法使いを攻撃した。 魔法使いは20ダメージを受けた。 戦士の残りHPは60になった。 魔法使いの残りHPは10になった。 ボスの残りHPは750になった。 ターン3 戦士はボスを攻撃した。 ボスは10ダメージを受けた。 魔法使いはボスに大魔法エクスカリバーを唱えた。 ボスは115ダメージを受けた。 ボスは戦士を攻撃した。 戦士は20ダメージを受けた。 ボスは魔法使いを攻撃した。 魔法使いは20ダメージを受けた。 戦士の残りHPは40になった。 魔法使いの残りHPは-10になった。 ボスの残りHPは625になった。 ターン4 戦士はボスを攻撃した。 ボスは10ダメージを受けた。 魔法使いはボスに大魔法エクスカリバーを唱えた。 ボスは115ダメージを受けた。 ボスは戦士を攻撃した。 戦士は20ダメージを受けた。 ボスは魔法使いを攻撃した。 魔法使いは20ダメージを受けた。 戦士の残りHPは20になった。 魔法使いの残りHPは-30になった。 ボスの残りHPは500になった。 ターン5 戦士はボスを攻撃した。 ボスは10ダメージを受けた。 魔法使いはボスに大魔法エクスカリバーを唱えた。 ボスは115ダメージを受けた。 ボスは戦士を攻撃した。 戦士は20ダメージを受けた。 ボスは魔法使いを攻撃した。 魔法使いは20ダメージを受けた。 戦士の残りHPは0になった。 魔法使いの残りHPは-50になった。 ボスの残りHPは375になった。
自分で作った適当なスクリプト。<!--が二重になっている行を教えてくれる。いろいろと改善の余地はあるが自分で簡単に使う範囲ではこれでも使える。
count = 0
line_count = 0
io = File.open("diffA.txt")
while line = io.gets
line_count += 1
if /<!--/ =~ line
if /-->/ =~ line
count = 0
else
count += 1
end
if count > 1
puts line_count
end
end
if /-->/ =~ line
count = 0
end
end
ただし、これには一行の中に<!-- ~ -->があった時に、その前から<!--が二重になっていた時には検知してくれない。修正版は以下。
count = 0
line_count = 0
io = File.open("diffA.txt")
while line = io.gets
line_count += 1
if /<!--/ =~ line
if /-->/ =~ line
if count > 0
puts line_count
count = 0
end
else
count += 1
if count > 1
puts line_count
end
end
end
if /-->/ =~ line
count = 0
end
end
まだ問題はあるが、とりあえず普段使う分には十分のスクリプトである。全部を想定することをするよりも、必要に応じてスクリプトを書き換えて使うべきである。
後日注記:実際のところ、このスクリプトは同じ行で<!--と-->の両方があった時に順番や個数を考えないため、仕様どおりの実装はできていない。単純に書いただけなので、仕様通りのものが欲しいのであれば自分で正規表現を使って作ればいいと思う。
以下はRubyで僕が書いたFizzBuzz。
for i in 1..100 do
if (i % 15 == 0)
print("FizzBuzz, ")
elsif (i % 3 == 0)
print("Fizz, ")
elsif (i % 5 == 0)
print("Buzz, ")
else
print("#{i}, ")
end
end
puts("終了.")
実行結果:
1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz, 16, 17, Fizz, 19, Buzz, Fizz, 22, 23, Fizz, Buzz, 26, Fizz, 28, 29, FizzBuzz, 31, 32, Fizz, 34, Buzz, Fizz, 37, 38, Fizz, Buzz, 41, Fizz, 43, 44, FizzBuzz, 46, 47, Fizz, 49, Buzz, Fizz, 52, 53, Fizz, Buzz, 56, Fizz, 58, 59, FizzBuzz, 61, 62, Fizz, 64, Buzz, Fizz, 67, 68, Fizz, Buzz, 71, Fizz, 73, 74, FizzBuzz, 76, 77, Fizz, 79, Buzz, Fizz, 82, 83, Fizz, Buzz, 86, Fizz, 88, 89, FizzBuzz, 91, 92, Fizz, 94, Buzz, Fizz, 97, 98, Fizz, Buzz, 終了.
FizzBuzzの詳細についてはC言語サンプルコードを参照のこと。
2023.05.17