
دليل خطوة بخطوة عن برمجة ألعاب ألغاز باستخدام لغة روبي Ruby
تُعد ألعاب الألغاز من أكثر أنواع الألعاب جاذبية وتحديًا، ويمكن للغة روبي Ruby،
ببساطتها ومرونتها، أن تكون أداة رائعة لإنشاء هذه الألعاب. في هذا المقال، سنستعرض
خطوات برمجة لعبة ألغاز بسيطة تعتمد على النصوص باستخدام روبي Ruby .
خطوات برمجة لعبة ألغاز بسيطة باستخدام روبي Ruby :
* تحديد هيكل اللعبة :
سنقوم بإنشاء لعبة ألغاز بسيطة تعتمد على تخمين كلمة سرية.
سيتضمن التطبيق وظائف لتعيين كلمة السر، وأخذ تخمينات من المستخدم،
والتحقق من صحة التخمين، وتقديم تلميحات.
* تعيين كلمة السر :
سنقوم بإنشاء وظيفة لتعيين كلمة السر بشكل عشوائي من قائمة كلمات أو السماح للمستخدم بتعيينها.
الكود (تعيين كلمة سر عشوائية) :
Ruby
def set_secret_word(word_list)
@secret_word = word_list.sample.downcase
@attempts_left = 5 # عدد المحاولات المتاحة
puts "تم تعيين كلمة السر. لديك #{@attempts_left} محاولة لتخمينها."
end
word_list = ["تفاحة", "موزة", "برتقالة", "عنب", "مانجو"]
set_secret_word(word_list)
--
* أخذ تخمين من المستخدم :
سنقوم بإنشاء وظيفة تأخذ تخمينًا من المستخدم عبر سطر الأوامر :
Ruby
def get_guess
print "أدخل تخمينك: "
gets.chomp.downcase
end
--
* التحقق من صحة التخمين :
سنقوم بإنشاء وظيفة تقارن تخمين المستخدم بكلمة السر.
سنقدم ملاحظات للمستخدم حول مدى قرب تخمينه من الكلمة الصحيحة
(مثل عدد الأحرف الصحيحة في المكان الصحيح) :
Ruby
def check_guess(guess)
if guess == @secret_word
puts "تهانينا! لقد خمنت كلمة السر بشكل صحيح: #{@secret_word}"
return true
else
@attempts_left -= 1
if @attempts_left > 0
correct_letters = 0
guess.chars.each_with_index do |char, index|
if @secret_word[index] == char
correct_letters += 1
end
end
puts "تخمين خاطئ. لديك #{correct_letters} حرف صحيح في المكان الصحيح. تبقى لديك #{@attempts_left} محاولة."
return false
else
puts "لقد نفدت محاولاتك. كلمة السر كانت: #{@secret_word}"
return true
end
end
end
--
* حلقة اللعبة الرئيسية :
سنقوم بإنشاء حلقة while تستمر حتى يخمن المستخدم الكلمة الصحيحة أو تنتهي محاولاته :
Ruby
while @attempts_left > 0
guess = get_guess
if check_guess(guess)
break
end
end
--
* تنظيم اللعبة في فئة (Class) :
لتنظيم الكود بشكل أفضل، يمكننا تجميع وظائف اللعبة في فئة واحدة :
class GuessingGamedef initialize(word_list, attempts = 5)@word_list = word_list@attempts_left = attempts@secret_word = nilenddef set_secret_word@secret_word = @word_list.sample.downcaseputs "تم تعيين كلمة السر. لديك #{@attempts_left} محاولة لتخمينها."enddef get_guessprint "أدخل تخمينك: "gets.chomp.downcaseenddef check_guess(guess)if guess == @secret_wordputs "تهانينا! لقد خمنت كلمة السر بشكل صحيح: #{@secret_word}"return trueelse@attempts_left -= 1if @attempts_left > 0correct_letters = 0guess.chars.each_with_index do |char, index|if @secret_word[index] == charcorrect_letters += 1endendputs "تخمين خاطئ. لديك #{correct_letters} حرف صحيح في المكان الصحيح. تبقى لديك #{@attempts_left} محاولة."return falseelseputs "لقد نفدت محاولاتك. كلمة السر كانت: #{@secret_word}"return trueendendenddef playset_secret_wordwhile @attempts_left > 0guess = get_guessif check_guess(guess)breakendendendendword_list = ["كمبيوتر", "برمجة", "تكنولوجيا", "هاتف", "شبكة"]game = GuessingGame.new(word_list)game.play
* إضافة مستويات صعوبة مختلفة :
سنقوم بتعديل الفئة GuessingGame لقبول مستوى صعوبة يحدد عدد
المحاولات المتاحة وطول الكلمات المحتملة :
Ruby
require 'tk'
class GuessingGame
def initialize(difficulty = :easy)
@difficulty = difficulty
@attempts_left = set_attempts
@word_list = set_word_list
@secret_word = nil
@hinted_letters = []
end
def set_attempts
case @difficulty
when :easy then 10
when :medium then 7
when :hard then 5
else 7
end
end
def set_word_list
case @difficulty
when :easy then ["apple", "banana", "orange", "grape"]
when :medium then ["computer", "programming", "technology", "phone"]
when :hard then ["cryptography", "algorithm", "abstraction", "inheritance"]
else ["default", "words"]
end
end
def set_secret_word
@secret_word = @word_list.sample.downcase
puts "تم تعيين كلمة السر (#{word_length} أحرف). لديك #{@attempts_left} محاولة."
end
def word_length
@secret_word.length
end
# ... (باقي وظائف اللعبة: get_guess, check_guess) ...
end
# ... (واجهة المستخدم Tkinter سيتم إضافتها لاحقًا) ...
--
* توفير تلميحات أكثر تفصيلاً :
سنضيف وظيفة لتقديم تلميح يكشف عن حرف عشوائي في كلمة السر، مع خصم محاولة إضافية.
الكود (داخل فئة GuessingGame):
Ruby
def get_hint
if @attempts_left > 1 && @hinted_letters.length < word_length
available_letters = @secret_word.chars.each_with_index.reject { |char, index| @hinted_letters.include?(index) }.map(&:last)
if !available_letters.empty?
hint_index = available_letters.sample
@hinted_letters << hint_index
@attempts_left -= 1
puts "تلميح: الحرف في الموضع #{hint_index + 1} هو '#{@secret_word[hint_index]}'. تبقى لديك #{@attempts_left} محاولة."
else
puts "لا يمكن تقديم المزيد من التلميحات."
end
else
puts "لا يمكنك طلب تلميح الآن."
end
end
# ... (تعديل حلقة اللعبة وواجهة المستخدم لاستدعاء get_hint) ...
--
* إنشاء واجهة مستخدم رسومية باستخدام Tkinter :
سنستخدم مكتبة tk (المضمنة مع روبي ) لإنشاء واجهة رسومية بسيطة للعبة :
require 'tk'require 'json'
class GuessingGameGUI def initialize(root, difficulty = :easy) @root = root @root.title("لعبة تخمين الكلمات") @game = GuessingGame.new(difficulty) @secret_word_label = TkLabel.new(@root) { text ''; pack { padx 10; pady 10 } } @attempts_label = TkLabel.new(@root) { text ''; pack { padx 10; pady 5 } } @hint_button = TkButton.new(@root) { text 'احصل على تلميح'; command { @game.get_hint; update_labels }; pack { padx 10; pady 5 } } @guess_entry = TkEntry.new(@root) { pack { padx 10; pady 5 } } @guess_button = TkButton.new(@root) { text 'خمن!'; command { make_guess }; pack { padx 10; pady 10 } } @result_label = TkLabel.new(@root) { text ''; pack { padx 10; pady 5 } }
menubar = TkMenu.new(@root) filemenu = TkMenu.new(menubar) filemenu.add_command(label: "حفظ النتيجة", command: proc { save_score }) filemenu.add_command(label: "عرض لوحة الصدارة", command: proc { show_high_scores }) filemenu.add_separator filemenu.add_command(label: "خروج", command: proc { exit }) menubar.add_cascade(label: "ملف", menu: filemenu) @root.menu(menubar)
@game.set_secret_word update_labels end
def update_labels @secret_word_label['text'] = "كلمة السر: #{'_' * @game.word_length}" @attempts_label['text'] = "المحاولات المتبقية: #{@game.attempts_left}" end
def make_guess guess = @guess_entry.get.downcase @guess_entry.delete(0, 'end') if @game.check_guess(guess) @result_label['text'] = @game.attempts_left > 0 ? "تهانينا!" : "انتهت اللعبة. كلمة السر كانت: #{@game.secret_word}" @hint_button.state = :disabled @guess_button.state = :disabled else @result_label['text'] = "تخمين خاطئ." end update_labels end
def save_score name = Tk.getSaveFile(title: "حفظ النتيجة", defaultextension: ".json") return unless name scores = load_scores scores << { name: name.split('/').last.gsub('.json', ''), score: @game.attempts_left } File.open(name, 'w') { |f| f.puts JSON.generate(scores.sort_by { |s| -s[:score] }) } Tk::messageBox.showinfo("تم الحفظ", "تم حفظ نتيجتك!") end
def load_scores name = Tk.getOpenFile(title: "تحميل النتائج", defaultextension: ".json") return [] unless name begin JSON.parse(File.read(name)) rescue JSON::ParserError, Errno::ENOENT [] end end
def show_high_scores scores = load_scores if scores.empty? Tk::messageBox.showinfo("لوحة الصدارة", "لا توجد نتائج محفوظة حتى الآن.") return end score_window = TkToplevel.new(@root) { title "لوحة الصدارة" } score_text = TkText.new(score_window) { pack } scores.each_with_index { |s, i| score_text.insert('end', "#{i + 1}. #{s[:name]}: #{s[:score]} محاولات متبقية\n") } score_text['state'] = :disabled endend
class GuessingGame # (الكود الخاص بالفئة GuessingGame كما هو موضح سابقًا)end
root = TkRoot.new { title "لعبة تخمين الكلمات" }game_gui = GuessingGameGUI.new(root, :medium) # يمكنك تغيير مستوى الصعوبة هناTk.mainloop
* تشغيل اللعبة مع الواجهة الرسومية :
- احفظ الكود أعلاه في ملف باسم guessing_game_gui.rb.
- افتح سطر الأوامر أو الطرفية.
- انتقل إلى الدليل الذي حفظت فيه الملف.
- قم بتشغيل اللعبة باستخدام الأمر: ruby guessing_game_gui.rb
سيظهر الآن نافذة رسومية للعبة تخمين الكلمات مع خيارات للحصول على تلميح،
وإدخال التخمينات، وعرض النتائج، وحفظ النتيجة، وعرض لوحة الصدارة.
لنسخة سطر الأوامر : احفظ الكود الأساسي للعبة (بدون فئة GuessingGameGUI)
في ملف وقم بتشغيله باستخدام ruby your_file_name.rb.
لنسخة الواجهة الرسومية : احفظ الكود الكامل
(بما في ذلك فئة GuessingGameGUI وفئة GuessingGame)
في ملف وقم بتشغيله باستخدام ruby your_file_name.rb.
* الخاتمة :
في هذا المقال المُوسع، قمنا ببرمجة وتطوير لعبة ألغاز بسيطة وتخمين الكلمات
باستخدام روبي لتشمل مستويات صعوبة متنوعة، وتوفير تلميحات مفيدة، وإنشاء
واجهة مستخدم رسومية جذابة باستخدام Tkinter، وإضافة وظيفة لحفظ نتائج
اللاعبين وعرض لوحة الصدارة. يمكن الاستمرار في تطوير هذه اللعبة بإضافة
المزيد من الميزات وتحسين تجربة المستخدم، يمكن تطوير هذا
الأساس لإنشاء أنواع أخرى من ألعاب الألغاز النصية أو حتى ألعاب ألغاز رسومية أكثر تعقيدًا
باستخدام مكتبات Ruby المناسبة. Ruby ، ببنيتها الواضحة وقراءتها السهلة، تجعل عملية تطوير الألعاب ممتعة وفعالة.