-->
random

آخر المواضيع

random
recent
جاري التحميل ...
recent

تعلم لغة البرمجة للالعاب والبرامج C++ Gaming

 

تعلم لغة C++ الخاصة بانشاء العاب والبرامج 



لتعلم اللغة البرمجة كيفما كانت تحتاج الى برنماج كتابة الاكواد يطلق عليه اسم IDE من اهمهم هو visual studio فيه عدة اصدارات واحد يكون خفيف على الجهاز visual studio code والاخر يكون افضل ولكن ثقيل على الاجهزة visual studio community او برامج اخرى مثل Code:Blocks لكن هذا فيه مشاكل في بعض الاجهزة ولدينا برامج اخرى Atom و C++ Dev و NetBeans و CodeLite و CLion و Xcode وهناك واحد اخر تشتغل عليه اونلاين بدون تحميل فقط عبر الانترنت اسمه online Compiler وهناك موقعين لهذا البرنماج الاونلاين واحد منهم من هنا

نبدا لغتنا البرمجية بالامر التالي

() int main

int عبارة عن متغايير و Main يعتبر دالة اساسية وسنشرحهم لاحقا بالتفصيل

() int main

{

كل الكود الذي ستكتبه عن C++ ستكتبه هنا بين هذه الاقواس له بداية ونهاية

اذا كي نقوم بطباعة كلام او اظهار كلام نكتب الكود التالي

;cout << "hello world"

}

كل كود لابد من ان ينتهي ب علامة سيمي كولون ;

scope هو النطاق ما بين القوسين لاساسيين

في لغة c++ لدينا مكتبة لبد من استدعائها اولا وفي السطر الاول للكود نكتب

<include <iostream#

include تضمين

iostream اسم المكتبة

ولبد من استعمال كلمة std:: للتعريف بالامر وهي اختصار لكود ;using namespace std

وايضا اي كلام ستكتبه لبد ان يكون بين المزدوجتين " هنا" ليتم التعرف عليه

يكتب الكود بالشكل التالي

<include <iostream#

() int main

;3std::cout << "hello world"



return 0;

