בעיה בהדפסת עלים של עץ משחק ב-JAVA - עמוד 2 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


ניר.

Recommended Posts

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

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

מעבר לזה לא הבנתי למה בפונקציה שמטרתה להדפיס עץ קוראים לפונקציות שמשנות את לוח המשחק (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
  • נוצר
  • תגובה אחרונה

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

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


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 ?

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

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

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

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

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

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

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

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

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

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 למשחק רברסי ככה שתצטרך לבחור גישה אחרת לפתור את הבעיה.

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

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


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.");
}
}

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

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

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

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

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

ארכיון

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


×
  • צור חדש...