スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Ruby]ライフゲームを作ってみた  最終更新日:2009/07/09

ちょっとお勉強と,今作りたいゲームの下準備としてライフゲームを作ってみました.CUIで.

lifegame.zip

ソースとドキュメントも中に入っています.

Rdoc便利だわぁ…….

ソースを以下に書きます.が,長いので読みたい人だけどうぞ.

[[2009/07/09更新]]
入力が面倒だったため、プレイヤーが入力した文字列を元にランダムにセルを設置するモード追加。
プログラミングの技術がびっくりするほど未熟なため,常時突っ込みお叱り提案募集しております.

#! ruby -Ks
require "yaml"

class LifeGame
MASS_SIZE = 20
MAX_TURN = 100
CHARACTER = 10
INPUT_CHA = 50

def initialize
set_count
set_input
main
end

def set_mass
@mass = Array.new(MASS_SIZE, nil)
@mass.each_index do |i|
@mass[i] = Array.new(MASS_SIZE, 0)
end
end

def set_input
a = "abcdefghijklmnopqrst"
b = 0
key = Array.new
for i in 1..MASS_SIZE
for j in 0..(MASS_SIZE - 1)
key << "#{a[j].chr}#{i}"
key << b
b += 1
end
end
@input = Hash[*key]
end

def set_count
@count = Array.new
for i in 1..MASS_SIZE
if i < 10
@count << " #{i}"
else
@count << "#{i}"
end
end
end

def show_gamefeild
system "cls"
puts " abcdefghijklmnopqrst"
@mass.each_index do |i|
print @count[i]
@mass[i].each_index do |j|
case @mass[i][j]
when 0
print "□"
when 1
print "■"
end
end
puts
end
end

def new_input?(str)
@check.each do |i|
return false if i == str
end
@check << str
return true
end

def set_game
set_mass
set = CHARACTER
@check = Array[""]
while set > 0
show_gamefeild
print "\na1~t20を入力し、初期配置を行ってください。\n\n残り#{set} : "
key = gets.chomp.downcase
break if key == "end"
if new_input?(key) and @input.has_key?(key)
i = @input[key]
x = 0
while i >= MASS_SIZE
x +=1
i -= MASS_SIZE
end
@mass[x][i] = 1
set -= 1
else
system "cls"
puts "\n\n\n入力されたマスは存在しないか、すでに入力したマスです。"
sleep 1
end
end
@save = @mass
show_gamefeild
end

def life_game
@live = 0
check = @mass
set_mass
check.each_index do |i|
check[i].each_index do |j|
count = 0
for k in [i - 1, i , i + 1]
if (0..(MASS_SIZE - 1)).include?(k)
for l in [j - 1, j, j + 1]
count += check[k][l] if(0..(MASS_SIZE - 1)).include?(l)
end
end
end
case check[i][j]
when 0
@live += @mass[i][j] = 1 if count == 3
when 1
count -= check[i][j]
if count <= 1 or count >= 4
@mass[i][j] = 0
else
@live += @mass[i][j] = 1
end
end
end
end
@turn += 1
end

def save_file
time = Time.now
if FileTest.exist?("save.yml")
YAML.dump([@save, time.strftime("%y/%m/%d %H:%M")], file = File.open('save.yml', 'a+'))
else
YAML.dump([@save, time.strftime("%y/%m/%d %H:%M")], file = File.open('save.yml', 'w'))
end
file.close
end

def new_game(n)
print "\n   ENTERを押すとゲームが始まります。"
gets
@turn = 0
while @turn < MAX_TURN
life_game
show_gamefeild
puts "\n現在のターン数:#{@turn}  生存数:#{@live}"
sleep n
end
end

def save_choice
while true
print "セルの初期位置をセーブしますか? y/n :"
bool = gets.chomp
if bool == "y"
save_file
puts "セーブしました!"
break
elsif bool == "n"
break
else
puts "y か n を入力してください!"
sleep 1
end
end
end

def load_game
if FileTest.exist?("save.yml")
@load = Array.new
no = 0
puts "           ┌───────────────┐"
puts "           │セーブデータを選択してください│"
File.open("save.yml") do |io|
YAML.load_documents(io) do |doc|
@load << doc[0]
if no < 100
puts "           │ [0#{no}]#{doc[1]} │"
else
puts "           │ [#{no}]#{doc[1]} │"
end
no += 1
end
end
puts "           └───────────────┘"
print "\n\n                入力:"
num = gets.chomp
if /^[0-9]+$/ =~ num
if (0..(no - 1)).include?(num.to_i)
@mass = @load[num.to_i]
show_gamefeild
else
puts "             不正な数値です。"
end
else
puts "             数値で指定してください。"
end
else
puts "\n\n\n\n\n\n\n\n\n\n\n\n             セーブデータが存在しません"
return
end
end

def input_game
set_mass
puts "\n\n\n\n\n\n\n\n\n\n            好きな言葉を入力して下しさい。"
print "\n         入力:"
str = gets.chomp
check = count = 0
str.each_byte {|c| count += c}
srand(count)
while check < INPUT_CHA
i = rand(MASS_SIZE)
j = rand(MASS_SIZE)
if @mass[i][j] == 0
@mass[i][j] = 1
check += 1
end
end
@save = @mass
show_gamefeild
end

def set_random
set_mass
srand
@mass.each_index do |i|
@mass[i].each_index do |j|
@mass[i][j] = rand(2)
end
end
@save = @mass
show_gamefeild
end

def main
system "cls"
puts "\n\n\n\n\n"
puts "           ┌───────────────┐"
puts "           │ゲームモードを入力してください│"
puts "           │ │"
puts "           │ 0:NewGame(LowSpeed) │"
puts "           │ 1:NewGame(HiSpeed) │"
puts "           │ 2:InputGame(LowSpeed) │"
puts "           │ 3:InputGame(HiSpeed) │"
puts "           │ 4:LoadGame(LowSpeed) │"
puts "           │ 5:LoadGame(HiSpeed) │"
puts "           │ 999:Random(HiSpeed) │" if rand(10) == 0
puts "           │ 9:Exit │"
puts "           │ │"
puts "           └───────────────┘"
print "\n\n                入力:"
mode = gets.chomp
system "cls"
if /^[0-9]+$/ =~ mode
case mode.to_i
when 0
set_game
new_game(1)
save_choice
when 1
set_game
new_game(0)
save_choice
when 2
input_game
new_game(1)
save_choice
when 3
input_game
new_game(0)
save_choice
when 4
load_game
new_game(1)
puts "ロードを終了します。"
when 5
load_game
new_game(0)
puts "ロードを終了します。"
when 9
puts "\n\n\n\n\n\n\n\n\n\n\n\n                 バイバイ!"
sleep 1
exit
when 999
set_random
new_game(0)
save_choice
else
puts "\n\n\n\n\n\n\n\n\n\n\n\n               そんなモードないよ!"
end
else
puts "\n\n\n\n\n\n\n\n\n\n\n\n               半角数字を入力してよ!"
end
sleep 1
main
end
end

LifeGame.new

テーマ : プログラミング - ジャンル : コンピュータ

コメント

ご無沙汰!

さっそくやってみたら、ゲームモード入力の際
999:Random(HiSpeed)
が、初回以降全く出なくなったんですが
これは仕様ですか?

もしかして、このモード自体がランダム出現?

ご無沙汰!

そう,ランダムモードすらランダムで表示されますw
まあ,モード番号入れちゃえば動くんだけどね.

もともとデバッグ用の機能ですじゃ.
コメントの投稿
管理者にだけ表示を許可する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。