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

سؤال في لعبه بسيطه بلغه c++ ، بليز المساعده

بدأه empror9 في 10 مارس 2010 · 10 رد · 3,622 مشاهدة · في قسم برمجة الألعاب و الرسوميات العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

مسائكم ورد

اتمنى انكم بصحه وعافيه

عندي واجب عباره عن لعبه بسطيه جدا يحتوي فيها على: بطل ، شرير ، قنبله ، جدار ، سيف + خريطه مكونه من 7 غرف ولكل غرفه فيه شئ واحد من الاشياء الي ذكرتهم قبل قليل (بطل ، شرير ، قنبله ، جدار ، سيف) وراح تزيد غرفتين هي مجرد غرف فارغه

وهذي صورة توضيحيه اتمنى توصل الفكرة

42695322.jpg

الان مشكلتي هي كيف ممكن اخلي البطل يتحرك للغرفه اليسار ثم يصعد للغرفه العليا حتى ياخذ القنبله وثم يعود للاسفل وهكذا

حاولت استخدم function لكن ما عرفت ابدا

ياريت المساعده وانتظركم بفارغ الصبر

#2

عندما يقوم اللاعب بالضغط على أحد أزرار الحركة.

يتم إعادة رسم صورة اللعبة بعد التعديلات الحاصلة.

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

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

1
#3

يسعدك ربي ع المعلومه

لكن الي استخدمه هو ماذا بالضبط

لان الي درسنا هو if & swich statment and loops and functions

ياريت تعطيني فكرة اوضح عن اللعبه وطريقه برمجتها

يسعدك ربي

#4

اقرأ عن دورة حلقة اللعبة Game Loop لتفهم الالية اللعبة .

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

#5

طيب بقولك اخر المستجدات باللغه الانجليزيه

1- i declare many functions for each room , for example

void left_room()

{

cout << " the hero position is in the left room" <<endl;

}

so my qustions is how can i use this functions with if statment

for example i want to do this code

if (left_room == 'd' || left_room == 'D')

{

'show the middle room functions'

}

else if (middle_room == 'd' || middle_room == 'D')

{

cout << " the hero position is in the right room " << endl;

}

i tested this code but dosen't work

i tried to declare varibles instead of functions and i use all the tybes (char,int,float,double,void)

i'll show you how i use these varibles

int hero_left= '------------'

'| |'

'| |'

'| |'

'| |'

'------------';

cout << hero_left << endl;

but still dosen't work

#6

كما قال الزميلين @خلدون و @أحمد ،

أنت بحاجة للقراءة عن المفاهيم الأساسية البسيطة المكوّنة لأي لعبة .

سواءً كانت لعبة على شاشة سوداء Console أو لعبة على XBox360 ، فالطريقة واحدة .

1- مفهوم Frame Buffer :

كما قال الأخ خلدون ، تحتاج لمتغيرات و سطح للرسم ، لتمثيل لعبتك .

اي أنك ببساطة ، تحتاج لمصفوفة لتمثيل رسمتك .

أي لعبة تخزن بيانات الرسم في مصفوفة ( قد تكون مصفوفة لونية ( قيم لونية ) ، في حال كان جهاز العرض رسومي ، أو أن تكون مصفوفة نصّية ، كما في سؤالك ( حيث الهدف ، شاشة Console نصية ) ) .

- أنشئ مصفوفة نصية char ، واملئها بالقيم كما تريد .

- أضف متغير اسمه مثلاً currentPosition يشير إلى موقع لاعبك في الخريطة ( المصفوفة ) .

- استقبل مدخلات من لوحة المفاتيح ، بحيث تحدث المتغير currentPosition ( ليتحرك يميناً ويساراً .. الخ ) .

- لاتنس اكتشاف التصادم ( تكتشتف فيما اذا كان اللاعب قد تجاوز حدود اللعبة .. أو أنه وصل للهدف ) .

2- مفهوم Game Loop :

كما ذكر الاخ أحمد ،

تحتاج لعمل loop ، وفي كل مرة تحتاج لمسح النافذة ورسم المصفوفة ( السابقة ) التي تحتوي على عناصر اللعبة .

