שאלה די כללית

Gilnaa

New member
שאלה די כללית

אני לומד C#, וכאימון, אני רוצה לבנות משחק די פשוט של פקמן, שלב אחד, מסלול קטן. אבל אני לא יודע איך להציץ ארועים של התנגשות בקירות, ברוחות, ובחטיפים (שיהיו רדיו באטנס
). מישהו יכול לתת לי כיוון?
 

freak2100

New member
לדעתי תתחיל מטטריס

אם אתה מתעקש על פקמן, אתה צריך לעבור על כל זוג של עצמים שיכולים להתנגש, למשל פקמן עם רוח 1, פקמן עם רוח 2, פקמן עם קיר 1, פקמן עם קיר 2 וכו'. עבור כל זוג אתה עושה בדיקה. הכי פשוט במקרה של פקמן זה להתייחס להכל כאל מלבנים, ואז זה קל, על אף שלא מדוייק. תחפש בגוגל collision detection, אתה תמצא הרבה חומר בנושא.
 

De-Panther

New member
אני דווקא חושב שהוא לא חייב לעשות מערכת עם...

בדיקת התנגשות בשביל פקמן. הוא יכול לבנות את הלוח בתור מערך דו מימדי של מספרים. כל מספר מייצג משהו אחר(קיר, אוכל רגיל, אוכל מיוחד וכו'). והלחיצות שלו יעבירו את הפקמן ממקום אחד למקום אחר במערך. אם הוא רואה שאחד המקומות במערך מסומן בתור קיר, הוא לא יתן לפקמן לעבור דרכו.
 

Gilnaa

New member
ברח התוכן

אוקי נגיד אני כותב מערך דו מימדי(לא יותר מימדים?)(הלוח צריך להיות מחולק לקוביות[grid]?):
int placement[,] = new int[/*מספר שורות*/] ,{0, 1} ,{3, 2} ,{0, 1} ,{1, 1} ,{0, 1} ,{4, 1} {0, 1}​
איך אני מבין פה את המיקום של כל אחד מהם? ואז אני צריך לכתוב את התגובה לארוע keypress:
private void Form1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Left) { } else if (e.KeyCode == Keys.Right) { } else if (e.KeyCode == Keys.Up) { } else if (e.KeyCode == Keys.Down) { } }​
אני לא מבין איך המערך הדו מימדי בא לידי ביטוי
, אני יכול לקבל עוד פרטים בבקשה?
 

freak2100

New member
תחשוב שהלוח שלך הוא תאים

שכל תא יכול להכיל: * כלום * נקודה אכילה ע"י פקמן * את פקמן עצמו * רוח * קיר המערך הדו מימדי שומר לך את כל התאים - בכל תא מה יש (אתה משתמש בenum בשביל להגדיר את האפשרויות)
 

Gilnaa

New member
אוקיי

בסדר, אבל למה דו מימדי? לא הגיוני לעשות 10 מימדים(לדוגמא של לוח עם 10 שורות\עמודות)? אבל אם יש נקודה שפקמן יכול לאכול ועוברת עליה רוח, ואז הרוח עוברת למשבצת הבאה, איך אני מחזיר את הנקודה? נגיד מספר 5 לרוח, ו6 לרוח שעומדת על נקודה? ושאלה אחרונה, C# היא שפה מונחת ארועים, אבל הרוחות צריכות לזוז כל הזמן, וכך גם המוזיקה(אם יש), איך אני במקביל מפעיל גם את התזוזה של הרוחות וגם מפעיל את הקוד של התגובה ללחיצות המקשים? דבר אחרון, AI של הרוחות?
 

freak2100

New member
10 מימדים? השתגעת?

