רברסי בפרולוג - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

רברסי בפרולוג


Dano

Recommended Posts

שוב אני, קצת התקדמתי בתוכנה,

עכשיו רציתי לשאול אם למישהו יש רעיון איך לעשות את הפעולה של מציאת מהלכים אפשריים,

בעצם הלוח משחק שלי זה רשימה של 8 רשימות.

כל רשימה פנימית היא שורה, וכל איבר בה זה תא במשחק (1-מטבע של מחשב, -1-מטבע של שחקן, 0-ריק),

קצת הסתבכתי בלמצוא מהלך אפשרי, משהו עם מצא_כל...

תודה! :xyxthumbs:

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

פשוט תעבור על כל הרשימות ובכל תא שיש בו ערך 0 (מקסימום 64 תאים) תשים ערך מתאים (1, 1-) ותשלח את זה לפונקציה שמבצעת הערכת לוח בצורה רקורסיבית (גם רצוי לחשוב מראש על הגבלת עומק הרקורסיה...).

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

פשוט תעבור על כל הרשימות ובכל תא שיש בו ערך 0 (מקסימום 64 תאים) תשים ערך מתאים (1, 1-) ותשלח את זה לפונקציה שמבצעת הערכת לוח בצורה רקורסיבית (גם רצוי לחשוב מראש על הגבלת עומק הרקורסיה...).

פרולוג לא עובד ככה, (עד כמה שאני זוכר...)

אלה עצות כלליות:

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

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

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

פרולוג לא עובד ככה, (עד כמה שאני זוכר...)

אלה עצות כלליות:

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

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

אוקי אז באמת זה שילוב של שניכם,

בניתי רשימה בעזרת מצא_כל של כל המקומות (X,Y) שיש בהם ערך 0 כלומר הם ריקים, ונמצא ערך - 1 באיזשהו כיוון לידם (שורה, טור ואלכסון) , כלומר השחקן השני,

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

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

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

מקווה שמישהו הבין, בשפות אחרות זה היה כל כך קל יותר!

ולזה שמעליי, אני שואל את אותה השאלה :silly:

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

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

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

וזהו. לא צריך להיות מסובך :cool2: (תשים לב שאם אתה באמצע הלוח אז אתה צריך לבדוק את הרשימה מהאמצע, ולכל כיוון).

אה, ועוד דבר - פרולוג שפה אלגנטית וחזקה מאוד שגם היום בשימוש אמיתי בתעשייה. אני יכול להבטיח שכל מי שכותב בפרולוג למחייתו (ונכון שאין הרבה כאלה) בד"כ עושה דברים הרבה יותר מעניינים ומיוחדים מכל מי שכותב בג'אווה, # C, C, ו- ++C (לא שאני מזלזל חלילה...).

אז בהצלחה!

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

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

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

וזהו. לא צריך להיות מסובך :cool2: (תשים לב שאם אתה באמצע הלוח אז אתה צריך לבדוק את הרשימה מהאמצע, ולכל כיוון).

אה, ועוד דבר - פרולוג שפה אלגנטית וחזקה מאוד שגם היום בשימוש אמיתי בתעשייה. אני יכול להבטיח שכל מי שכותב בפרולוג למחייתו (ונכון שאין הרבה כאלה) בד"כ עושה דברים הרבה יותר מעניינים ומיוחדים מכל מי שכותב בג'אווה, # C, C, ו- ++C (לא שאני מזלזל חלילה...).

אז בהצלחה!

אוקי דבר ראשון תודה על העזרה,

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

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

מאוד פשוט:

נניח ועכשיו אתה בודק את אחת הרשימות (אלכסון, אורך או רוחב). בעצם יש לך רשימה של 8 ערכים, והמשתנה שלך הוא (נניח) הרביעי. אז בעצם הרשימה היא משהו כמו [A,B,C,0,E,F,G,H]. תחלק את הרשימה לשניים: A,B,C ורשימה שניה E,F,G,H. את הרשימה A,B,C תהפוך בסדר שלה להיות C,B,A ועכשיו תסרוק איבר איבר ברשימה ותראה שהוא או בצבע נגדי לשלך (ואז אתה ממשיך לאיבר הבא) או בצבע שלך (ואז אתה מפסיק).

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

וזהו.

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

מאוד פשוט:

נניח ועכשיו אתה בודק את אחת הרשימות (אלכסון, אורך או רוחב). בעצם יש לך רשימה של 8 ערכים, והמשתנה שלך הוא (נניח) הרביעי. אז בעצם הרשימה היא משהו כמו [A,B,C,0,E,F,G,H]. תחלק את הרשימה לשניים: A,B,C ורשימה שניה E,F,G,H. את הרשימה A,B,C תהפוך בסדר שלה להיות C,B,A ועכשיו תסרוק איבר איבר ברשימה ותראה שהוא או בצבע נגדי לשלך (ואז אתה ממשיך לאיבר הבא) או בצבע שלך (ואז אתה מפסיק).

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

וזהו.

אוקי אני חושב שהבנתי...אני אעשה את זה בעזרת רקורסיה,

