עבור לתוכן

בעיה בהדפסת עלים של עץ משחק ב-JAVA

Featured Replies

פורסם
  • מחבר

אתה בטוח שהוא עדיין מדפיס אותו דבר?

כי לוגית הוא לעולם לא יכול להגיע לשורת ההדפסה ???

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

הקוד ללא ביצוע המהלכים / שינוי במשחק :


private void printLeaves(int level, GameTreeNode node)
{
int player=participant;
ArrayList<GameTreeNode> children=node.getChildren();
Iterator<GameTreeNode> itChild=children.iterator();;
if(node!=null && level<depth)
{
if (children != null)
itChild=children.iterator();
else
return;
if(level>0)
{
player = level%2==0 ? participant : presentBoard.opposite(participant);
}

if(children!=null)
{
while(itChild.hasNext())
{
GameTreeNode child = itChild.next();
printLeaves(level+1, child);
}
}
else
{
System.out.println("Level " + level + ": " + (player==PLAYER ? "whitePlayer" : "blackPlayer") + " at " + node.getMove().x + ", " + node.getMove().y);
}
}
else
{
System.out.println("There Is No Root .");
}
}

עדיין לא זה עובד ועכשיו הוא לא מדפיס כלום...

אתה בטוח שאין בעיה מבחינה לוגית ?

למה עכשיו הוא לא מדפיס שום דבר ?

יש אפשרות שתתקן את הקוד ותעלה את זה ?

  • תגובות 37
  • צפיות 3.9k
  • נוצר
  • תגובה אחרונה
פורסם

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

מה שיש לך כרגע זה משהו כזה (בקיצור):


if (children != null)
...
else
return;

.
.
.

if (children != null)
...
else
System.out.println...

אם children ריק הוא תמיד יצא ב-return של ה-if הראשון ואף פעם לא יגיע ל-else של ה-if השני ולהדפסה. תאחד את שני התנאים הזהים ותוריד את ה-return המיותר ואז זה ידפיס.

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

פורסם
  • מחבר


private void printLeaves(int level, GameTreeNode node)
{
int player=participant;
ArrayList<GameTreeNode> children=node.getChildren();
Iterator<GameTreeNode> itChild=children.iterator();;
if(node!=null && level<depth)
{
if(level>0)
{
player = level%2==0 ? participant : presentBoard.opposite(participant);
}
if(children!=null)
{
itChild=children.iterator();
while(itChild.hasNext())
{
GameTreeNode child = itChild.next();
printLeaves(level+1, child);
}
}
else
{
System.out.println("Level " + level + ": " + (player==PLAYER ? "whitePlayer" : "blackPlayer") + " at " + node.getMove().x + ", " + node.getMove().y);
return;
}
}
else
{
System.out.println("There Is No Root .");
return;
}
}

איחדתי את שני התנאים וזה עדיין לא עובד.

להגדיר את המשתנים רגיל (בראש הפונקציה) או בתוך התנאי של בדיקת קיום ה - children ?

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

איפה יכול להיות עוד הבעיה ?

פורסם
  • מחבר

מישהו יודע איך ניתן לפתר את הבעיה או שיש לו אלגוריתם אחר להדפסת "עלי" עץ המשחק מבלי שהוא ידפיס את ה"עלים" יותר מפעם אחת...?

פורסם

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

פורסם
  • מחבר

הלוגיקה היא לא הקוד עצמו ?

אז איפה לדעתך יכולה להיות עוד הבעיה ?

יש לך אפשרות להעמיק בקוד ?

היא הבעיה לא בקוד אז היא יכולה להיות הבעיה ?????

פורסם

בקוד שמחשב את הצעדים עצמם.

פורסם
  • מחבר

אתה מתכוון לניקוד כל אחד מהמהלכים ?

כרגע אין שימוש בניקוד כל מהלך ....

בדיקת הניצחון מתייחסת למונה אשר מראה את מספר הקוביות / החיילים שיש לכל שחקן על הלוח

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

פורסם

לא, בקוד שמחשב את הצעדים עצמם.

פורסם
  • מחבר

לא, בקוד שמחשב את הצעדים עצמם.

כלומר במהלך בניית עץ המשחק ?

האם שם אני אצטרך להשתמש בפונקציות makeMove ו-unMakeMove ?

פורסם

מישהו יודע איך ניתן לפתר את הבעיה או שיש לו אלגוריתם אחר להדפסת "עלי" עץ המשחק מבלי שהוא ידפיס את ה"עלים" יותר מפעם אחת...?

http://he.wikipedia.org/wiki/%D7%90%D7%9C%D7%92%D7%95%D7%A8%D7%99%D7%AA%D7%9D_%D7%97%D7%99%D7%A4%D7%95%D7%A9_%D7%9C%D7%A8%D7%95%D7%97%D7%91

קל, פשוט ונוח. ( למרות שהלינק יצא מכוער)

פורסם

כלומר במהלך בניית עץ המשחק ?

האם שם אני אצטרך להשתמש בפונקציות makeMove ו-unMakeMove ?

כן כנראה שהבעיה היא בקוד שבונה את העץ.

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

פורסם
  • מחבר

אז איך אני הבצע את מהלך ה-unMakeMove ?

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

פורסם
  • מחבר

הקוד המעודכן:


private void printLeaves(int level, GameTreeNode node)
{
int player=participant;
ArrayList<GameTreeNode> children=node.getChildren();
Iterator<GameTreeNode> itChild=null;
if(node!=null)
{
if (children != null)
{
itChild=children.iterator();
player = level%2==0 ? participant : presentBoard.opposite(participant);
}
if(children!=null)
{
while(itChild.hasNext())
{
GameTreeNode child = itChild.next();
printLeaves(level+1, child);
}
}
else
{
System.out.println("Level " + level + ": " + (player==PLAYER ? "whitePlayer" : "blackPlayer") + " at " + node.getMove().x + ", " + node.getMove().y);
}
}
else
{
System.out.println("There Is No Root.");
}
}

סבבה התוכנית התקדמה אבל פתאום עכשיו כאשר אני מריץ הקוד הנ"ל הוא נכנס לי ללולאה אין סופית...

איפה יכולה להיות הבעיה ?

איפה ההדפסה נכנסת ללולאה אין סופית ?

איך פותרים את הבעיה הזאת ?

פורסם

שוב חזרת לבעית בסיס של בדיקת NULL אחרי שימוש ? (לא שזה קשור)

ארכיון

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

דיונים חדשים