עבור לתוכן

פונקציית הערכה במשחק רברסי

Featured Replies

פורסם

שלום רב !!

בניתי משחק רבסי ב - JAVA אשר בו יש בין היתר את פונקציית הערכת המהלכים אך יש לי בה בעיה כאשר אני מעוניין שהיא תתן ניקוד יותר גבוהה לנקודות / מהלכים שהם בקצוות הלוח וניקוד גבוהה אף יותר לנקודות / המהלכים שנמצאים בפינות של לוח המשחק..

איך אני מסדר את קוד הפונקציה כך שהיא ותענה על הדרישה ?

הקוד הינו :


public int getValueByPoint(Point p,int participent)
{
int points = 0,maxPoints = -9999,row,col;
for(int i=0;i<8;i++)
{
loop2:
for(int k=5;k>0;k--)
{
row = p.x+(spokes[i].x*k);
col = p.y+(spokes[i].y*k);
for(int j=0;j<4;j++)
{
row -= spokes[i].y;
col -= spokes[i].x;
Point tmpPoint = new Point(row,col);
if(row>0 && col>0 && col<field.length-1 && row<field.length-1)
{
makeMove(participent,tmpPoint);
if(field[row][col] == participent)
{
// System.out.println("...");
if (row == 1 || row == field.length-1)
{
points *= 3;
// System.out.println("(In Board Class) Point Is Next The Row Border.");
}
if(col == 1 || col == field.length-1)
{
points *= 4;
// System.out.println("(In Board Class) Point Is Next The Col Border.");
}
points += 2;
break loop2;
}
else
if(field[row][col] == opposite(participent) || field[row][col] == B)
{
points = 0;
break loop2;
}
unMakeMove(tmpPoint);
}
else
{
points = 0;
break loop2;
}
}
if(points > maxPoints)
{
maxPoints = points;
}
}
}
return maxPoints;
}

כמו כך הפונקציה עושה שימוש גם במשתנה הבא :


private static Point[] spokes = {new Point(-1,-1),new Point(0,-1),
new Point(1,-1),new Point(-1,0),new Point (1,0),
new Point (-1,1),new Point(0,1),new Point(1,1)};

פורסם

מה הבעיה ?

תוסיף 4 IF שבודקים אם זה אחד מהשורות/טורים שבקצוות.

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

פורסם
  • מחבר

מה הבעיה ?

תוסיף 4 IF שבודקים אם זה אחד מהשורות/טורים שבקצוות.

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

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

פורסם
  • מחבר

מישהו יודע איך מסדרים את הבעיה הזאת ??????

פורסם

1. על debugger שמעת?

2. מה זה מחזיר לך?

3. אתה בכוונה מחזיר את MaxPoints ולא את points?

פורסם
  • מחבר

1. על debugger שמעת?

2. מה זה מחזיר לך?

3. אתה בכוונה מחזיר את MaxPoints ולא את points?

1. כן ניסיתי לפתור את הבעיה בעזרת זה אבל זה לא עבד..

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

3.כן אני מכוונה מחזיר את MaxPoints ולא את points משום שהוא משתנה כל הזמן בסוף הלולאה ובסופה של הפונקציה הוא יכיל את הערך הגבוהה ביותר לאותה נקודה..

פורסם

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

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

פורסם
  • מחבר

הפונקציה המעודכנת כולל הסברים:


public int getValueByPoint(Point p,int participent)
{
int points = 0,row,col;
for(int i=0;i<8;i++) //לולא הכיוונים
{
loop2:
for(int k=5;k>0;k--) //לולאת מספר הצעדים קדימה
{
row = p.x+(spokes[i].x*k);
col = p.y+(spokes[i].y*k);
for(int j=0;j<4;j++)
{
row -= spokes[i].y; // חישוב נקודת השורה
col -= spokes[i].x; // חישוב נקודת העמודה
if(row>0 && col>0 && col<field.length-1 && row<field.length-1)
{
Point tmpPoint = new Point(row,col); //יצירת נקודה חדשה בעלת ערכי הנקודה שחושבה
makeMove(participent,tmpPoint);
if(field[row][col] == participent) //בדיקה האם מוצב בנקודה הזאת השחקן הנוכחי
{
// System.out.println("...");
if (row == 1 || row == field.length-1) //בדיקת הגבולות בשורה
{
points *= 4;
// System.out.println("(In Board Class) Point Is Next The Row Border.");
}
if(col == 1 || col == field.length-1) //בדיקת הגבולות בעמודה
{
points *= 4;
// System.out.println("(In Board Class) Point Is Next The Col Border.");
}
points += 2;
}
else
if(field[row][col] == opposite(participent) || field[row][col] == B) // בדיקה האם זהו תא של היריב או גבול לוח המשחק
{
points = 0;
}
unMakeMove(tmpPoint); //ביצוע חזרה אחורה של המהלך
}
else
{
points = 0;
break loop2;
}
}
}
}
return points;
}

