القائمة الرئيسية

الصفحات

دليل خطوة بخطوة عن برمجة ألعاب ألغاز باستخدام لغة روبي Ruby

هيكل لعبة روبي، تصميم لعبة روبي، إنشاء واجهة مستخدم رسومية باستخدام مكتبات مثل Tk أو Shoes، حفظ نتائج روبي، لوحة صدارة روبي، ملفات JSON روبي، واجهة رسومية روبي، Tkinter روبي، GUI روبي، تلميحات ألعاب روبي، مساعدة في الألغاز روبي، مستويات صعوبة روبي، صعوبة ألعاب روبي، فئات روبي، برمجة كائنية روبي، تنظيم الكود روبي، حلقة روبي، منطق التحكم روبي، مقارنة النصوص روبي، منطق اللعبة روبي، محاولات روبي، إدخال المستخدم روبي، سطر الأوامر روبي، كلمة سر روبي، عشوائية روبي، قائمة روبي، برمجة ألعاب روبي، ألعاب ألغاز روبي، تطوير ألعاب Ruby، Ruby ألعاب نصية، إنشاء ألعاب ألغاز Ruby، Ruby game development، Ruby puzzle games، برمجة ألعاب روبي، ألعاب ألغاز روبي، تطوير ألعاب Ruby، Ruby ألعاب رسومية، إنشاء ألعاب ألغاز Ruby Tkinter، حفظ نتائج ألعاب روبي، Ruby game development، Ruby puzzle games، Ruby Tkinter GUI، برمجة ألعاب ألغاز (Puzzle games) بلغة روبي، برمجة ألعاب ألغاز بسيطة باستخدام لغة روبي، دليل خطوة بخطوة لبرمجة ألعاب ألغاز باستخدام لغة روبي Ruby، دليل خطوة بخطوة عن برمجة ألعاب ألغاز باستخدام لغة روبي Ruby، Ruby puzzle games، Ruby Tkinter GUI، تطوير ألعاب Ruby، ملفات JSON روبي، A step-by-step guide to coding puzzle games using Ruby،




دليل خطوة بخطوة عن برمجة ألعاب ألغاز باستخدام لغة روبي 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 GuessingGame
      def initialize(word_list, attempts = 5)
        @word_list = word_list
        @attempts_left = attempts
        @secret_word = nil
      end

      def set_secret_word
        @secret_word = @word_list.sample.downcase
        puts "تم تعيين كلمة السر. لديك #{@attempts_left} محاولة لتخمينها."
      end

      def get_guess
        print "أدخل تخمينك: "
        gets.chomp.downcase
      end

      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

      def play
        set_secret_word
        while @attempts_left > 0
          guess = get_guess
          if check_guess(guess)
            break
          end
        end
      end
    end

    word_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
  end
end

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 ، ببنيتها الواضحة وقراءتها السهلة، تجعل عملية تطوير الألعاب ممتعة وفعالة.



جدول المحتويات