[سكربت] لعبة ترتيب الأرقام .. من برمجتي

الموضوع في 'جنو / لينكس - GNU / Linux' بواسطة Linux Leader, بتاريخ ‏31 يناير 2010.

تم تحميل الصفحة في 0,3961943 ثانية
  1. Linux Leader

    Linux Leader Beginner Developer

    إنضم إلينا في:
    ‏12 ديسمبر 2009
    المشاركات:
    125
    الإعجابات المتلقاة:
    12
    نقاط الجائزة:
    0
    Credits:
    0
    السلام عليكم ورحمة الله وبركاته ..

    طلب مننا دكتور برمجة النظم ان نعمل لعبة ترتيب الأرقام بلغة السي شل ..

    والحمد لله استطعت برمجتها .. ليست بالمستوى الإحترافي ولكنها تفي بالغرض ..

    وأحببت أن أضعها لكم هنا كنوع من المشاركة .. وكذلك لأخذ أرائكم وانتقاداتكم وكذلك تطويركم للعبة ..

    فكرة اللعبة ..
    توجد 8 مستويات .. من 3 إلى 10

    كل مستوى يعني عدد الأعمدة والصفوف .. مثلا مستوى 5 يعني 5 أعمدة و5 صفوف ..
    يتم ترتيب الأرقام في الحقول بشكل عشوائي أو يدوي ..

    وتبقى خانه فارغة .. ويجب تحريك الأرقام وترتيبها الترتيب الصحيح .. ( الرقم واحد يكون في الخانة اليسرى في الأعلى .. وأكبر رقم يكون في الخانة قبل الأخيرة من اليمين أسفل الجدول ) والخانة الأخيرة طبعا تكون فارغة ..

    ويمكن تحريك أي رقم موجود في نفس الصف أو العمود الذي فيه الخانة الفارغة ..

    أنا أمتاز بالشرح السيء :33: .. لكن أرجو أني أستطعت شرح طريقة عمل اللعبة بشكل واضح ..


    كود:
    [FONT="Courier New"][LEFT] #!/bin/csh
    
    # # # # # # # # # # # # # # # # # # 
    #    The Arrange Numbers Game     #
    #  Scripted By Abdulaziz Al-Asiri #
    # # # # # # # # # # # # # # # # # # 
    
    
    #-------------------------------------#
    #           Welcome screen            # 
    #-------------------------------------#
    
    clear             # Clean the screen to start the game 
    
    #----- Shows ( = ) one by one -----#
    set cntr = 1         # Counter 
    echo -n "\t"
    while ( $cntr <= 37 ) 
        sleep 0.02
        echo -n "\e[0;31m=\e[m"
        @ cntr++
    end
    echo ""
    
    #----- Shows welcome message word by word -----#
    sleep 0.2
    echo -n "\t\e[0;34mWelcome \e[m" 
    sleep 0.2
    echo -n "\e[0;34mTo \e[m"
    sleep 0.2
    echo -n "\e[0;34mThe \e[m"
    sleep 0.2
    echo -n "\e[0;34mArrange \e[m"
    sleep 0.2
    echo -n "\e[0;34mNumbers \e[m"
    sleep 0.2
    echo    "\e[0;34mGame\e[m"
    
    #----- Shows ( = ) one by one -----#
    @ cntr = 1
    echo -n "\t"
    while ( $cntr <= 37 ) 
        sleep 0.02
        echo -n "\e[0;31m=\e[m"
        @ cntr++
    end
    echo ""
    
    #-------------------------------------#
    # Cheack if the level is in the range # 
    #-------------------------------------#
    
    check_level:
    echo -n "Chose a level (3-10) : " # Asks user to chose a level between 3 and 10 
    set level = $< 
    if ($level > 10 || $level < 3) then # if the level is out of range re-ask the user again
        echo "\e[0;31mSorry the level must be between (3-10)\e[m"
        goto check_level
    endif
    
    #----------------------------------#
    #      Set the blocks values       # 
    #----------------------------------#
    
    #----- Prepare to set the values 
    set plate             # Array Stores real values of blocks
    set i = 1             # Counter for loops 
    set buffer             # Array Stores temp values of plate
    @ j = $level * $level         # The number of blocks 
    @ range = $j - 1         # The number of blocks without blank (hole)
    set counter = 0         # Counts number of moves 
    
    echo -n "Set the nambers randomly [R] or by hand [H] ? : " # default value is RANDOMLY 
    set choice = $<
    
    #----- Set temp values of blocks -----#
    while ( $i < $j )
        set buffer = ( $buffer $i )
        @ i++
    end
    
    #----- Set the blocks values BY HAND -----#
    @ i = 1             # Re-set the counter 
    if ( $choice == h || $choice == H) then 
        while ( $i < $j )     # Asks user to enter blocks values one by one
            echo -n "Enter value of block $i [1 - $range] : "
            set value = $<
            if ( $value > 0 && $value < $j ) then # Checks if the entry value is out of rangr
                if ( $buffer[$value] ==  $value ) then # Checks if value is not used
                    set plate = ( $plate $value ) # Adds the number to the plate array
                    @ buffer[$value] = 0 # Sets value as used
                    @ i++
                else 
                    echo "\e[0;31mThis number already exists .. enter another number \e[m"
                endif
            else 
                echo "\e[0;31mThe number is out of range .. enter a number again \e[m"
            endif
            
        end
    
    #----- Set the blocks values RANDOMLY -----#
    else
        set rand = $$         # Give (rand) a random number (PID)
        while ( $i < $j ) 
            # Generates a random number 
            set Random = `awk ' BEGIN { srand( '$rand' ); print int( rand() * '$range' + 1 ) } ' `  
            @ rand++
            if ( ($buffer[$Random]) == 0 ) then # Checks if value is used then go back to generates
                continue 
            endif
            set plate = ( $plate $Random ) # Adds the number to the plate array
            set buffer[$Random] = 0 # Sets value as used
            @ i++
        end
    endif 
    
    set plate = ( $plate 0)     # Add [ 0 ] at last block as a blank block (hole)
    
    #----------------------------------#
    #         Shows the plate          # 
    #----------------------------------#
    
    set StartTime = `date +%s`     # To save beginning time
    set min = 0             # To counts mins 
    
    show_plate:
    clear
    @ i = 1             # Re-set the counter 
    echo ""             # New line (empty)
    
    while ( $i <= $j )        # Show the blocks and values
        if ( ( $i - 1 ) % $level == 0) then
            @ cntr = 1     # Re-set the counter 
            echo -n "\t"     # Prints tab at the beginning of horizontal lines
            while ( $cntr <= $level ) # Print the horizontal lines of plate
                echo -n "\e[0;31m+------\e[m" 
                @ cntr++ 
            end
            echo "\e[0;31m+\e[m"     # Close the end of horizontal lines
            echo -n "\t"     # Print tab at the beginning of rows
        endif
    
        if ($plate[$i] == 0) then
            echo -n "\e[0;31m|      \e[m" # If block's value is 0 shows blank block (hole)
        else if ( $plate[$i] < 10 ) then 
            echo -n "\e[0;31m|\e[m  \e[0;34m $plate[$i]  \e[m" # Print cell if the value just one digit
        else
            echo -n "\e[0;31m|\e[m \e[0;34m $plate[$i]  \e[m" # Print cell if the value two digit
        endif
    
        if ( $i % $level == 0) then # Close the table and print a new line if the
            echo "\e[0;31m|\e[m"         # elements in a row equal to the number of a level
        endif
        @ i++
    end 
    
    @ cntr = 1             # Re-set the counter 
    echo -n "\t"             # Prints tab at the beginning of last horizontal line
    while ( $cntr <= $level )
        echo -n "\e[0;31m+------\e[m"     # Print the last horizontal line of plate
        @ cntr++
    end
    echo "\e[0;31m+\n\e[m"             # Close the end of horizontal line and print new empty line
    
    #----------------------------------#
    # Check if the blocks are arranged # 
    #----------------------------------#
    
    @ i = 1             # Re-set the counter 
    set check_array = 1
    while ( ($plate[$i] == $i) && $i < $j) # Checks if every block in the right position 
        @ check_array++
        @ i++
    end
    
    if ($check_array == $j) then          # if check_array = j that means the plate is arranged so, finish
        set EndTime = `date +%s`     # To saves end time
        @ EndTime = $EndTime - $StartTime # find the real time   
        while ($EndTime > 59)
                @ EndTime = $EndTime - 60
                @ min++ 
        end 
    
        echo "\e[0;34mYou win !\e[m"
        echo "\e[0;34mYou Took (\e[1;31m $min min And $EndTime sec And $counter moves\e[0;34m) to arrange the blocks\e[m"
        goto OUT
    endif
    
    #----------------------------------#
    #         Get next movement        # 
    #----------------------------------#
    
    CHOSE:
    echo -n "Enter block number to move it , or [Q] to quit : "
    set num = $<
    set block = 0             # If the value do not change that means choice is out of range
    
    if ($num == q || $num == Q) then 
        goto OUT # Quit
    endif
    
    #----------------------------------#
    #    Get the position of block     # 
    #----------------------------------#
    
    set chk_num = 1         # Set the counter
    while ($chk_num <= $j)
        if ( $num == $plate[$chk_num]) then 
            @ block = $chk_num # Gets the real coordinate of the block
            break
        endif
            @ chk_num++
    end
    
    #----------------------------------#
    # Check if the movement is correct # 
    #----------------------------------#
    
    #----- First : check out the range -----#
    if ($block == 0) then
        goto wrong_movement
    endif
    
    #----- Second : check above the selected block -----#
    set temp_block = $block     # Set temp_block
    set blocks_move = 0         # Set the counter
    
    # The selected block has to be between the second row and last row
    while ($temp_block > $level) 
        @ temp_block = $temp_block - $level
        @ blocks_move++
        if ( $plate[$temp_block] == 0 ) then # If fined 0 means fined the hole
            goto MOVE_UP
        endif
    end
    
    #----- Third : check down the selected block -----# 
    set temp_block = $block     # Re-set temp_block 
    set blocks_move = 0         # Re-set the counter
    
    # The selected block has to be between the first row and before-last row
    while ( $temp_block <= ($j - $level) ) 
        @ temp_block = $temp_block + $level
        @ blocks_move++
        if ( $plate[$temp_block] == 0 ) then # If fined 0 means fined the hole
            goto MOVE_DOWN
        endif
    end
    
    #----- Fourth : check right the selected block -----#
    set temp_block = $block     # Re-set temp_block
    set blocks_move = 0         # Re-set the counter
    
    # The selected block has to be between the first column and before-last one
    while ( $temp_block % $level > 0) 
        @ temp_block++
        @ blocks_move++
        if ( $plate[$temp_block] == 0 ) then # If fined 0 means fined the hole
            goto MOVE_RIGHT
        endif
    end
    
    #----- Fivth : check Left the selected block -----#
    set temp_block = $block     # Re-set temp_block
    set blocks_move = 0         # Re-set the counter
    
    # The selected block has to be between the first column and before-last one
    while ( $temp_block % $level > 1 || $temp_block % $level == 0 )
        @ temp_block--
        @ blocks_move++
        if ( $plate[$temp_block] == 0 ) then # If fined 0 means fined the hole
            goto MOVE_LEFT
        endif
    end
    
    
    #----------------------------------#
    #             movements            # 
    #----------------------------------#
    
    #----- Wrong movement -----#
    wrong_movement:
    echo "\e[0;31mSorry .. the movement is wrong! please chose again\e[m"
    goto CHOSE
    
    #----- Moves UP -----#
    MOVE_UP:
    set X = $temp_block         # Temp variable 
    while ($blocks_move > 0)     # If there is still moves 
        @ X = $X + $level
        @ plate[$temp_block] = $plate[$X]
        @ temp_block = $temp_block + $level
        @ blocks_move--
    end
    
    @ counter++             # Increments the moves counter
    set plate[$X] = 0         # Sets the (hole) in the new position
    goto show_plate
    
    #----- Moves DOWN -----#
    MOVE_DOWN:
    set X = $temp_block         # Temp variable
    while ($blocks_move > 0)     # If there is still moves 
        @ X = $X - $level
        @ plate[$temp_block] = $plate[$X]
        @ temp_block = $temp_block - $level
        @ blocks_move--
    end
    
    @ counter++             # Increments the moves counter
    set plate[$X] = 0         # Sets the (hole) in the new position
    goto show_plate
    
    #----- Moves RIGHT -----#
    MOVE_RIGHT:
    set X = $temp_block        # Temp variable
    while ($blocks_move > 0)     # If there is still moves 
        @ X = $X - 1
        @ plate[$temp_block] = $plate[$X]
        @ temp_block = $temp_block - 1
        @ blocks_move--
    end
    
    @ counter++             # Increments the moves counter
    set plate[$X] = 0        # Sets the (hole) in the new position
    goto show_plate
    
    #----- Moves LEFT -----#
    MOVE_LEFT:
    set X = $temp_block         # Temp variable
    while ($blocks_move > 0)     # If there is still moves 
        @ X = $X + 1
        @ plate[$temp_block] = $plate[$X]
        @ temp_block = $temp_block + 1
        @ blocks_move--
    end
    
    @ counter++              # Increments the moves counter
    set plate[$X] = 0        # Sets the (hole) in the new position
    goto show_plate    
    
    #----------------------------------#
    #           F I N I S H            # 
    #----------------------------------#
    
    OUT:
    echo "\n\e[0;32m\t+-----------------+"
    echo "\t|      B Y E      |"
    echo "\t+-----------------+\n\e[m"
    
    exit 0                 # Exit without errors
    
    # EOF #                                                         [/LEFT][/FONT]
    
    أنتظر رأيكم ..

    دمتم في خير ..

    ملاحظة / تمت تجربة اللعبة على فيدورا وتعمل بشكل سليم ..
    وتمت تجربتها على ريدهات واوبينتو ولم تعمل .. لا أدري ما السبب !!

    لكن اذا كنت نستخدم اوبينتو جرب استبدال

    كود:
    [LEFT]echo[/LEFT]
    بـ

    كود:
    [LEFT] echo -e[/LEFT]
    وكذلك ..

    كود:
    [LEFT] echo -n[/LEFT]
    بـ

    كود:
    [LEFT] echo -en[/LEFT]

    ملاحظة هامة !!

    يجب حذف الفراغ في بداية السطر الأول .. لأنه يسبب خطأ ..



    كود:
     #!/bin/csh

    الفراغ بسبب النسخ للمنتدى ..

    وبالتوفيق للجيمع ..
     
    1 person likes this.
  2. Dr.X3

    Dr.X3 VIP DeveloPer

    إنضم إلينا في:
    ‏20 يونيو 2009
    المشاركات:
    755
    الإعجابات المتلقاة:
    96
    نقاط الجائزة:
    0
    Credits:
    0
    رد: [سكربت] لعبة ترتيب الأرقام .. من برمجتي

    شي جميل وآصل إبداعتك
     
  3. ฟ į ẕ ،’

    ฟ į ẕ ،’ VIP DeveloPer

    إنضم إلينا في:
    ‏28 أكتوبر 2009
    المشاركات:
    6,862
    الإعجابات المتلقاة:
    1,080
    نقاط الجائزة:
    113
    Credits:
    2
    رد: [سكربت] لعبة ترتيب الأرقام .. من برمجتي

    آلله يعطيكـ آلعافيه

    تحيآتي :12:
     
  4. Linux Leader

    Linux Leader Beginner Developer

    إنضم إلينا في:
    ‏12 ديسمبر 2009
    المشاركات:
    125
    الإعجابات المتلقاة:
    12
    نقاط الجائزة:
    0
    Credits:
    0
    رد: [سكربت] لعبة ترتيب الأرقام .. من برمجتي

    Dr.X3 .. اهلا بك ... الأجمل مرورك من هنا .. نورت الصفحة

    ~~~~~~~~~

    { سلتوح } .. الله يعافيك يالغالي .. أسعدني تواجدك ..

    ~~~~~~~~~

    ملاحظة هامة !!

    يجب حذف الفراغ في بداية السطر الأول .. لأنه يسبب خطأ ..

    كود:
     #!/bin/csh

    الفراغ بسبب النسخ للمنتدى ..

    وبالتوفيق للجيمع ..
     
    1 person likes this.
  5. Dr.X3

    Dr.X3 VIP DeveloPer

    إنضم إلينا في:
    ‏20 يونيو 2009
    المشاركات:
    755
    الإعجابات المتلقاة:
    96
    نقاط الجائزة:
    0
    Credits:
    0
    رد: [سكربت] لعبة ترتيب الأرقام .. من برمجتي

    تمت دمج الملاحظة في الموضوع .. :29:
     
  6. Linux Leader

    Linux Leader Beginner Developer

    إنضم إلينا في:
    ‏12 ديسمبر 2009
    المشاركات:
    125
    الإعجابات المتلقاة:
    12
    نقاط الجائزة:
    0
    Credits:
    0
    رد: [سكربت] لعبة ترتيب الأرقام .. من برمجتي

    بيض الله وجهك أخوي Dr.X3

    ويعطيك الف عافية ..,
     
  7. آلملكي

    آلملكي ExpErt DeveloPer

    إنضم إلينا في:
    ‏22 يوليو 2009
    المشاركات:
    3,118
    الإعجابات المتلقاة:
    214
    نقاط الجائزة:
    0
    Credits:
    0
    رد: [سكربت] لعبة ترتيب الأرقام .. من برمجتي

    ,,

    :32:

    مشكور ع آلطرح آلمميز يآلغلآ

    سلمت آنآملك آلطيبه

    وذآ مآهوب غريب عليك ولآ ع آحد من آلآخوآن بآلديف ,,

    تقبل مرورىى ووردتي


    :32:

    ,,
     
  8. Linux Leader

    Linux Leader Beginner Developer

    إنضم إلينا في:
    ‏12 ديسمبر 2009
    المشاركات:
    125
    الإعجابات المتلقاة:
    12
    نقاط الجائزة:
    0
    Credits:
    0
    رد: [سكربت] لعبة ترتيب الأرقام .. من برمجتي

    أهلا بك أخي الملكي ..

    مرورك أسعدني ..

    ~~~~~~~~~~~~~~~~~

    قام أحد الأخوه مشكورا بعمل بعض التعديلات على السكربت .. وتقريبا السكربت الآن يعمل على جميع التوزيعات ..

    لكن في هذه النسخة من السكربت تمت إزالة الألوان ..

    تجدون السكربت بعد التعديل في هذه الصفحة http://pastebin.com/f7f49c731

    ودمتم بخير ..
     
  9. bashar husainat

    bashar husainat Beginner Developer

    إنضم إلينا في:
    ‏9 يناير 2010
    المشاركات:
    77
    الإعجابات المتلقاة:
    1
    نقاط الجائزة:
    0
    Credits:
    0
    رد: [سكربت] لعبة ترتيب الأرقام .. من برمجتي

    مشكور يالغالي ولك من ي احلى تقييم
     
  10. bashar husainat

    bashar husainat Beginner Developer

    إنضم إلينا في:
    ‏9 يناير 2010
    المشاركات:
    77
    الإعجابات المتلقاة:
    1
    نقاط الجائزة:
    0
    Credits:
    0
    رد: [سكربت] لعبة ترتيب الأرقام .. من برمجتي

    :8::8::8::8::8::8::8::8:
     
  11. Hex HaCkeR

    Hex HaCkeR DeveloPer Plus

    إنضم إلينا في:
    ‏25 أكتوبر 2009
    المشاركات:
    576
    الإعجابات المتلقاة:
    38
    نقاط الجائزة:
    0
    Credits:
    0
    رد: [سكربت] لعبة ترتيب الأرقام .. من برمجتي

    يعطيك العافيه تم تقيمك قبل قرآءة الموضوع

    تقبل مروري أستاذي

    :9:
     
  12. كنزوو

    كنزوو Active DeveloPer

    إنضم إلينا في:
    ‏15 نوفمبر 2006
    المشاركات:
    763
    الإعجابات المتلقاة:
    64
    نقاط الجائزة:
    0
    Credits:
    0
    رد: [سكربت] لعبة ترتيب الأرقام .. من برمجتي

    مشكور حبيبي و لي رد بعد التجربة
     
  13. Linux Leader

    Linux Leader Beginner Developer

    إنضم إلينا في:
    ‏12 ديسمبر 2009
    المشاركات:
    125
    الإعجابات المتلقاة:
    12
    نقاط الجائزة:
    0
    Credits:
    0
    رد: [سكربت] لعبة ترتيب الأرقام .. من برمجتي

    العفو أخوي bashar husainat ..

    ويعطيك ألف عافية على مرورك وتقييمك ..

    ~~~~~~~~~~~~~~
    أهلا أهلا Hex HaCkeR .. حياك الله ..

    مشكور على تقييمك .. ونورت الموضوع ..

    ْ~~~~~~~~~~~~~~

    كنزو .. العفو يالغالي

    وإن شاء الله اللعبة تعجبك ..
     
  14. iFlendra

    iFlendra VIP DeveloPer

    إنضم إلينا في:
    ‏12 نوفمبر 2009
    المشاركات:
    3,320
    الإعجابات المتلقاة:
    3,997
    نقاط الجائزة:
    113
    الإقامة:
    Above The Earth
    Credits:
    0
    رد: [سكربت] لعبة ترتيب الأرقام .. من برمجتي

    مشكووور اخوي يعطيك العافية
     
  15. dz-hack

    dz-hack Active DeveloPer

    إنضم إلينا في:
    ‏23 أغسطس 2010
    المشاركات:
    875
    الإعجابات المتلقاة:
    22
    نقاط الجائزة:
    0
    Credits:
    0
    رد: [سكربت] لعبة ترتيب الأرقام .. من برمجتي

    ويعطيك العافية على مجهودك
     
  16. ذ¼إ—-أ،ز¢ذ¼ؤ€ؤگ

    ذ¼إ—-أ،ز¢ذ¼ؤ€ؤگ ExpErt DeveloPer

    إنضم إلينا في:
    ‏29 أغسطس 2010
    المشاركات:
    1,553
    الإعجابات المتلقاة:
    533
    نقاط الجائزة:
    113
    الجنس:
    ذكر
    الوظيفة:
    طالب
    الإقامة:
    القاهره
    Credits:
    1
    رد: [سكربت] لعبة ترتيب الأرقام .. من برمجتي

    :32::32::32:برنس يمعلم
     
  17. aptiva

    aptiva VIP DeveloPer

    إنضم إلينا في:
    ‏25 أكتوبر 2009
    المشاركات:
    1,660
    الإعجابات المتلقاة:
    158
    نقاط الجائزة:
    63
    Credits:
    2
    رد: [سكربت] لعبة ترتيب الأرقام .. من برمجتي

    مشكو ر على المجهود
     

مشاركة هذه الصفحة

جاري تحميل الصفحة...