أثناء Loop تحتاج أيضاً لاستقبال المدخلات من الكيبورد ، لتحرك اللاعب . وتحتاج لاكتشاف ما اذا كان الهدف وصلت اليه أم لا .

مثال :

هذا مثال بسيط يوضح المفهوم ، ممكن تبني عليه ،

تستطيع من خلال هذا المثال الحصول على هذا الشكل :

post-42837-12682763457145_thumb.png

التحريك :

الحرف a ثم اضغط " انتر " ، لتحرك الشكل الى اليسار ,

الحرف d ثم اضغط " انتر " ، لتحرك الشكل الى اليمين .

q لتخرج من اللعبة .

الهدف :

الوصول للهدف وهو القلب .

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

#include<iostream>
using namespace std ;

	char frameBuffer[]=
	{
				'+','-','-','-','-','-','-','-','-','-','-','-','+',
				'+',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','+',
				'+',' ',' ',' ',' ', 1 ,' ',' ', 3 ,' ',' ',' ','+',
				'+','-','-','-','-','-','-','-','-','-','-','-','+'

	};
/*
The Frame Buffer Indices
'0', '1' , '2', '3', '4', '5', '6' , '7', '8' , '9','10','11','12',
'13', '14' , '15', '16', '17', '18' ,'19', '20' ,'21','22','23','24','25',
'26', '27' , '28', '29', '30', '31' ,'32', '33' ,'34','35','36','37','38',
'39', '40' , '41', '42', '43', '44', '45', '46' ,'47','48','49','50','51'
*/
	int currentPosition = 31;
	char oldValue = ' ';
	bool gameLoop = true;
	string msg = "";
void draw(char*data, int len)
	{


		for(int i=0;i<len;i++)
		{
			if(i%13 == 0)
				std::cout << std::endl;
			std::cout << data;
		}
		std::cout<<std::endl;
		std::cout<<std::endl;
		std::cout<<std::endl;
		std::cout<<std::endl;

	}
void moveLeft()
	{
		if(currentPosition ==27)// اكتشاف التصادم
			return;
		frameBuffer[currentPosition] = oldValue;;
		oldValue = frameBuffer[currentPosition-1];
		frameBuffer[currentPosition-1] = (char)1;
		currentPosition--;

	}
void moveRight()
	{
		if(currentPosition ==37)// اكتشاف التصادم
			return;
		frameBuffer[currentPosition] = oldValue;;
		oldValue = frameBuffer[currentPosition+1];
		frameBuffer[currentPosition+1] = (char)1;
		currentPosition++;

	}
void input()
	{
		std::cout << "Move Left : 'a' then 'enter'" << "\n";
		std::cout << "Move Right : 'd' then 'enter'" << "\n";
		std::cout << "Exit 	: 'q' then 'enter'" << "\n";
		std::cout<<std::endl;
		std::cout<<std::endl;

		int inp = getchar();
		switch( inp)
		{
		// exit .
		case (int) 'q':
		case (int) 'Q':
			gameLoop = false;
			msg = " The End ";
		break;
		// move left .
		case (int) 'a':
		case (int) 'A':
			moveLeft();
		break;
		// move right .
		case (int) 'd':
		case (int) 'D':
			moveRight();
		break;
		}

	}

void isWin()
	{
		if(currentPosition == 34 ) // the goal
		{
			msg = " You Won " ;
			gameLoop = false;
		}
}

int main()
	{
			while(gameLoop == true)
			{

				system("cls");
				draw(frameBuffer,(sizeof(frameBuffer)/sizeof(char)));
				isWin();
				input();

			}
			std::cout << "\t---------" << std::endl;
			std::cout << "\t " << msg.c_str() << std::endl;
			std::cout << "\t---------" << std::endl;

		return 0;
	}

قم باضافة التحريك للاعلى و الاسفل .

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

يمكنك تحسين طريقة الادخال عن طريق الاستفادة من Win32 APIs ، اذا كنت تعمل على الويندوز ( البرنامج يعمل على الويندوز ) .

