CoRサンプル集: テトリスのような落ちものパズルゲームのサンプル
テトリスのような落ちものパズルゲームのサンプル。
音楽・画像などの素材は一切使用していないので、コピペだけで移植出来ます。
操作方法
横移動:←→
ソフトドロップ:↓
ハードドロップ:↑
左回転:Z
右回転:X
ホールド:C
音楽・画像などの素材は一切使用していないので、コピペだけで移植出来ます。
操作方法
横移動:←→
ソフトドロップ:↓
ハードドロップ:↑
左回転:Z
右回転:X
ホールド:C
プレー:3
(人数:2)
クリア:2
評価: 10 (1回)
タグが設定されていません
#==============================================================================
# 日時を扱うためのユーティリティクラス
# getLocalCurrentTimeMillisecond()が使えなかったので、getLocalCurrentDate()で対応
#==============================================================================
class DateTimeArray
DAY_MS = 24 * 60 * 60 * 1000
# 読み取り専用のメソッドを定義
attr_reader :year, :month, :day, :hour, :minute, :second, :millisecond
# 指定された配列からインスタンスを生成する
#
# @param date [Array<Integer>] 日時配列 [年, 月, 日, 時, 分, 秒, ミリ秒]
def initialize(date)
@year, @month, @day, @hour, @minute, @second, @millisecond = date
end
# 2つの日時配列の差分をミリ秒単位で計算する
#
# @param date1_array [Array<Integer>] 1つ目の日時配列
# @param date2_array [Array<Integer>] 2つ目の日時配列
# @return [Integer] ミリ秒単位の差分(絶対値)
def self.diff_ms(date1_array, date2_array)
d1 = DateTimeArray.new(date1_array)
d2 = DateTimeArray.new(date2_array)
total_ms = 0
# 年差の計算(異なる場合のみ)
if d1.year != d2.year
start_year, end_year = [d1.year, d2.year].minmax
(start_year...end_year).each do |y|
total_ms += (leap_year?(y) ? 366 : 365) * DAY_MS
end
end
# 日数の差分
# 同じ年かつ同じ月なら日差を直接計算
if d1.year == d2.year && d1.month == d2.month
total_ms += (d1.day - d2.day).abs * DAY_MS
else
# 年または月が異なる場合、各日付を年初からの日数で表し差分を計算
total_ms += (d1.day_of_year - d2.day_of_year).abs * DAY_MS
end
# 時刻部分の差分
total_ms += (d1.time_of_day_ms - d2.time_of_day_ms).abs
return total_ms
end
# 指定日時が1970年1月1日から何ミリ秒経過しているかを返す
#
# @param date_array [Array<Integer>] 日時配列
# @return [Integer] UNIXエポックからのミリ秒
def self.to_unixepoch_ms(date_array)
return diff_ms(date_array, [1970, 1, 1, 0, 0, 0, 0])
end
# 指定年がうるう年かどうかを判定する
#
# @param year [Integer] 対象の年
# @return [Boolean] うるう年であればtrue
def self.leap_year?(year)
return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)
end
# 指定年・月の月日数を返す
#
# @param year [Integer] 対象の年
# @param month [Integer] 対象の月
# @return [Integer] 日数
def self.days_in_month(year, month)
case month
when 1, 3, 5, 7, 8, 10, 12
return 31
when 4, 6, 9, 11
return 30
when 2
return leap_year?(year) ? 29 : 28
else
raise "Invalid month: #{month}"
end
end
# 年始からの通算日数(0開始)を返す
#
# @return [Integer] 日数(0始まり)
def day_of_year
days = @day
(1...@month).each do |m|
days += self.class.days_in_month(@year, m)
end
return days - 1
end
# 時刻部分(時・分・秒・ミリ秒)をミリ秒に換算して返す
#
# @return [Integer] ミリ秒
def time_of_day_ms
return @hour * 3600000 + @minute * 60000 + @second * 1000 + @millisecond
end
# UNIXエポックからの経過時間(ミリ秒)を返す
#
# @return [Integer] UNIX時間(ミリ秒)
def to_unixepoch_ms
return self.class.to_unixepoch_ms([@year, @month, @day, @hour, @minute, @second, @millisecond])
end
end
コード一覧
- datetime_array.rb
- defines.rb
- extension.rb
- grid_util.rb
- hold.rb
- input_handler.rb
- input_manager.rb
- piece.rb
- score.rb
- start.rb
プレー内容を公開する