בעיה פשוטה - JAVA - עמוד 3 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

בעיה פשוטה - JAVA


iem

Recommended Posts

  • תגובות 58
  • נוצר
  • תגובה אחרונה

האינדנטציה קצת השתבשה אבל תראה את זה:


public class RobotsWorld{

private int _n;
private Robot[][] _roboArr;
private int _id;


public RobotsWorld (int worldDim){
n=worldDim;
roboArr = new Robot[n][n];
_id=0;
}


public boolean addRobot(Point p){
if ((p.getX()>=_n)||(p.getY()>=_n)||(roboArr[(int)p.getX()][(int)p.getY()]!=null)){
return false;
}
else{
_roboArr[(int)p.getX()][(int)p.getY()] = new Robot(_id,p,Robot.UP);
_id++;
return true;
}
}

}

קישור לתוכן
שתף באתרים אחרים

אתה פותח סוגריים מסולסלים באותה שורה וסוגר בשורה אחרי. אותו דבר ב- switch case.

זה לא נחוץ ב-case, כי ה-case וה-break כבר עוטפים את הבלוק. ב-if/for/while זה כן נחוץ.

נהוג לכתוב שם של שדה עם התחילית '_'

זה נוהג שנשאר מ-++C. בג'אווה הוא לא נחוץ וכבר לא כל כך נהוג.

חוץ מזה, הבנאי של העולם שלך לא טוב. הוא אמור לאפס את העולם, כלומר את השדות. מי זה roboArr?

מה הבעיה כאן? כשיוצרים מטריצה בג'אווה היא מאופסת, כלומר מכילה רק null (בניגוד ל-++C/C).

קישור לתוכן
שתף באתרים אחרים

זאת אומרת שבמצב הנוכחי של התוכנית כפי שהיא כך, המייצר ID שלי שומר על ערכו בכל קריאה למתודה?


import java.awt.*;

public class RobotsWorld {
private int n;
private Robot[][] roboArr;
private int autoIdMaker;

public RobotsWorld (int worldDim){
n=worldDim;
roboArr = new Robot[n][n];
autoIdMaker=0;
}

public boolean addRobot(Point p){
if ((p.getX()>=n)||(p.getY()>=n)||(roboArr[(int) p.getX()][(int) p.getY()]!=null))
{
return false;
}
else
{
roboArr[(int)p.getX()][(int)p.getY()] = new Robot(autoIdMaker,p,Robot.UP);
autoIdMaker++;
return true;
}
}

כשיוצרים מטריצה בג'אווה היא מאופסת, כלומר מכילה רק null.

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

קישור לתוכן
שתף באתרים אחרים

זה לא נחוץ ב-case, כי ה-case וה-break כבר עוטפים את הבלוק. ב-if/for/while זה כן נחוץ.

זה לא נחוץ גם בפקודה אחת אחרי if אבל זה מקל על הקריאה.

מה הבעיה כאן? כשיוצרים מטריצה בג'אווה היא מאופסת, כלומר מכילה רק null (בניגוד ל-++C/C).

זה ברור, אני דיברתי על הקטע שהוא יצר שם אובייקט חדש שלא עושה כלום.

קישור לתוכן
שתף באתרים אחרים

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

אחרת אם המיקום מחוץ לגבולות העולם או שלא קיים בתא , מחזירים null.

כתבתי בנתיים את (את שיטות העזר כתבתי כבר כדי לפשט הקריאות):


public Robot getRobot(Point p){
if ( (!inBoundary(p)) ||(anEmptyCell(p)) )
{
return null;
}
else
{

}
}

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

תודה.

קישור לתוכן
שתף באתרים אחרים

נניח הייתי בונה מח' בשם AdvancedRobot אז זה גם ככה לא משנה כי אני הרי לא יכול לערבב נניח AdvancedRobot ו-Robot באותה מטריצה גם ככה...

ניסיתי לבנות שיטה שהחתימה שלה:

public boolean moveRobot(Point p)

השיטה מזיזה את הרובוט בנק' שנתקבלה ולאחר מכן מחזירה true, באם אין (בסרט הזה כבר היינו) היא מחזירה false.

השיטה כבר כתובה במח' Robot, אבל אין לי מושג איך אני ניגש אליה ותכלס כותב את השורה שתפעיל אותה..

ניסיתי:


public boolean moveRobot(Point p){
roboArr[(int)p.getX()][(int)p.getY()].Robot.move();

}

אבל הוא לא נותן לי לקמפל כי הוא אומר: Robot cannot be resolved or is not a field

למה זה לא הולך ?

תודה.

קישור לתוכן
שתף באתרים אחרים

נניח הייתי בונה מח' בשם AdvancedRobot אז זה גם ככה לא משנה כי אני הרי לא יכול לערבב נניח AdvancedRobot ו-Robot באותה

אתה יכול ע"י שימוש במנגנון הירושה.

אם AdvancedRobot extends Robot.

למה זה לא הולך ?

חשוב שתנסה לקרוא מה השגיאה מנסה לומר לך.

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

קישור לתוכן
שתף באתרים אחרים

אם AdvancedRobot extends Robot.

כלומר אם אני יוצר מטריצה ב-AdvancedRobot אני אוכל להכניס לה אובייקטים מסוג Robot ללא (או עם) casting ?

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

אבל אני סה"כ רוצה להפעיל את move של Robot על אחד התאים (כלומר על רובוט) כלומר להפעיל שיטה מהמחלקה של על אובייקט מסוג רובוט שנמצא בתא... למה הוא לא מאפשר את זה ?

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.


×
  • צור חדש...