עכשיו כמה שאלות קצת לא קשורות:

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

ב. באלכסונים, אז אני מנסה לעשות שיבנה רשימה של מקומות נגיד אם למעלה שמאלה באלכסון אז המיקום יהיה X+H, Y+H וזה לא ממש מסכים כי הוא לא יודע מזה H... מה לעשות?

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

א. אין בעיה לעשות חוק אחד שיהיה (diag(A,B וחוק שני (col(A,B - אין קשר בין המשתנים של פרדיקט אחד לשני.

ב. צריך להשתמש באופרטור is בשביל לעשות את החיבור (ואם עושים את זה בצורה רקורסיבית כל מה שצריך לעשות זה להוסיף או לחסר 1 - תלוי במימוש).

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

א. אין בעיה לעשות חוק אחד שיהיה (diag(A,B וחוק שני (col(A,B - אין קשר בין המשתנים של פרדיקט אחד לשני.

ב. צריך להשתמש באופרטור is בשביל לעשות את החיבור (ואם עושים את זה בצורה רקורסיבית כל מה שצריך לעשות זה להוסיף או לחסר 1 - תלוי במימוש).

מה לא טוב פה? כדי להשיג את האלכסון למטה ימינה של מיקום(_א,_ב).

דוגמא: המיקום הוא(4,3) אז ייתן כרשימה [(8,7),(7,6),(6,5),(5,4)]

מצא_כל(_מספר,( _ד הוא _א+X, _ג הוא _ב+X, מיקום_איבר(_ג,_שורה,_לוח),מיקום_איבר(_ד,_מספר,_שורה)),_רשימה).

_לוח זה הלוח שלי, _א זה המספר טור, _ב זה המספר שורה.

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

אני לא בטוח שהבנתי את הכוונה שלך (כל הסוגריים שם מבולבלים), אבל משהו חשוב ששמתי לב שלא הוספת זה שעבור (4,3) רשימת האלכסון שלך צריכה להיות הרשימה הבאה [(2,1),(3,2),(4,3),(5,4),(6,5),(7,6),(8,7)] (- בסדר הפוך, שוב העברית מחורבשת...)

חשוב לבדוק גם את האופציה "שמאחורייך". הדרך שאני הייתי עושה, זה מחלק את זה לשתי רשימות - עד (4,3) וממנו והלאה. עכשיו עוד משהו שהייתי עושה זה בכלל לא משתמש בגישת מערכים (כלומר לקחת את האיבר באינדקס X,Y) אלא משתמש ברקורסיה ולוקח כל פעם את האיבר הראשון ברשימה (אבל בשביל זה צריך ליצור תת לוח מתאים... 8). בעיני זה יותר "אלגנטי" ו"טבעי" לפרולוג ככה. אם בכל זאת אתה מתעקש על גישה ישירה פשוט תכתוב פרדיקט גישה אחד שמחזיר לך את האיבר במקום המתאים בהינתן לוח ומיקום, ותקרא לו מתוך פרדיקט שמשרשר את התוצאות וגם מעדכן את פרטי המיקום עבור הקריאה הבאה.

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

אני לא בטוח שהבנתי את הכוונה שלך (כל הסוגריים שם מבולבלים), אבל משהו חשוב ששמתי לב שלא הוספת זה שעבור (4,3) רשימת האלכסון שלך צריכה להיות הרשימה הבאה [(2,1),(3,2),(4,3),(5,4),(6,5),(7,6),(8,7)] (- בסדר הפוך, שוב העברית מחורבשת...)

חשוב לבדוק גם את האופציה "שמאחורייך". הדרך שאני הייתי עושה, זה מחלק את זה לשתי רשימות - עד (4,3) וממנו והלאה. עכשיו עוד משהו שהייתי עושה זה בכלל לא משתמש בגישת מערכים (כלומר לקחת את האיבר באינדקס X,Y) אלא משתמש ברקורסיה ולוקח כל פעם את האיבר הראשון ברשימה (אבל בשביל זה צריך ליצור תת לוח מתאים... 8). בעיני זה יותר "אלגנטי" ו"טבעי" לפרולוג ככה. אם בכל זאת אתה מתעקש על גישה ישירה פשוט תכתוב פרדיקט גישה אחד שמחזיר לך את האיבר במקום המתאים בהינתן לוח ומיקום, ותקרא לו מתוך פרדיקט שמשרשר את התוצאות וגם מעדכן את פרטי המיקום עבור הקריאה הבאה.

לא נראה לי הבנת מה שאני רוצה לעשות,

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

בכל מקרה, אני אסביר בכלל מה החוק שאני רוצה לעשות עושה,

אני מקבל לוח ומהלך(X,Y), אני רוצה לבדוק אם המהלך הוא חוקי,

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

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

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

diag(Mat,X,Y,[B|Bs]):-
X1 is X+1,
Y1 is Y+1,
nth(Y1,Mat,Line),
nth(X1,Line,B),
diag(Mat,X1,Y1,Bs).

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

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

ארכיון

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

×
  • צור חדש...