http://www.cplusplus.com/forum/beginner/3329/

بالتوفيق .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#7

الله يعطيك الف عافيه ماقصرت ابدا والله يجزاك خير ان شاء الله والمشكله ان الواجب هذا لازم ينحل عن طريق الدروس الي اخذناها ولا يمكن نحط شئ مادرسناه

لان المصفوفات لسه مادرسناها لحد الان ( الي درسنا if, switch , loops , function ) وهذي المشكله لاني حاولت اسوي الكود ولا ضبط معي الا بطريقه واحده

سويت فنكشن لكل غرفه يعني مثلا لو نريد الانتقال لغرفه ع اليسار سويت لها فنكشن left_room وحطيت جوته الرسمه ان البطل يكون دايما في الغرفه اليسرى

وعشان كذا بكون مضطر اني اسوي لكل غرفه زر خاص فيه ، يعني لو يريد المستخدم يروح للوسط راح يضغط على زر m الي تعني middle room عشان يروح للوسط وبنفس الوقت انا مسوي فنكشن بالاسم هذا وراسم ان البطل في الغرفه الوسطى دايما : (

وهذا طبعا غلط لانه مو ضمن قواعد اللعبه ان البل يتحرك بحريه

هذي المشكله الي انا فيها للاسف :mellow:

يسعدك ربي ع الشرح من جد ماقصرت ابدا

تحياتي،،

تم تعديل هذه المشاركة بواسطة empror9 في 11 مارس 2010 في 10:35

#8

i have a good idea now , i have to declare varible called 'current_position' this varible to dtermine the hero position

cin >> current_position;// key d to move right from the left room

if(current_position == 'd')
{
show hero_midlle();
}
else if(current_position == 'w')
{
show hero_bomb_room();
}
else
{
cout <<"please enter  possible key to move" << endl;

i think i can do it with this code, is it perfect way??

all the functions are to display the hero position and to show the possible actions that the user should do and i'll change the name of all functions to make it easy to understand

#9

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

كف ممكن انادي فنكشن من فنكشن اخر

يعني مثلا

اذا ابغى اطبع فنكشن رقم واحد على سبيل المثال بداخل فنكشن اثنين ، لازم بالاول اعرف فنشكن واحد حتى اقوم بطباعته داخل فنكشن اثنين

هلفيه طريقه اخرى غير هذي؟

#10

السلام عليكم

انا تعلمت ان اكون compiler فى لغة C++ عن طريق Microsoft Visual Studio 2010

اريد ايميل على الياهو للتحدث السريع من اى محترف

عايز بعض الاستفسارات ضرورى جدا جدا جدا جدا فى هذا المجال

انا باجمع محرك شطرنج الاقوى فى العالم الان

انا وجدت المنتدى دة بالصدفة و فرحت لما وجدتة خاص بالعرب

الوقت عندى ضرورى جدا

دة الايميل بتاعى

ahmed_kamal731@yahoo.com

شكرا

تم تعديل هذه المشاركة بواسطة Ahmed_kamal في 13 مايو 2010 في 15:57

−1
#11

موضوع جميل متابعه ,,,

اقتباس
اذا ابغى اطبع فنكشن رقم واحد على سبيل المثال بداخل فنكشن اثنين ، لازم بالاول اعرف فنشكن واحد حتى اقوم بطباعته داخل فنكشن اثنين

هلفيه طريقه اخرى غير هذي؟

يجب تعريف الفنكشن حتى تستطيع مناداتها سواء كنت تريد مناداتها في الماين أو بفنكشن أخرى

بلتوفيق عمل جميل

اقتباس
كما قال الزميلين @خلدون و @أحمد ،

أنت بحاجة للقراءة عن المفاهيم الأساسية البسيطة المكوّنة لأي لعبة

هل من الممكن تزويدنا براوبط لني لم أجد موقع مفهوم على الأقل

أو كتاب

و شكرا

تم تعديل هذه المشاركة بواسطة GProgrammer في 13 مايو 2010 في 17:02

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