الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

لعبة رياضيات بسيطة

بدأه najy_zl في 31 ديسمبر 2013 · 5 رد · 913 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم...

 

باعتباري مبتدئ في لغة ++C فهذه لعبة تخمين بسيطة، و يمكن لعبها حتى على ورقة:

 

1      2        4      8

3      3        5      9

5      6        6      10

7      7        7      11

9      10     12     12

11    11      13    13

13    14     14     14

15    15     15     15

 

* استعملت قائمة صغيرة (4 أعمدة) لتسهيل الشرح.

 

تطلب من الشخص أن يختار في سره عدداً بين 1 و أكبر عدد في القائمة (15 في هذا المثال) ثم تسأله إن كان العدد موجوداً في العمود الأول (يجيب بنعم أو لا) ثم في العمود الثاني ثم في العمود الثالث ثم في العمود الرابع (حسب ما لديك من أعمدة). ثم تخبره بالعدد الذي اختاره!

 

اللعبة مبنية على النظام الثنائي (أس العدد 2) كما هو واضح في قيم الصف الأول (2^0 = 1 و 2^1 = 2 و 2^2 = 4 و 2^3 = 8).

 

بناء جدول اللعبة يتم كالتالي:

 

العمود الأول يبدأ بـ 2^0 أي 1 فنكتب عدداً و نترك عدداً، أي نكتب 1 و نترك 2، ثم نكتب 3 و نترك 4، ثم نكتب 5 و نترك 6، ... إلخ.

العمود الثاني يبدأ بـ 2^1 أي 2 فنكتب عددين و نترك عددين، أي نكتب 2 و 3 و نترك 4 و 5، ثم نكتب 6 و 7 و نترك 8 و 9، ... إلخ.

العمود الثالث يبدأ بـ 2^2 أي 4 فنكتب 4 أعداد و نترك 4 أعداد، أي نكتب 4 و 5 و 6 و 7 و نترك 8 و 9 و 10 و 11، ثم نكتب 12 و 13 و 14 و 15.

العمود الرابع يبدأ بـ 2^3 أي 8 فنكتب 8 أعداد و نترك 8 أعداد، أي نكتب الأعداد من 8 إلى 15 (إذا كانت القائمة أكبر نترك الأعداد الثمانية التالية من 16 إلى 23 و نكتب الثمانية التي بعدها من 24 إلى 31) و هكذا على حسب حجم القائمة.

 

كيف نعرف العدد الذي اختاره الشخص؟

 

لا نقوم بعملية بحث! فقط نجمع الأعداد الموجودة في رؤوس الأعمدة (1 و 2 و 4 و 8) التي يجيب عنها بنعم.

مثلاً إذا قال أن العدد الذي اختاره موجود في العمود الثاني و الرابع فالعدد هو 10 (أي 2 (رأس العمود الثاني) + 8 (رأس العمود الرابع)).

 

البرنامج التالي يستعمل جدولاً بـ 5 أعمدة (1 إلى 31).

 

*** ملاحظة: البرنامج يستعمل الصفوف بدل الأعمدة لسهولة الطباعة.

#include <iostream>
#include <iomanip>      // for setw manipulator
#include <cmath>        // for pow() function

using namespace std;

int rowCount;
    
void printList()
{
    int rowIdx, valIdx, nextVal, maxBase, headNum;
    
    maxBase = int(pow(2.0, rowCount));

    cout << endl << "Choose a number between 1 and " << maxBase - 1 << " (in your mind):\n\n";

    for (rowIdx = 0; rowIdx < rowCount; rowIdx++) {
        headNum = int(pow(2.0, rowIdx));
        valIdx = headNum;
        while (valIdx < maxBase) {
            for (nextVal = 0; nextVal < headNum; nextVal++) {
                //cout << valIdx << "\t";
                cout << setw(4) << valIdx;
                valIdx++;
            }
            valIdx += headNum;
        }
        cout << endl << endl;
    }
}

int guess()
{
    char answer;
    int sum = 0, ridx;
    
    cout << "Now, answer next questions (Y for Yes, N for No):" << endl << endl;
    for (ridx = 0; ridx < rowCount; ridx++) {
        do {
            cout << "\tIs your number in row " << ridx + 1 << " ? ";
            cin >> answer;
        } while (! ((answer == 'y') || (answer == 'Y') || (answer == 'n') || (answer == 'N')));
        if ((answer == 'y') || (answer == 'Y'))
            sum += int(pow(2.0, ridx));
    };
    return sum;
}

int main()
{
    int result;
    rowCount = 5;
    printList();
    result = guess();
    
    if (result == 0)
        cout << endl << "Huh! You did not choose a number from the list." << endl;
    else
        cout << endl << "Your number is " << result << endl;
         
    return 0;
}

نرجو الاستفادة و السلام.

5

وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ

صدق الله العظيم

#2

جميلة جداً :)

يمكنك استخدام بدلاً من

maxBase = int(pow(2.0, rowCount));

ببساطة :

maxBase = 1 << rowCount ;

ونفس الأمر بالنسبة لـ

headNum = int(pow(2.0, rowIdx));

وأيضاً

sum += int(pow(2.0, ridx));

 

ويمكنك تحسين

(! ((answer == 'y') || (answer == 'Y') || (answer == 'n') || (answer == 'N')))

حسب قانون دومورغان

(answer != 'y' && answer != 'Y' && answer != 'n' && answer != 'N')

 

الفكرة جميلة جداً ,

ما رأيك بهذا الكود لتوليد جدول بأي حجم :)

#include<cstdio>
int main()
{
    size=7;
    for(int q=0;q<size;q++,putchar(10))
        for(int i=1;i<1<<size;i++)
            if(i&(1<<q))
                printf("%4d",i);
    return 0;
}

 

والله ولي التوفيق

2
#3

السلام عليكم...

 

و منكم نستفيد. نصائح قيمة، أشكرك عليها.

 

سلام.

وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ

صدق الله العظيم

#4

لعبة جميلة جداّ أخى .وممتعة

#5

أخى الكريم ,

أعتقد أن عندك خطاّ فى العمود الرابع المفروض يساوى 9 .

#6

أعتذر يا أخى طريقتك مظبوطة انا فهمت العكس

مواضيع مشابهة