פורסם

קצת יותר טוב אבל עדיין המון דברים פשוט לא הגיוניים.

1. מה זה j? כרגע j ו-k חופפים במה שהם עושים ואתה סתם בודק חלק מהצעדים כמה פעמים - נראה כמו כפילות מיותרת.

2. points מתאפס בהמון מקרים, כל פעם שהוא הוא מתאפס אתה מאבד את התוצאה של כל הצעדים הקודמים שבדקת. או שתשמור את המקסימום (כמו שעשית קודם עם maxPoints) או ש-points צריך להצטבר במהלך הבדיקות ולא להתאפס.

3. בבדיקת הגבולות אתה מכפיל את points אבל רוב הסיכויים שהערך שלו אפס, מה הטעם להכפיל את אפס?

4. מה המשמעות לקרוא לפונקציה makeMove על תא שאיננו ריק? האם צריך לבצע חישוב נקודות למהלך כזה שאיננו חוקי? איך unMakeMove יכולה לדעת שהתא לא היה ריק ולא באמת התבצע מהלך? האם בכלל צריך לקרוא ל-unMakeMove במקרה כזה?

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

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

(נ.ב. לא תהיה לי גישה למחשב בשבוע הקרוב)

פורסם

אני כבר לא תכנתתי שנים, וגם כשכן אז זה היה תחביב קטן ולא הרבה יותר מזה.

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

אולי זה בגלל שזה בJAVA ואני רגיל לניסוחים של שפה אחרת.

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

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

פורסם
  • מחבר

קצת יותר טוב אבל עדיין המון דברים פשוט לא הגיוניים.

1. מה זה j? כרגע j ו-k חופפים במה שהם עושים ואתה סתם בודק חלק מהצעדים כמה פעמים - נראה כמו כפילות מיותרת.

2. points מתאפס בהמון מקרים, כל פעם שהוא הוא מתאפס אתה מאבד את התוצאה של כל הצעדים הקודמים שבדקת. או שתשמור את המקסימום (כמו שעשית קודם עם maxPoints) או ש-points צריך להצטבר במהלך הבדיקות ולא להתאפס.

3. בבדיקת הגבולות אתה מכפיל את points אבל רוב הסיכויים שהערך שלו אפס, מה הטעם להכפיל את אפס?

4. מה המשמעות לקרוא לפונקציה makeMove על תא שאיננו ריק? האם צריך לבצע חישוב נקודות למהלך כזה שאיננו חוקי? איך unMakeMove יכולה לדעת שהתא לא היה ריק ולא באמת התבצע מהלך? האם בכלל צריך לקרוא ל-unMakeMove במקרה כזה?

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

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

(נ.ב. לא תהיה לי גישה למחשב בשבוע הקרוב)

1. הפונקציה unMakeMove עובדת נכון והיא אף נבדקה על ידי מספר מורים של JAVA..

2.j ו-k לא זהים משום שבכל נכודה ונקודה יש לבדוק את כל 8 הכיוונים שלה ..

3. בפעם הקודמת אמרת שלא צריך את maxPoints אבל עכשיו ראית שכן צריך כולל הבדיקה..

4.ראית שהפונקציה משתמשת גם במערך הכיוונים, spoks, אשר את הגדרת המשתנה הבאתי בהודעה הראשונה ?

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

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


public int getValueByPoint(Point p,int participent)
{
int points = 1,maxPoints = -9999,row,col;
for(int i=0;i<8;i++)
{
loop2:
for(int k=5;k>0;k--)
{
row = p.x+(spokes[i].x*k);
col = p.y+(spokes[i].y*k);
for(int j=0;j<4;j++)
{
row -= spokes[i].y;
col -= spokes[i].x;
if(row>0 && col>0 && col<field.length-1 && row<field.length-1)
{
Point tmpPoint = new Point(row,col);
if(field[row][col] == V)
makeMove(participent,tmpPoint);
if(field[row][col] == participent)
{
// System.out.println("...");
if (row == 1 || row == field.length-1)
{
points *= 4;
// System.out.println("(In Board Class) Point Is Next The Row Border.");
}
if(col == 1 || col == field.length-1)
{
points *= 4;
// System.out.println("(In Board Class) Point Is Next The Col Border.");
}
points += 2;
}
else
if(field[row][col] == opposite(participent) || field[row][col] == B)
{
points = 1;
}
if(field[row][col] != V)
unMakeMove(tmpPoint);
}
else
{
points = 1;
break loop2;
}
if(points > maxPoints)
{
maxPoints = points;
}
}
}
}
return maxPoints;
}

ארכיון

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

דיונים חדשים