שאלה בג׳אווה (משהו בסיסי)

ronib25

New member
שאלה בג׳אווה (משהו בסיסי)

שלום לכולם. אני לומד ג׳אווה ואני עובד על איזה משחק.. נתקלתי באיזה בעיה קטנה ורציתי להתייעץ האם אני פותר את הבעיה באופן שניתן בכלל לפתור אותה, או שעליי לגשת בדרך קצת שונה..
ובכן: אני יוצר ב arraylist שתי דמויות לוחם או קוסם. עליי לבדוק אם לוחם תוקף קוסם או שהוא תוקף לוחם אחר.. אני שולח ברגע שיש תקיפה את הדמות שמותקפת למתודה שצריכה לבדוק כמה נקודות חיים להוריד (בהתאם לדמות המותקפת). עכשיו המשתנים בתא של ה arraylist הם נקודות חיים, ונקודות תקיפה.
אני עובד ב eclipse והבחנתי במעקב שם שיש זיהוי שנראה כמו בתמונה שצירפתי.
האם יש דרך לברר אם זה אכן warrior (ליד ה id ששווה ל47 בתמונה) או שעליי לפתור בדרך אחרת, למשל הוספת שדה לדמויות שאומר בעצם אם הוא לוחם או קוסם...
(אם ההסבר לא הכי ברור תגידו ואצרף את השאלה עצמה..)

 

BravoMan

Active member
יש פה 2 שאלות בעצם:

1. שאלה טכנית: האם ניתן לזהות את הטיפוס הספציפי של האובייקט בתא מסוים של ArrayList?

התשובה לשאלה היא: כן - בכל מקום ב-Java ניתן להגיע לטיפוס של אובייקט בזמן ריצה.
משתנה, מערך, או אחד מטיפוסי ה-container כמו ArrayList.

אתה יכול להשתמש ב-instanceof
http://www.java2s.com/Tutorial/Java/0060__Operators/TheinstanceofKeyword.htm

או אתה יכול להשתמש במתודה getName של המחלקה Class:
https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html

זה יראה בקוד ככה:
קוד:
if ("Warrier".equals(arr[0].class.getName())) {
    ...
}

2. שאלת דיזיין:
אם הגעת למצב שאתה צריך להשתמש בקוד ב-instanceof או משהו דומה, כנראה שהקוד שלך לא בנוי טוב.

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

כלומר, צריך להבין: למה אם לוחם תוקף קוסם הוא גורם יותר נזק?
האם לכל דמות יש "רמת הגנה" או "שריון" שונים?

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

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

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

ronib25

New member
אתה צודק.. פתרתי באמצעות instanceof, אך לא היתה לי ברירה..

אני חייב לדעת, כאשר אני מתקיף באמצעות לוחם האם הנתקף הוא קוסם או לוחם על מנת שאני אדע את כמות הנקודות שאני צריך להוריד בהתאם לאופי המותקף. מה שעשיתי בדקתי באמצעות instanceof אם מדובר בלוחם, אם כן אז יוריד x נקודות כי הוא לוחם.. אחרת הנתקף קוסם ואז אני אוריד y נקודות כי זה כל מה שנשאר... אני לא ראיתי אפשרות אחרת שאני יכול לדעת מראש את מי אני תוקף..
בכל אופן תודה, פתרתי...
 

פרסאוס

New member
גישה לא נכונה לבעיה

צריך להיות ממשק של תקיפה הגנה וכו שימומש בכל מחלקה לפי הפרמטרים שלה.
&nbsp
 
למעלה