תלמד שוב את הנושא של מערכים דו מימדיים, נראה לי שלא הבנת את הרעיון. מערך דו מימדי הוא סוג של טבלה. לוח משבצות הוא סוג של טבלה. והרי לך לוח משבצות שמיוצג על ידי מערך דו מימדי. תראה, במשחקים בדרך כלל לא עובדים ממש עם האירועים הסטנדרטיים. במקום זה עושים משהו שנקרא "לולאת המשחק", שזו איזו פונקציה שאתה קורא לה כל X מילישניות, והיא יוצרת את המשחקיות המתמשכת. כל הרצה שלה זה מה שנקרא "פריים", והמשחק הוא רצף של פריימים שנראים לשחקן כהמשכיות. בכל פריים אתה בודק אם המשתמש מחזיק כרגע את אחד המקשים לחוץ ואיזה מקש, ומגיב בהתאם (אני לא מכיר C# אז אני לא בטוח איך עושים את זה שם)
 

freak2100

New member
ולגבי AI...

בעקרון יש לרוחות AI קבוע וידוע (לכל צבע יש התנהגות שונה), שאתה יכול לקרוא עליו כאן: http://home.comcast.net/~jpittman2/pacman/pacmandossier.html אבל נראה לי שזה מסובך מדי למה שאתה רוצה לעשות... בוא נתחיל מזה שלא תעשה AI, או אפילו תעשה שהרוחות זזות בצורה אקראית לחלוטין. כשתסיים את המשחק ככה, ננסה לתת לך קצת רעיונות לגבי AI פשוט
 

Gilnaa

New member
אוקיי

ולגבי המערך הדו-מימדי. אלא אם כן אתה מתכוון רב-מימדי, אני לא מבין. איזו סיבה יש לי להשתמש ברק שני מימדים?, הרי הטבלה שנוצרת משני מימדים היא בעלת שתי שורות\עמודות. והרי אם הלוח של המשחק הוא למשל 10*10, אז לא הגיוני לעשות עשרה מימדים?(ושוב, אני לא מנסה לעצבן, פשוט נראה לי יותר הגיוני להבין מה אני עושה
)
 

freak2100

New member
אז יש לך בעיה במושגים

מערך חד מימדי הוא מערך בגודל n:
arr[n] arr[0], arr[1], arr[2], ..., arr[n-1]​
מערך דו מימדי הוא מערך בגודל n*m:
arr[n][m] arr[0][0], arr[0][1], arr[0][2], ..., arr[0][m-1] arr[1][0], arr[1][1], arr[1][2], ..., arr[1][m-1] ... arr[n-1][0], arr[n-1][1], arr[n-1][2], ..., arr[n-1][m-1]​
מערך עם 10 מימדים הוא מהצורה:
arr[d1][d2][d3][d4][d5][d6][d7][d8][d9][d10]​
אתה בטוח שזה מה שאתה רוצה?
 

Gilnaa

New member
באיזה שפה זאת?

אולי מגדירים אותם אחרת בC# מערך חד מימדי הוא ככה:
int[] array1 = new int[] { 1, 3, 5, 7, 9 };​
מערך דו מימדי:
int[,] array1 = new int[] { 1, 3, 5, 7, 9 }, { 1, 3, 5, 7, 9 };​
ומהערך 10-מימדי:
int[,] array1 = new int[] { 1, 3, 5, 7, 9 }, { 1, 3, 5, 7, 9, { 1, 3, 5, 7, 9, { 1, 3, 5, 7, 9, { 1, 3, 5, 7, 9, { 1, 3, 5, 7, 9, { 1, 3, 5, 7, 9, { 1, 3, 5, 7, 9, { 1, 3, 5, 7, 9, { 1, 3, 5, 7, 9 };​
או אחד על גבי השני:
int[,] array1 = new int[] { 1, 3, 5, 7, 9 }, { 1, 3, 5, 7, 9,} { 1, 3, 5, 7, 9,} { 1, 3, 5, 7, 9,} { 1, 3, 5, 7, 9,} { 1, 3, 5, 7, 9,} { 1, 3, 5, 7, 9,} { 1, 3, 5, 7, 9,} { 1, 3, 5, 7, 9,}​
גם כאן נוצרת מאין טבלה(וץ מזה שבכלל לא הצלחתי לקרוא את המערך שאתה כתבת, אני רגיל לתחביר הספציפי של C#)
 

adiel666

New member
כנראה שיש לך עוד מה ללמוד בC#

Jagged Arrays מערך דו מימדי-
int[][] jaggedArray= new int[][] { new int[] {2,52,5,7,9}, new int[] {2,3,4,27} }; jaggedArray[0][0] = 10;​
השיטה שאתה מכיר - בדרך כלל לא משתמשים בה, אלא אם כן הגודל של כל "שורה" בטור זהה. Jagged Array הוא בעצם "מערך של מערכים" מסוג שצויין.
 

De-Panther

New member
כמו שאסף אמר, אתה קצת מבלבל ומתבלבל כאן בין..

המושגים מערך הוא סוג של רשימה עם מספר תאים. נניח 3 תאים שבכל אחד מהם יש שם: תא1 - יצחק תא2 - שמעון תא3 - זרובבל מערך דו מימדי הוא מערך של מערך, יעני, רשימה של רשימות. ונראה כמו טבלה. ש\ע. עמודה 1, עמודה2, עמודה 3 שורה1. יצחק, שמעון, זרובבל שורה2. ציון, יחזקאל, שמוליק שורה3. ברוך, דויד, משה מערך רב מימדי, הוא מערך שבנוי ממערכים. כן, בקבוצה שלו אפשר להכיל גם את המערך הדו מימדי, אבל לרוב כשמדברים על מערך רב מימדי, ידברו על מערך גדול יותר מדו מימדי(נניח תלת מימדי - רשימה של טבלאות. או ארבע מימדי, רשימה של רשימת טבלאות. וכו' וכו') אני גם מצרף תמונה כדי שיהיה לך יותר ברור. מה שבצד שמאל - מערך רגיל(אתה רואה כמה תאים אחד מעל לשני) מה שבאמצע - מערך דו מימדי(טבלה) מה שבצד ימין - מערך רב מימדי(מערך של טבלאות)
 

Gilnaa

New member
אוי

הבנתי, אופס. אני שמח ששאלתי לפני שהפכתי תכנות למקצוע
. תודה על העזרה
(שניכם)
 

Gilnaa

New member
דבר באמת אחרון

אתה במקרה למדת C#? כי יש את עניין התאים, שאני לא יודע איך לממש אותו מהבחינה של הלוח. יש את האפשרות של 100 pictureboxes (10*10)(ושוב, זאת רק דוגמא), אחת ליד השנייה, וכשהמשחק מתחיל, בודקים את הערך של כל תמונה במערך (קיר, פקמן, בייגלה(
)), אבל אז בקלות אני יכול ללכת לאיבוד, יש המלצה?
 

De-Panther

New member
לא יודע סישארפ. אני יכול רק לכוון אותך לגבי..

רעיונות מאחורי אלגוריתמיקה, לא לגבי האלגוריתם עצמו או המימוש שלו. מה גם, שחלק מהעניין זה לנסות בעצמך, אחרת לא באמת תלמד. הייתי יוצר מערך דו מימדי של מספרים, ולפיו כל פריים מצייר את מה שרואים על המסך. כל עוד לא לחצו על מקש, אני נותן לאנימציה לרוץ בדרך שלה(נניח לחצת קודם על ימינה, לתת לפקמן להתקדם ימינה עד שהוא מגיע למצב שהתא הבא אליו הוא אמור להגיע הוא קיר). אם המקש של למעלה לחוץ, והפקמן הוא בנקודה שהוא יכול להתקדם למעלה, אז לתת לו להתקדם למעלה. אחרת שימשיך בדרך שבה הוא היה.(או לחילופין, שיעצור במקום, מה שנראה לך יותר הגיוני או מתאים). אם הפקמן הגיע לתא שבו יש אוכל, אז להעלים את האוכל ולהוסיף לפקמן נקודות. אבל כשאני חושב על זה. כדאי שקודם תשחק קצת עם תוכנה לפיתוח משחקים, כמו למשל גיים מייקר. ובה יהיה לך יותר קל לשחק באלגוריתמים של משחק. ורק לאחר מכן תממש את זה בקוד בסישארפ. יהיה הרבה יותר פשוט.(כרגע ניסיתי יחסית לפשט את האלגוריתם, אבל עדיין אין כאן התייחסות למהירות שבה הפקמן זז, ולאנימציה של מעבר בין תאים - הפקמן פשוט מופיע בתא אחד, ופתאום מופיע בתא אחר) רובנו כאן, כשאנחנו מפתחים משחקים, משתמשים בתוכנות שמיועדות לזה כדי להקל על העבודה שלנו.
 

Gilnaa

New member
תודה רבה ../images/Emo13.gif

לגבי תוכנה ליצירת משחקים... אני מנסה לתכנת את פקמן בשביל להבין את השפה, לא בשביל ללמוד לתכנת משחקים, ואני כבר יודע עכשיו בערך מה צריך לעשות, צריך רק לממש. מעכשיו אני אנסה בעצמי
חוץ מזה שרוב השאלות הבאות בטח בכלל יתאימו לתכנות .net
 
למעלה