السلام عليكم...
باعتباري مبتدئ في لغة ++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;
}نرجو الاستفادة و السلام.