{

اما لكتابة سطر جديد نقوم بكتابة كود انهاء السطر

;cout << "endl تكتب هذا الكود في مكان نقطة او تكتب فقط << "endl

واذا ارادت القيام بسطور فارغة فقط تقوم بتكرار نفس الكود لمنح مساحة بين الاسطر

وهناك طريقة ثانية احسن منها وهي وضع كود \n بعد الكلام مباشرة كي يكتبه لك في سطر لوحده مثال std::cout << "hello worold\n "
واذا كنت تريد اضافة سطر اخر فارغ تكرر نفس الكود مرتين 
\n \n

يمكنك اضافة مساحة بين الكلمات بشكل عادي او بواسطة Tab او باستعمال t\

لاضافة كلام على شكل عناوين لا يقرائها البرنماج للاغراض تنظيمية تكتبها على شكل   هنا نهاية الجزء الاول // او /**/

بعد انهاء الكود وقبل القوس الاخير لبد من كتابة الكود التالي return 0;

المتغيرات مثال                      int x (1 2 3 6 15 12 ...)

int داتا تايب يعني قاغدة بيانات مسؤول عن تخزين ارقام صحيحة والاعداد الصحيحة معناه اعداد بدون فاصلة وهو ترجمته "نوع المخزن"

X يعتبر اسم المخزن الذي ستخزن فيه هذه الارقام  مثلا : ;int x = 15

لذلك لاحقا في كتابة الكود كلما كتبت X سوف يقرائه على شكل 15 لاننا اعطينا له القيمة 15. لكن اذا وضعت "x" بين المزدوجتين فبهذه الطريقة سيقرائه كحرف ْx 

يمكن كذلك تغيير حرف x وتضع فيه اي اسم يعجبك او اي حرف اخر المهم ان تعطي اسم للمخزن 

String مخزن من نوع اخر يقبل تخزين النصوص فقط مثلا     

;"string name="yassine ولبد ان يكون النص بين مزدوجتين وينتهي بالفاصلة كي تتم قرائته يمكننا كتابة مثلا 

cout << "my isme"<<name<<endl;

سيتم قرائته بالشكل

my isme yassine

نفس الشئ تستطيع تغيير اسم name الى اي اسم تريد كما تستطيع اضافة عدد لا نهائي من المخازن سواء كانو int او string او غيرهم 

ايقونة build في بعض البرامج تقوم بكشف الاخطاء اذا كانت موجودة 

data types انواع البيانات

في لغة C++، تتعدد أنواع البيانات (Data Types) التي يمكن استخدامها لتعريف المتغيرات والتعامل مع البيانات. إليك شرحًا للأنواع الرئيسية في C++:


أنواع بيانات أساسية (Primitive Data Types):


أنواع بيانات صحيحة (Integer Types): تُستخدم لتخزين الأعداد الصحيحة.

int: لتخزين الأعداد الصحيحة بالحجم القياسي.

short, long, long long: أنواع بيانات صحيحة بأحجام مختلفة.

unsigned: للأعداد الصحيحة غير السالبة.

أنواع بيانات عائمة (Floating-Point Types): تُستخدم لتخزين الأعداد العائمة.

float, double, long double: أنواع بيانات عائمة بدقة مختلفة.

أنواع بيانات حرف (Character Types): تُستخدم لتخزين الأحرف والقيم الأساسية.

char: لتخزين الأحرف والقيم الأساسية.

wchar_t: لدعم مجموعة أوسع من الأحرف.

أنواع بيانات بوليانية (Boolean Type): تخزن قيمة صحيحة تمثل القيمة المنطقية "صحيح" أو "خطأ".

bool: لتخزين القيم المنطقية true أو false.

أنواع بيانات مشتقة (Derived Data Types):


مؤشرات (Pointers): تُستخدم لتخزين عنوان الذاكرة لمتغير.

int*, double*, char*: مثال على مؤشرات تشير إلى متغيرات من الأنواع المختلفة.

مصفوفات (Arrays): تخزن مجموعة من القيم من نفس النوع.

int arr[10]: مثال على مصفوفة تحتوي على 10 عناصر من النوع int.

متغيرات المرجع (References): تُستخدم لإنشاء اسم آخر لمتغير موجود.

int &ref = x;: حيث ref تشير إلى نفس المكان الذي يشير إليه x.

النوع الفرعي (Enumerations): تستخدم لإنشاء مجموعات من الثوابت.

enum Color { RED, GREEN, BLUE };: مثال على تعريف تعداد للألوان.

أنواع بيانات مركبة (Compound Data Types):


هياكل البيانات (Structures): تُستخدم لتجميع مجموعة من البيانات بأسماء مختلفة تحت نوع واحد.

struct Person { string name; int age; };

أنواع بيانات معقدة (Classes): تشابه هياكل البيانات ولكنها تدعم الوظائف (الدوال) وتكون قابلة للتعامل ككائنات (Objects).

class MyClass { public: void myFunction() {} };

باختصار، في C++ يمكنك استخدام مجموعة متنوعة من أنواع البيانات لتخزين وتعامل مع البيانات بطرق مختلفة تبعاً لاحتياجاتك في البرنامج.


تخزين البيانات في لغة C++ يتم وفقاً لنوع البيانات المحدد. هنا بعض الأمثلة التوضيحية على كيفية تعريف متغيرات وتخزين القيم فيها باستخدام أنواع البيانات المختلفة:

أمثلة على الأنواع الأساسية:

أنواع بيانات صحيحة (Integer Types):

int number = 10;

long bigNumber = 1234567890;

unsigned int positiveNumber = 100;

أنواع بيانات عائمة (Floating-Point Types):

float pi = 3.14;
double bigPi = 3.141592653589793;

أنواع بيانات حرف (Character Types):

char letter = 'A';

wchar_t wideChar = L'ح';  // يستخدم للأحرف غير ASCII

أنواع بيانات بوليانية (Boolean Type):

bool isValid = true;

bool isFinished = false;

أمثلة على الأنواع المشتقة:

مؤشرات (Pointers):

int x = 5;

int* ptr = &x;  // ptr يحتوي على عنوان x

مصفوفات (Arrays):

int numbers[5] = {1, 2, 3, 4, 5};  // مصفوفة تحتوي على 5 أعداد صحيحة

متغيرات المرجع (References):

int a = 10;
int& ref = a;  // ref هو اسم آخر لمتغير a

أمثلة على الأنواع المركبة:

هياكل البيانات (Structures):

struct Person {

    string name;

    int age;

};


Person person1;

person1.name = "Ahmed";

person1.age = 25;

أنواع البيانات المعقدة (Classes):

class Car {

public:

    string brand;

    string model;

    int year;


    void displayInfo() {

        cout << "Brand: " << brand << ", Model: " << model << ", Year: " << year << endl;

    }

};


Car myCar;

myCar.brand = "Toyota";

myCar.model = "Camry";

myCar.year = 2020;

myCar.displayInfo();

هذه الأمثلة توضح كيفية استخدام وتخزين البيانات في C++ باستخدام مجموعة متنوعة من الأنواع البيانية، مما يسمح بالتعامل مع مختلف أنواع البيانات وتطبيقاتها في البرنماج

الهدف من عملية التخزين في لغة C++، وفي أي لغة برمجة أخرى، هو تمثيل وتخزين البيانات بشكل منظم وفعال داخل الذاكرة الحاسوبية. هذا يتيح للمبرمجين التعامل مع البيانات بطريقة مناسبة وفعالة لإنجاز أهداف البرنامج بنجاح. إليك بعض الأهداف الرئيسية للتخزين في البرمجة:


تمثيل البيانات: يسمح التخزين بتمثيل مختلف أنواع البيانات مثل الأعداد الصحيحة، الأعداد العائمة، الأحرف، البيانات البوليانية، وما إلى ذلك. على سبيل المثال، يمكن تخزين عمر شخص كعدد صحيح، أو اسم شخص كسلسلة من الأحرف.


التعامل والمعالجة: بفضل التخزين، يمكن للمبرمجين إجراء العمليات الضرورية على البيانات مثل الحسابات الرياضية، المقارنات، والعمليات الأخرى التي تتطلب استخدام البيانات بطرق مختلفة.


التخزين المؤقت: يسمح التخزين بالحفاظ على قيم البيانات في الذاكرة الحاسوبية أثناء تنفيذ البرنامج، مما يسهل الوصول إليها واستخدامها في أي وقت.


التبادل والتواصل: يمكن تخزين البيانات للتبادل بين أجزاء مختلفة من البرنامج أو حتى بين برامج مختلفة، مما يسهل التواصل والتكامل بين مكونات النظام البرمجي.


تحقيق الأهداف البرمجية: بفضل التخزين، يمكن للمبرمجين تنفيذ أهداف برنامجهم مثل تخزين معلومات المستخدم، معالجة البيانات الواردة، إنشاء وإدارة هياكل البيانات المعقدة، والعديد من الوظائف الأخرى التي تتطلب التعامل مع البيانات.


بشكل عام، التخزين في البرمجة له الغرض من تمثيل البيانات بشكل منظم وفعال، مما يمكن المبرمجين من بناء تطبيقات قوية ومعقدة تعتمد على تعامل فعال وصحيح مع البيانات التي تمثل العمليات والمعلومات المختلفة في البرنامج.


استخدام أنواع مختلفة من التخزين في البرمجة، بدلاً من استخدام مخزن بيانات واحد فقط، يأتي بعدة أسباب تتعلق بفعالية البرمجة وإدارة الذاكرة وتحقيق أهداف معينة. إليك بعض الأسباب الرئيسية:


تمثيل البيانات بشكل دقيق: كل نوع بيانات يمثل نوعاً معيناً من المعلومات بشكل دقيق ومناسب. على سبيل المثال، الأعداد الصحيحة تستخدم لتمثيل القيم الصحيحة بدقة، في حين أن الأعداد العائمة تستخدم للقيم التي قد تحتاج إلى كسور أو دقة عائمة.


متطلبات الذاكرة والأداء: كل نوع بيانات يأخذ حجماً مختلفاً من الذاكرة، وبالتالي يمكن تحسين استخدام الذاكرة وأداء البرنامج من خلال استخدام أنواع مناسبة لكل نوع من البيانات.


التحقق من الصحة والأمان: باستخدام أنواع مختلفة، يمكن للمبرمجين تحديد حدود ونطاقات القيم الممكنة لكل نوع، مما يساعد في تحقيق الصحة والأمان في البرمجة. على سبيل المثال، لا يمكن تخزين قيمة عائمة في متغير يحتوي على قيمة صحيحة دون تحويل مناسب.


سهولة الفهم والصيانة: باستخدام أنواع مختلفة، يمكن للمبرمجين والمطورين فهم وصيانة البرنامج بشكل أفضل، حيث يساعد تصميم واضح للأنواع في توضيح نوع البيانات المتوقع لكل متغير.


تنظيم البيانات: استخدام أنواع مختلفة يمكن أن يساعد في تنظيم البيانات وتجميعها بطرق مناسبة، مما يسهل إدارتها واستخدامها في مختلف أجزاء البرنامج.


بالتالي، استخدام أنواع مختلفة من التخزين في البرمجة يساعد في تحسين فعالية البرنامج وإدارته، ويسمح بتحقيق الأهداف المختلفة بطرق أكثر فعالية ودقة.


لماذا لا يكون تخزين البيانات تلقائي في لغة C++ لماذا يجب تقوم بذلك يدويا

في لغة C++، يمكن التحكم في كيفية تخزين البيانات باستخدام مجموعة متنوعة من الأنواع والمتغيرات. والسبب الرئيسي وراء ذلك يتمثل في الحاجة إلى مرونة وتحكم دقيق في كيفية يتم إدارة الذاكرة والبيانات في البرنامج. إليك بعض الأسباب التي تجيب على سؤالك:


الكفاءة الضرورية: في لغة C++، يُعطى المبرمج تحكمًا كبيرًا في كيفية تخزين البيانات وإدارتها، وذلك لأسباب كفاءة الأداء. يمكن أن يكون التحكم اليدوي في تخصيص الذاكرة أكثر فعالية في بعض الحالات من حيث استخدام الموارد والأداء العام للبرنامج.


مرونة التصميم: يمكن للمبرمج استخدام أنواع متعددة من المتغيرات (مثل المتغيرات المحلية، المتغيرات الثابتة، المتغيرات الديناميكية، إلخ) وتخزينها في أماكن مختلفة في الذاكرة حسب احتياجات التطبيق الخاص به.


السيطرة على الحياة النطاقية (Lifetime Control): في C++، يتعين على المبرمجين تحديد دورة حياة المتغيرات، مثل عندما تكون المتغيرات محلية داخل دالة (وتنتهي حياتها عند نهاية الدالة) أو عندما تكون ديناميكية (وتتم إدارة دورة حياتها يدويًا عبر الإشارات أو المؤشرات).


تجنب الأخطاء البرمجية: التحكم اليدوي يساعد في تجنب بعض الأخطاء الشائعة مثل تسريب الذاكرة (Memory Leaks) أو الوصول إلى ذاكرة غير صالحة، حيث يمكن للمبرمجين تحديد بدقة متى يتم إطلاق الذاكرة المخصصة.


متطلبات التحكم في الذاكرة: في بعض الحالات، قد تكون هناك متطلبات خاصة لإدارة الذاكرة، مثل الحاجة إلى استخدام الذاكرة القريبة بشكل فعال لتحقيق أداء عالٍ في تطبيقات الوقت الحقيقي أو الأنظمة الضخمة.


بشكل عام، توفر C++ هذا التحكم اليدوي للمبرمجين لأنه يسمح بتعديلات دقيقة ومرونة في إدارة الذاكرة وتخزين البيانات، مما يجعلها لغة قوية ومتعددة الاستخدامات في مختلف المجالات البرمجية.

int متغايير خاص بالاعداد الصحيحة اي كل الاعداد الموجبة والسالبة التي ليس فيها فواصل


الأعداد الصحيحة في الرياضيات والبرمجة تشير إلى مجموعة الأعداد التي لا تحتوي على كسور أو أجزاء عشرية، وتتألف فقط من الأعداد الكاملة والصحيحة، مثل: 0، 1، -1، 2، -2، 3، -3، وهكذا.


لماذا يُطلق عليها هذا الاسم؟


يأتي الاسم "الأعداد الصحيحة" من الفرنسية "entier" والتي تعني "كامل" أو "صحيح"، ويعكس هذا الاسم أن هذه الأعداد هي الأعداد الكاملة والكاملة فقط، دون أي جزء عشري أو كسر.


المميزات الرئيسية للأعداد الصحيحة:


الكمال العددي: تعتبر الأعداد الصحيحة مجموعة من الأعداد التي تُمثل كل الأعداد التي لا تحتاج إلى تقسيم إلى جزء عشري أو كسر.


التمثيل الدقيق: في البرمجة والحسابات الرياضية، يتطلب الكثير من الحالات التمثيل الدقيق للأعداد، والأعداد الصحيحة تمثل هذا التمثيل بشكل كامل.


الاستخدام العام: تُستخدم الأعداد الصحيحة في البرمجة لتمثيل عدد العناصر في مصفوفات، عدد التكرارات في حلقات البرمجة، والعديد من السياقات الأخرى حيث لا يكون هناك حاجة للأرقام العشرية أو الكسور.


بشكل عام، الأعداد الصحيحة هي جزء أساسي ومهم في الرياضيات والبرمجة، وتوفر تمثيلاً دقيقاً للعدد دون الحاجة إلى كسور أو أجزاء عشرية، مما يسهل العمليات الحسابية والبرمجية عليها.


في لغة C++، نستخدم النوع int (اختصار لـ integer) لتخزين الأعداد الصحيحة، سواء كانت موجبة أو سالبة أو صفر. يعتبر int من الأنواع الأساسية في C++ ويستخدم بشكل شائع في مختلف التطبيقات، بما في ذلك تصميم الألعاب. هنا بعض الحالات التي نستخدم فيها int في تصميم الألعاب:


تحديد الإحداثيات والمواقع:


لتحديد موقع اللاعب أو الأعداء أو العناصر في اللعبة. على سبيل المثال، إحداثيات x و y لشخصية ما في اللعبة.

int playerX = 100;

int playerY = 200;

عدادات النقاط والأرواح:


لحساب النقاط التي يجمعها اللاعب أو عدد الأرواح المتبقية له.

int playerScore = 0;
int playerLives = 3;

تتبع الوقت والعد التنازلي:

لتتبع الوقت المنقضي أو العد التنازلي لحدث معين في اللعبة.

int timeLeft = 60; // العد التنازلي لـ 60 ثانية

تكرار الحلقات (loops):
لاستخدام int كعداد للحلقات لتنفيذ تعليمات معينة عدة مرات.

for (int i = 0; i < 10; i++) {
    // تنفيذ تعليمات معينة 10 مرات
}

تخزين الخيارات والإعدادات:
لتخزين إعدادات مثل مستوى الصعوبة أو رقم المستوى الحالي.
int difficultyLevel = 2;
int currentLevel = 5;

استخدام int يوفر مرونة وسهولة في التعامل مع الأعداد الصحيحة في الألعاب، مما يجعلها جزءًا أساسيًا من تطوير الألعاب باستخدام C++.

ونستعمل float للاعداد العشرية التي فيها الفاصلة
في لغة C++، نستخدم النوع float (اختصار لـ floating point) لتخزين الأعداد العشرية أو الأعداد ذات الفواصل العشرية، ويعد هذا النوع مناسباً جداً في الحالات التي تتطلب دقة أكثر من الأعداد الصحيحة، خاصة في تصميم الألعاب.
الأعداد العشرية هي الأعداد التي تحتوي على جزء كسري (جزء بعد الفاصلة العشرية)، مثل 3.14 و -2.718 و 0.001. تُستخدم الأعداد العشرية للتعبير عن القيم التي لا يمكن تمثيلها كأعداد صحيحة بدقة، وهي مهمة جداً في العديد من التطبيقات العلمية والهندسية والحسابية.

مميزات الأعداد العشرية:
التمثيل الدقيق للقيم غير الصحيحة:

تتيح الأعداد العشرية تمثيل القيم التي تقع بين الأعداد الصحيحة، مثل 3.5 أو 7.25، مما يسمح بحسابات أكثر دقة في العديد من التطبيقات.
القدرة على التعبير عن القيم الصغيرة جداً والكبيرة جداً:

يمكن استخدام الأعداد العشرية لتمثيل القيم الصغيرة جداً (مثل 0.0001) أو الكبيرة جداً (مثل 1.5e6)، وهذا مفيد في التطبيقات العلمية التي تتطلب نطاقًا واسعًا من القيم.
المرونة في الحسابات:

تتيح الأعداد العشرية إجراء العمليات الحسابية بدقة أكبر، خاصة في العمليات التي تتطلب الدقة، مثل الحسابات الفيزيائية والهندسية.
الدعم في لغات البرمجة:

معظم لغات البرمجة تدعم الأعداد العشرية بشكل مباشر من خلال الأنواع المختلفة مثل float و double و long double، مما يتيح للمطورين إجراء الحسابات بسهولة.
بعض استخدامات الأعداد العشرية:
التطبيقات العلمية والهندسية:

تُستخدم الأعداد العشرية بشكل مكثف في التطبيقات العلمية والهندسية لحساب القيم الدقيقة المطلوبة في التجارب والنماذج والمحاكاة.
الرسوميات والحركة:

في تصميم الرسوميات والألعاب، تُستخدم الأعداد العشرية لتحديد المواقع والحركات بشكل سلس ودقيق، مما يتيح تحركات وانسيابية أفضل للكائنات.
المعاملات المالية:

تُستخدم الأعداد العشرية في الحسابات المالية لتحديد القيم الدقيقة للمعاملات، مثل الأسعار والأرباح والفوائد، لضمان دقة العمليات المالية.
التحكم في العمليات الصناعية:

في التحكم في العمليات الصناعية، تُستخدم الأعداد العشرية لضبط القيم الدقيقة للمتحكمات والأجهزة لضمان عملها بكفاءة ودقة.
مثال برمجي في C++:
#include <iostream>

int main() {
    float value1 = 3.14f;
    double value2 = 2.718;
    long double value3 = 0.00000012345L;

    std::cout << "Value 1: " << value1 << std::endl;
    std::cout << "Value 2: " << value2 << std::endl;
    std::cout << "Value 3: " << value3 << std::endl;

    return 0;
}

في هذا المثال، نستخدم الأنواع العشرية float و double و long double لتمثيل القيم العشرية وطباعتها.

 فيما يلي بعض الحالات التي نستخدم فيها float في تصميم الألعاب:

تحديد المواقع الدقيقة:

لتحديد مواقع الكائنات أو الشخصيات في اللعبة بشكل دقيق، خاصة عندما تكون هناك حاجة لتحريك الكائنات بسلاسة.
float playerX = 100.5f;
float playerY = 200.75f;

الحسابات الفيزيائية:
لحساب الحركات الفيزيائية مثل السرعة، التسارع، والجاذبية. الدقة هنا مهمة لتحقيق تأثيرات واقعية.
float velocity = 9.8f;
float acceleration = 2.5f;

تأثيرات الرسوم المتحركة:
لاستخدام float في تحديد خصائص الرسوم المتحركة مثل التدوير، التمدد، والتقليص بدرجة عالية من الدقة.
float rotationAngle = 45.0f;
float scaleFactor = 1.5f;

الإضاءة والتظليل:
لتحديد مستويات الإضاءة والظلال حيث تحتاج إلى دقة عالية للتحكم في شدة وتأثير الإضاءة.
float lightIntensity = 0.8f;
float shadowOpacity = 0.5f;

الوقت والتوقيت:
لحساب الوقت المنقضي بدقة عالية، مما يساهم في تحسين التوقيت الخاص بأحداث اللعبة والتأثيرات الزمنية.
float deltaTime = 0.016f; // الوقت بين كل إطار وآخر (حوالي 60 إطار في الثانية)

الأصوات:
لضبط حجم الصوت وتأثيرات الصوت بشكل دقيق.
float volume = 0.75f;
float pitch = 1.2f;

استخدام float في تصميم الألعاب يوفر دقة ومرونة أكثر عند التعامل مع الأعداد ذات الفواصل العشرية، مما يتيح تجربة ألعاب أكثر واقعية وسلاسة.

في لغة C++، نستخدم النوع double لتخزين الأعداد العشرية، وهو يتميز بدقة أعلى مقارنة بالنوع float. الفرق الرئيسي بين double و float يكمن في الدقة (عدد الأرقام العشرية التي يمكن تمثيلها) وحجم التخزين (عدد البايتات المستخدمة).

الفروقات بين float و double:
الدقة:

float: يمثل الأعداد العشرية بدقة تصل إلى 7 أرقام عشرية تقريباً.
double: يمثل الأعداد العشرية بدقة تصل إلى 15-16 رقم عشري تقريباً.
حجم التخزين:

float: يستخدم 4 بايت (32 بت) من الذاكرة.
double: يستخدم 8 بايت (64 بت) من الذاكرة.
الأداء:

float: قد يكون أسرع في العمليات الحسابية على بعض الأنظمة بسبب استخدامه لمساحة أقل من الذاكرة.
double: قد يكون أبطأ قليلاً بسبب حجمه الأكبر، لكنه يوفر دقة أعلى.
متى نستخدم double بدلاً من float:
عند الحاجة إلى دقة عالية:

إذا كنت بحاجة إلى دقة عالية في الحسابات، مثل التطبيقات العلمية والهندسية، حيث تكون الأخطاء الصغيرة غير مقبولة.
عند التعامل مع أعداد كبيرة أو صغيرة جداً:

double يوفر نطاق أوسع للأرقام، مما يجعله مناسباً للتعامل مع الأعداد الكبيرة جداً أو الصغيرة جداً بدقة.
عند تخزين القيم النقدية:

يفضل استخدام double عند التعامل مع القيم النقدية لضمان دقة الحسابات المالية.
مثال توضيحي:
#include <iostream>

int main() {
    float floatVal = 3.1415926535f;
    double doubleVal = 3.14159265358979323846;

    std::cout << "Float value: " << floatVal << std::endl;
    std::cout << "Double value: " << doubleVal << std::endl;

    return 0;
}
في هذا المثال، نلاحظ الفرق في الدقة بين float و double عند تخزين نفس القيمة العشرية.
استخدامات مشتركة:

float:
يستخدم في تطبيقات الألعاب حيث تكون الدقة العالية غير ضرورية ويمكن التضحية بها مقابل الأداء.
يستخدم في الرسوميات حيث تكون الدقة الأقل كافية لتحريك الكائنات وتطبيق التأثيرات.

double:
يستخدم في الحسابات العلمية والهندسية حيث تكون الدقة العالية ضرورية.
يستخدم في التطبيقات المالية والمصرفية لضمان دقة الحسابات النقدية.
يستخدم في محاكاة الفيزياء والأبحاث العلمية التي تتطلب دقة عالية.

المغايير من نوع char نستعمله عند  تخزين رموز ويمكن ان تكون هذه الرموز ارقام 
في لغة C++، نستخدم النوع char لتخزين القيم التي تمثل حرفاً واحداً. يمكن أن يكون هذا الحرف حرفاً أبجدياً (مثل 'A' أو 'a')، رقماً (مثل '1')، أو رمزاً خاصاً (مثل '!' أو '#'). العلاقة بين النوع char ونظام ASCII (الرمز القياسي الأمريكي لتبادل المعلومات) تأتي من حقيقة أن كل حرف أو رمز في char يتم تمثيله كقيمة عددية وفقاً لمعيار ASCII.



العلاقة بـ ASCII:
ASCII هو معيار لترميز الحروف والأرقام والرموز الخاصة كقيم عددية. يحتوي على 128 رمزاً، حيث تتراوح القيم من 0 إلى 127. على سبيل المثال:

'A' يتم تمثيله بالعدد 65.
'a' يتم تمثيله بالعدد 97.
'0' يتم تمثيله بالعدد 48.

يمكننا استخدام char في عمليات النصوص والإدخال والإخراج والحسابات التي تعتمد على قيم ASCII.

على الرغم من أن char يعتمد على قيم عددية تمثل حروفاً وأرقاماً ورموزاً خاصة، فإنه يمكن استخدامه بطرق مجردة للتعامل مع النصوص والإدخال والإخراج والتحقق من نوع الحروف دون الحاجة إلى معرفة مباشرة بقيم ASCII. تقوم مكتبات مثل cctype بتبسيط هذه العمليات من خلال توفير دوال جاهزة للتعامل مع الحروف بشكل مجرد.
نعم، يمكن استخدام المتغير char في C++ دون الاعتماد مباشرة على نظام ASCII، لكن من المهم أن نفهم أن char نفسه يرتبط بطبيعته بالقيم العددية التي تحددها معايير ترميز الحروف مثل ASCII أو Unicode. مع ذلك، يمكن استخدام char بطرق لا تتطلب معرفة مباشرة بتلك القيم. إليك بعض الأمثلة على كيفية استخدام char دون الاعتماد على قيم ASCII بشكل مباشر:

1. تمثيل الحروف في النصوص والسلاسل
عند استخدام char لتمثيل الحروف في النصوص والسلاسل، يمكنك التعامل مع الحروف بشكل تجريدي كرموز دون الحاجة إلى التفكير في قيم ASCII الخاصة بها.

#include <iostream>

int main() {
    char greeting[] = "Hello, World!";
    std::cout << greeting << std::endl; // طباعة السلسلة النصية

    return 0;
}

2. إدخال وإخراج الحروف
يمكنك استخدام char للتعامل مع إدخال وإخراج الحروف دون الحاجة إلى معرفة قيم ASCII الخاصة بها.
#include <iostream>

int main() {
    char inputChar;
    std::cout << "Enter a character: ";
    std::cin >> inputChar;
    std::cout << "You entered: " << inputChar << std::endl;

    return 0;
}

3. العمليات البسيطة على الحروف
يمكنك إجراء عمليات بسيطة على الحروف مثل التحويل بين الأحرف الكبيرة والصغيرة باستخدام دوال مكتبة cctype دون الحاجة إلى معرفة القيم العددية.
#include <iostream>
#include <cctype>

int main() {
    char lower = 'a';
    char upper = std::toupper(lower);
    std::cout << "Uppercase: " << upper << std::endl; // سيطبع 'A'

    return 0;
}

4. المقارنات والتحقق من نوع الحرف
يمكنك مقارنة الحروف والتحقق من نوعها (حرف كبير، حرف صغير، رقم، إلخ) باستخدام دوال مكتبة cctype دون الحاجة إلى معرفة قيم ASCII.
#include <iostream>
#include <cctype>

int main() {
    char ch = '5';
    if (std::isdigit(ch)) {
        std::cout << ch << " is a digit." << std::endl;
    } else {
        std::cout << ch << " is not a digit." << std::endl;
    }

    return 0;
}

نظام ASCII (الرمز القياسي الأمريكي لتبادل المعلومات) يستخدم لترميز الحروف والأرقام والرموز الخاصة كقيم عددية. يتم استخدام ASCII في العديد من التطبيقات والمجالات، وله أهمية كبيرة في الحوسبة والبرمجة. دعنا نناقش متى ولماذا نستخدم ASCII.

متى نستخدم ASCII:
معالجة النصوص:

عند معالجة النصوص والأحرف في البرمجة، يمكن استخدام قيم ASCII لتحديد نوع الحرف (مثل الأحرف الكبيرة، الأحرف الصغيرة، الأرقام).
التحويلات بين الأحرف:

يمكن استخدام قيم ASCII لتحويل الأحرف بين الأحرف الكبيرة والصغيرة أو لإجراء عمليات حسابية على الأحرف.
التوافقية:

عند نقل البيانات بين الأنظمة المختلفة، يوفر ASCII طريقة متوافقة لتمثيل النصوص.
الأجهزة والاتصالات:

في الأجهزة القديمة أو الأنظمة المضمنة (embedded systems)، يمكن استخدام ASCII لترميز الأوامر النصية.
التحقق من البيانات:

يمكن استخدام ASCII للتحقق من صحة البيانات النصية المدخلة (مثل التأكد من أن مدخلات المستخدم تحتوي على أحرف وأرقام فقط).
لماذا نستخدم ASCII:
بسيط وخفيف الوزن:

ASCII بسيط وخفيف الوزن، حيث يستخدم 7 بت فقط لتمثيل كل حرف، مما يجعله مناسباً للأجهزة ذات الموارد المحدودة.
معيار معترف به عالمياً:

ASCII هو معيار دولي معروف ومعترف به، مما يضمن توافقية واسعة بين الأنظمة المختلفة.
سهولة الاستخدام في البرمجة:

ASCII يوفر مجموعة من القيم العددية المعروفة التي يمكن استخدامها بسهولة في البرمجة للتحكم في النصوص والأحرف.
الأداء:

استخدام قيم ASCII في العمليات الحسابية على الأحرف يكون سريعاً وفعالاً، خاصة في البيئات منخفضة المستوى.
نستخدم ASCII في العديد من التطبيقات البرمجية لمعالجة النصوص والأحرف، للتحويل بين الأحرف الكبيرة والصغيرة، ولضمان توافقية البيانات بين الأنظمة المختلفة. بفضل بساطته وأدائه العالي، يعد ASCII معياراً مهماً وفعالاً في الحوسبة والبرمجة.
استخدام قيم ASCII في تصميم الألعاب يمكن أن يكون مفيداً لعدة جوانب، بما في ذلك التعامل مع المدخلات من لوحة المفاتيح، عرض النصوص، وتحليل البيانات النصية. إليك بعض الأمثلة والتطبيقات العملية لكيفية استخدام ASCII في تصميم الألعاب:

1. التعامل مع المدخلات من لوحة المفاتيح
يمكن استخدام قيم ASCII للتحقق من المدخلات من لوحة المفاتيح وتنفيذ الأوامر المناسبة في اللعبة.
#include <iostream>
#include <conio.h> // مكتبة للتعامل مع المدخلات في الوقت الحقيقي

int main() {
    char input;
    std::cout << "Press any key to move your character (W/A/S/D to move, Q to quit):" << std::endl;
    
    while (true) {
        input = _getch(); // الحصول على المدخل من لوحة المفاتيح

        if (input == 'q' || input == 'Q') {
            std::cout << "Quitting the game..." << std::endl;
            break;
        } else if (input == 'w' || input == 'W') {
            std::cout << "Moving up!" << std::endl;
        } else if (input == 'a' || input == 'A') {
            std::cout << "Moving left!" << std::endl;
        } else if (input == 's' || input == 'S') {
            std::cout << "Moving down!" << std::endl;
        } else if (input == 'd' || input == 'D') {
            std::cout << "Moving right!" << std::endl;
        } else {
            std::cout << "Invalid input!" << std::endl;
        }
    }

    return 0;
}

2. عرض النصوص في اللعبة
يمكن استخدام قيم ASCII لعرض النصوص والرسائل داخل اللعبة. يمكنك أيضًا استخدام الرموز الخاصة لرسم حدود أو واجهة مستخدم بسيطة.
#include <iostream>

void drawBorder() {
    for (int i = 0; i < 40; i++) std::cout << "-";
    std::cout << std::endl;
}

void displayMenu() {
    drawBorder();
    std::cout << "      Game Menu" << std::endl;
    drawBorder();
    std::cout << "1. Start Game" << std::endl;
    std::cout << "2. Options" << std::endl;
    std::cout << "3. Exit" << std::endl;
    drawBorder();
}

int main() {
    displayMenu();
    return 0;
}
3. تحليل البيانات النصية
يمكن استخدام قيم ASCII لتحليل البيانات النصية، مثل قراءة ملفات النصوص التي تحتوي على مستويات أو إعدادات اللعبة.
#include <iostream>
#include <fstream>
#include <string>

void loadLevel(const std::string& filename) {
    std::ifstream file(filename);
    std::string line;
    if (file.is_open()) {
        while (getline(file, line)) {
            // افترض أن كل سطر في الملف يمثل صفاً من مستوى اللعبة
            std::cout << line << std::endl;
        }
        file.close();
    } else {
        std::cout << "Unable to open file" << std::endl;
    }
}

int main() {
    loadLevel("level1.txt");
    return 0;
}
4. تخصيص الرسوم باستخدام ASCII Art
يمكن استخدام ASCII Art لعرض الرسوم البسيطة أو الشخصيات في اللعبة، مما يضفي طابعًا فريدًا ومميزًا على الألعاب النصية.
#include <iostream>

void displayCharacter() {
    std::cout << "  O  " << std::endl;
    std::cout << " /|\\ " << std::endl;
    std::cout << " / \\ " << std::endl;
}

int main() {
    displayCharacter();
    return 0;
}
يمكن استخدام ASCII بشكل فعال في تصميم الألعاب للعديد من الأغراض، بدءًا من التعامل مع المدخلات من لوحة المفاتيح وعرض النصوص إلى تحليل البيانات النصية واستخدام الرسوم البسيطة. فهم قيم ASCII واستخدامها بذكاء يمكن أن يضيف الكثير من الفعالية والإبداع في تصميم الألعاب.

string نستعمله حين نريد تخزين النصوص في المتغايير
في لغة C++، نستخدم النوع std::string لتخزين ومعالجة النصوص والسلاسل النصية. يعد std::string جزءًا من مكتبة STL (Standard Template Library) ويوفر العديد من الوظائف المفيدة لمعالجة النصوص بسهولة وفعالية. فيما يلي بعض الحالات التي نستخدم فيها std::string في تصميم الألعاب ولماذا هو مفيد:

1. عرض النصوص والرسائل
لعرض الرسائل على الشاشة، سواء كانت رسائل للمستخدم، تعليمات، أو نصوص الحوار بين الشخصيات.
#include <iostream>
#include <string>

int main() {
    std::string welcomeMessage = "Welcome to the game!";
    std::cout << welcomeMessage << std::endl;
    return 0;
}

2. أسماء الشخصيات والأشياء
لتخزين أسماء الشخصيات، الأعداء، الأشياء القابلة للجمع، وما إلى ذلك.
#include <iostream>
#include <string>

int main() {
    std::string playerName = "Hero";
    std::string enemyName = "Dragon";
    std::cout << "Player: " << playerName << std::endl;
    std::cout << "Enemy: " << enemyName << std::endl;
    return 0;
}
3. قراءة وكتابة الملفات النصية
لقراءة وكتابة الملفات النصية التي تحتوي على بيانات اللعبة، مثل مستويات اللعبة، التكوينات، أو سجلات اللاعبين.
#include <iostream>
#include <fstream>
#include <string>

int main() {
    std::ifstream inputFile("level1.txt");
    std::string line;
    while (getline(inputFile, line)) {
        std::cout << line << std::endl;
    }
    inputFile.close();
    return 0;
}
4. معالجة المدخلات النصية
للحصول على مدخلات من المستخدم مثل اسم اللاعب، الأوامر النصية، أو ردود الفعل.
#include <iostream>
#include <string>

int main() {
    std::string playerName;
    std::cout << "Enter your name: ";
    std::getline(std::cin, playerName);
    std::cout << "Welcome, " << playerName << "!" << std::endl;
    return 0;
}

5. نظام الحوار
لإنشاء نظام حوار بين الشخصيات في اللعبة، حيث يمكن تخزين النصوص المختلفة التي تتحدث بها الشخصيات.
#include <iostream>
#include <string>

void displayDialogue(const std::string& character, const std::string& dialogue) {
    std::cout << character << ": " << dialogue << std::endl;
}

int main() {
    std::string characterName = "Guard";
    std::string dialogue = "Halt! Who goes there?";
    displayDialogue(characterName, dialogue);
    return 0;
}
6. الرسائل والتنبيهات داخل اللعبة
لعرض رسائل تنبيهية أو إعلامية داخل اللعبة مثل إشعارات النقاط، النتائج، أو التقدم في اللعبة.
#include <iostream>
#include <string>

void displayNotification(const std::string& message) {
    std::cout << "Notification: " << message << std::endl;
}

int main() {
    std::string notification = "You have leveled up!";
    displayNotification(notification);
    return 0;
}
مزايا استخدام std::string:
سهولة الاستخدام:

يوفر std::string العديد من الوظائف الجاهزة لمعالجة النصوص مثل الإلحاق، التقسيم، البحث، والاستبدال.
إدارة الذاكرة:

يتم إدارة الذاكرة تلقائيًا بواسطة std::string، مما يقلل من احتمال حدوث تسريبات الذاكرة مقارنة باستخدام مصفوفات الأحرف.
التكامل مع مكتبة STL:

يمكن استخدام std::string بسهولة مع حاويات ووظائف STL الأخرى.
التعامل مع النصوص الكبيرة:

يمكن لـ std::string التعامل مع نصوص كبيرة الحجم بفعالية وكفاءة.
الخلاصة
استخدام std::string في تصميم الألعاب يوفر وسيلة فعالة وسهلة للتعامل مع النصوص والأسماء والحوار والمدخلات النصية، مما يساعد على تحسين تجربة المستخدم وتبسيط عمليات معالجة النصوص في اللعبة.

المتغايير bool نستعمله عند تخزين قيمة منطقية صح او خطاء
المتغير bool في لغة C++ يستخدم لتخزين القيم المنطقية (True أو False)، وهو مفيد للغاية في العديد من الحالات في تصميم الألعاب. دعنا نناقش بعض الحالات الشائعة التي نستخدم فيها bool في تصميم الألعاب ولماذا يكون ذلك مفيدًا:

1. تتبع حالات الكائنات
يمكن استخدام bool لتتبع حالة كائن معين، مثل إذا كان اللاعب على قيد الحياة أو ميتًا، أو إذا كان الباب مفتوحًا أو مغلقًا.
#include <iostream>

int main() {
    bool isPlayerAlive = true;
    bool isDoorOpen = false;

    if (isPlayerAlive) {
        std::cout << "The player is alive!" << std::endl;
    }

    if (!isDoorOpen) {
        std::cout << "The door is closed." << std::endl;
    }

    return 0;
}
2. التحكم في تدفق اللعبة
يمكن استخدام bool للتحكم في تدفق اللعبة، مثل التحقق مما إذا كانت اللعبة قد انتهت أو إذا كان مستوى معين قد تم اجتيازه.
#include <iostream>

int main() {
    bool isGameOver = false;
    bool isLevelCompleted = false;

    // منطق اللعبة
    while (!isGameOver) {
        // تحديث حالة اللعبة
        isLevelCompleted = true; // لنفترض أن اللاعب أكمل المستوى

        if (isLevelCompleted) {
            std::cout << "Level completed!" << std::endl;
            isGameOver = true;
        }
    }

    return 0;
}

3. إدارة الأحداث والمدخلات
يمكن استخدام bool للتحقق من أحداث معينة أو استجابة للمدخلات، مثل الضغط على زر معين أو إذا كان العدو مرئيًا في الشاشة.
#include <iostream>

int main() {
    bool isKeyPressed = false;

    // لنفترض أن المستخدم ضغط على مفتاح معين
    isKeyPressed = true;

    if (isKeyPressed) {
        std::cout << "A key was pressed!" << std::endl;
    }

    return 0;
}
4. تفعيل/تعطيل الميزات
يمكن استخدام bool لتفعيل أو تعطيل ميزات معينة في اللعبة، مثل تفعيل وضع اللعب الجماعي أو تعطيل الموسيقى.
#include <iostream>

int main() {
    bool isMultiplayerEnabled = false;
    bool isMusicOn = true;

    // تغيير حالات الميزات بناءً على إعدادات المستخدم
    isMultiplayerEnabled = true;
    isMusicOn = false;

    if (isMultiplayerEnabled) {
        std::cout << "Multiplayer mode is enabled." << std::endl;
    }

    if (!isMusicOn) {
        std::cout << "Music is turned off." << std::endl;
    }

    return 0;
}
5. التحقق من الاشتباك والتفاعل
يمكن استخدام bool للتحقق من الاشتباك بين الكائنات أو التفاعل بين اللاعب والعناصر الأخرى في اللعبة.
#include <iostream>

struct Player {
    int x, y;
};

struct Enemy {
    int x, y;
};

bool isCollision(Player p, Enemy e) {
    return (p.x == e.x && p.y == e.y);
}

int main() {
    Player player = {5, 10};
    Enemy enemy = {5, 10};

    if (isCollision(player, enemy)) {
        std::cout << "Player and enemy collided!" << std::endl;
    }

    return 0;
}
استخدام المتغير bool في تصميم الألعاب يوفر وسيلة فعالة لتتبع الحالات المختلفة، التحكم في تدفق اللعبة، إدارة الأحداث والمدخلات، تفعيل أو تعطيل الميزات، والتحقق من الاشتباك والتفاعل بين الكائنات. هذا يسهل كتابة كود أكثر وضوحًا وصيانةً، ويحسن تجربة البرمجة بشكل عام.

نعم، يمكنك استخدام متغير واحد في تصميم لعبة بلغة C++، ولكن هذا سيعتمد بشكل كبير على حجم وتعقيد اللعبة نفسها والمتطلبات البرمجية لها. استخدام متغير واحد يمكن أن يكون ممكنًا في الألعاب البسيطة أو الألعاب ذات الحجم الصغير والتي لا تتطلب إدارة كبيرة للبيانات أو التفاعلات المعقدة بين اللاعب والعناصر الأخرى في اللعبة.

على سبيل المثال، إذا كانت اللعبة تتطلب فقط تتبع حالة واحدة مثل "هل اللاعب على قيد الحياة؟"، يمكن استخدام متغير bool واحد لتتبع ذلك، كما هو موضح في الأمثلة السابقة.

ومع ذلك، مع تعقيد الألعاب وازدياد حجمها وتعدد العناصر والتفاعلات فيها، قد تحتاج إلى استخدام متغيرات متعددة لتتبع مختلف الحالات والمتغيرات في اللعبة. على سبيل المثال، قد تحتاج إلى متغيرات لتتبع موقع اللاعب، حالة الأعداء، مستويات اللعبة، نقاط اللاعب، والكثير من البيانات الأخرى التي تحدد سلوك اللعبة وتفاعلاتها.

لذا، استخدام متغير واحد أو عدد قليل من المتغيرات يمكن أن يكون كافيًا في بعض الألعاب البسيطة، لكن في العادة ستحتاج إلى استخدام مجموعة من المتغيرات لإدارة بيانات اللعبة وتحديد حالتها بشكل كامل ودقيق.

في تصميم الألعاب بلغة C++، من المهم أن تحدد أولاً الأشياء التي تحتاج إلى تخزينها في المتغيرات والأشياء التي لا تحتاج إلى ذلك. هذا يعتمد على طبيعة اللعبة ومتطلباتها، ولكن هنا بعض الإرشادات العامة:

متى نحتاج إلى تخزين البيانات؟
حالة اللعبة واللاعب:

يمكن تخزين حالة اللاعب مثل الموقع، الصحة، المستوى الحالي، النقاط، والأسلحة المتاحة.
تخزين حالة العناصر الأخرى في اللعبة مثل الأعداء، الأدوات، والعوائق.
الإعدادات والتكوينات:

تخزين إعدادات اللعبة مثل الصوت، اللغة، وضع اللعب، والخيارات المخصصة للمستخدم.
الحوارات والرسائل:

تخزين النصوص والحوارات التي يتفاعل بها اللاعب مع الشخصيات الأخرى في اللعبة.
الحالات المؤقتة والمؤقتة:

تخزين المتغيرات التي تحتاج إلى حفظ حالتها لفترة زمنية محددة، مثل النتائج المؤقتة أو الحالات المؤقتة للأحداث الخاصة.
أمثلة على ما لا يحتاج إلى تخزين:
البيانات المؤقتة في العمليات الحسابية:

القيم التي تستخدم مؤقتًا في عمليات الحساب دون الحاجة إلى الاحتفاظ بها بعد انتهاء العملية.
البيانات التي تُحسب بشكل ديناميكي:

القيم التي يمكن حسابها بناءً على حالات أخرى دون الحاجة إلى تخزينها بشكل منفصل.
الأحداث المؤقتة:

الأحداث التي تحدث مؤقتًا ولا تؤثر على حالة اللعبة بشكل دائم.

لتمييز الأشياء التي يجب تخزينها في لعبتك بلغة C++، تأكد من معرفة البيانات التي تؤثر على حالة اللعبة بشكل دائم أو يمكن استرجاعها بشكل متكرر. استخدم المتغيرات للحفاظ على حالة اللعبة، التكوينات اللازمة، والبيانات التي تتفاعل بها اللاعب. أما بالنسبة للبيانات المؤقتة أو التي لا تؤثر على الحالة الدائمة للعبة، يمكن حسابها ديناميكيًا أو تجاهلها بعد استخدامها لتحسين أداء اللعبة وإدارة الذاكرة.















































الموضوع قابل للتجديد و سيتم اضافة معلومات جديدة كلما توفرت

تاليف ياسين اكرام


التعليقات



إذا أعجبك محتوى مدونتنا نتمنى البقاء على تواصل دائم ، فقط قم بإدخال بريدك الإلكتروني للإشتراك في بريد المدونة السريع ليصلك جديد المدونة أولاً بأول ، كما يمكنك إرسال رساله بالضغط على الزر المجاور ...

إتصل بنا

جميع الحقوق محفوظة

Yassine Agourram

2016