לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

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



  #1  
ישן 18-03-2007, 22:00
  vampire14 vampire14 אינו מחובר  
 
חבר מתאריך: 23.09.06
הודעות: 38
עזרה בתכנות משחק דמקה בc#

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

האובייקט:

using System;

using System.Collections.Generic;

using System.Text;



publicclassPaun

{

privateint yloc;

privateint xloc;

privatebool team;

privatebool alive;

public Paun()

{

}

public Paun(int xloc,int yloc,bool team,bool alive)

{

this.xloc = xloc;

this.yloc = yloc;

this.team = team;

this.alive = alive;

}

publicint Getxloc()

{

return xloc;

}

publicint Getyloc()

{

return yloc;

}

publicbool Getteam()

{

return team;

}

publicbool Getalive()

{

return alive;

}

publicvoid Setalive(bool alive)

{

this.alive = alive;

}

publicvoid Setteam(bool team)

{

this.team = team;

}

publicvoid MoveRight() /*true=black*/

{

if (team)

{

yloc++;

xloc++;

}

else

{

xloc--;

yloc++;

}

}

publicvoid MoveLeft()/*true=black*/

{

if (team)

{

yloc--;

xloc++;

}

else

{

xloc--;

yloc--;

}

}

publicvoid EatRight()/*true=black*/

{

if (team)

{

yloc+=2;

xloc+=2;

}

else

{

xloc-=2;

yloc+=2;

}

}

publicvoid EatLeft()/*true=black*/

{

if (team)

{

yloc-=2;

xloc+=2;

}

else

{

xloc-=2;

yloc-=2;

}

}

}


המפעיל:

using System;

using System.Collections.Generic;

using System.Text;



classProgram

{

staticvoid Apes(Paun[,] a)

{

for (int i = 0; i < 8; i++)

{

for (int j = 0; j < 8; j++)

{

a[i, j] =
newPaun(i, j, true, false);

}

}

}

staticvoid SetBoard(Paun[,] a)

{

bool bla = true;

for (int i = 0; i < 3; i++)

{

for (int j = 0; j < 8; j = j + 2)

{

if (bla)

{

a[i, j].Setalive(
true);





}

else

{

a[i, j + 1].Setalive(
true);



}

}

if (bla)

bla =
false;

else

bla = true;



}

for (int i = 7; i > 4; i--)

{

for (int j = 1; j < 8; j = j + 2)

{

if (bla)

{

a[i, j - 1].Setalive(
true);

a[i, j - 1].Setteam(
false);





}

else

{

a[i, j].Setalive(
true);

a[i, j].Setteam(
false);

}

}

if (bla)

bla =
false;

else

bla = true;

}

}

staticvoid Print(Paun[,] a)

{

for (int i = 0; i < 8; i++)

{

for (int j = 0; j < 8; j++)

{

if (a[i, j].Getalive() && a[i, j].Getteam())

Console.Write("b");

else

if (a[i, j].Getalive() && (!(a[i, j].Getteam())))

Console.Write("w");

else

if ((i + j) % 2 == 0)

Console.Write("*");

else

Console.Write("0");

}

Console.WriteLine("");

}

}

staticvoid Main(string[] args)

{

Paun[,] board = newPaun[8, 8];









Apes(board);

SetBoard(board);

Print(board);







int countblack = 0, countwhite=0;

for (int i = 0; i < 8; i++)

{

for (int j = 0; j < 8; j++)

{

if ((board[i, j].Getalive()) && (board[i, j].Getteam()))

countblack++;

if ((board[i, j].Getalive()) && (!(board[i, j].Getteam())))

countwhite++;

}

}

int x=0,y=0;

bool flipflop = false;

string move = "bla";

while (countblack > 0 && countwhite > 0)

{

if (!(flipflop))

{

Console.WriteLine("insert yloc of the paun you want");

y =
int.Parse(Console.ReadLine());

Console.WriteLine("insert xloc of the paun you want");

x =
int.Parse(Console.ReadLine());



{

if ((board[y, x].Getalive() == !flipflop) && (board[y, x].Getteam() == flipflop))

Console.WriteLine("insert move(moveleft,moveright,eatleft,eatright)");

move =
Console.ReadLine();

if (move == "moveleft")

{

board[y, x].Setalive(
false);

board[y--, x--].Setalive(
true);

board[y--, x--].Setteam(
false);

Print(board);



}

}









}

}















}

}



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

ככה נראה הלוח במצב ההתחלתי כש
b=black
w=white
0=spot where you cant go
*=a place where you can go





תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

נערך לאחרונה ע"י vampire14 בתאריך 18-03-2007 בשעה 22:08.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #4  
ישן 19-03-2007, 15:47
  JamBurry JamBurry אינו מחובר  
 
חבר מתאריך: 21.01.07
הודעות: 58
בתגובה להודעה מספר 2 שנכתבה על ידי vampire14 שמתחילה ב "אני ידוע שלא אמורים להקפיץ..."

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

תסתכל על הקוד הזה:

קוד:
board[y, x].Setalive(false); board[y--, x--].Setalive(true); board[y--, x--].Setteam(false);


בוא ניקח את החייל במיקום (5,1) (החייל הלבן השמאלי ביותר שיכול לזוז) והפקודה MOVELEFT. התוצאה הרצוייה - (5,1) יכבה ו-(4,0) ידלק.

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

קוד:
board[--y, --x].Setalive(true);

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

קוד:
board[y, x].Setalive(true);


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

1. המילה האנגלית היא PAWN ולא PAUN. בכל מקרה, הכוונה פה היא לחייל שח ולא לחייל בדמקה שנקרא CHECKER. (וכן, אתה מוזמן להוריד לי כיסא בראש... )
2. מערכת הצירים שלך מאוד מבלבלת - האם (0,0) היא בצד שמאל למטה או בצד שמאל למעלה?
3. השימוש ב-setteam גם הוא מבלבל. עדיף להגדיר enum עם צבע:

קוד:
public enum CheckerColor { White, Black, }


ואז הקריאה תהיה

קוד:
checker.SetTeam(CheckerColor.White)


4. במקום מתודות של GetXXX או SetXXX עדיף להשתמש ב-properties:

קוד:
public CheckerColor Color { get { return this.color; } set { this.color = value; } }


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

JAM
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #6  
ישן 19-03-2007, 15:35
  vampire14 vampire14 אינו מחובר  
 
חבר מתאריך: 23.09.06
הודעות: 38
בתגובה להודעה מספר 1 שנכתבה על ידי vampire14 שמתחילה ב "עזרה בתכנות משחק דמקה בc#"

או קיי אני ראיתי שעושים את זה פשוט לא ידעתי איך שניה
הנה התוכנה המפעילה
קוד:
using System; using System.Collections.Generic; using System.Text; classProgram { staticvoid Apes(Paun[,] a) { for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { a[i, j] = newPaun(i, j, true, false); } } } staticvoid SetBoard(Paun[,] a) { bool bla = true; for (int i = 0; i < 3; i++) { for (int j = 0; j < 8; j = j + 2) { if (bla) { a[i, j].Setalive(true); } else { a[i, j + 1].Setalive(true); } } if (bla) bla = false; else bla = true; } for (int i = 7; i > 4; i--) { for (int j = 1; j < 8; j = j + 2) { if (bla) { a[i, j - 1].Setalive(true); a[i, j - 1].Setteam(false); } else { a[i, j].Setalive(true); a[i, j].Setteam(false); } } if (bla) bla = false; else bla = true; } } staticvoid Print(Paun[,] a) { for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { if (a[i, j].Getalive() && a[i, j].Getteam()) Console.Write("b"); else if (a[i, j].Getalive() && (!(a[i, j].Getteam()))) Console.Write("w"); else if ((i + j) % 2 == 0) Console.Write("*"); else Console.Write("0"); } Console.WriteLine(""); } } staticvoid Main(string[] args) { Paun[,] board = newPaun[8, 8]; Apes(board); SetBoard(board); Print(board); int countblack = 0, countwhite=0; for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { if ((board[i, j].Getalive()) && (board[i, j].Getteam())) countblack++; if ((board[i, j].Getalive()) && (!(board[i, j].Getteam()))) countwhite++; } } int x=0,y=0; bool flipflop = false; string move = "bla"; while (countblack > 0 && countwhite > 0) { if (!(flipflop)) { Console.WriteLine("insert yloc of the paun you want"); y = int.Parse(Console.ReadLine()); Console.WriteLine("insert xloc of the paun you want"); x = int.Parse(Console.ReadLine()); { if ((board[y, x].Getalive() == !flipflop) && (board[y, x].Getteam() == flipflop)) Console.WriteLine("insert move(moveleft,moveright,eatleft,eatright)"); move = Console.ReadLine(); if (move == "moveleft") { board[y, x].Setalive(false); board[y--, x--].Setalive(true); board[y--, x--].Setteam(false); Print(board); } } } } } }

והנה האובייקט
קוד:
using System; using System.Collections.Generic; using System.Text; publicclassPaun { privateint yloc; privateint xloc; privatebool team; privatebool alive; public Paun() { } public Paun(int xloc,int yloc,bool team,bool alive) { this.xloc = xloc; this.yloc = yloc; this.team = team; this.alive = alive; } publicint Getxloc() { return xloc; } publicint Getyloc() { return yloc; } publicbool Getteam() { return team; } publicbool Getalive() { return alive; } publicvoid Setalive(bool alive) { this.alive = alive; } publicvoid Setteam(bool team) { this.team = team; } publicvoid MoveRight() /*true=black*/ { if (team) { yloc++; xloc++; } else { xloc--; yloc++; } } publicPaun[,] MoveLeft(Paun[,] a)/*true=black*/ { if (team) { yloc--; xloc++; } else { xloc--; yloc--; } } publicvoid EatRight()/*true=black*/ { if (team) { yloc+=2; xloc+=2; } else { xloc-=2; yloc+=2; } } publicvoid EatLeft()/*true=black*/ { if (team) { yloc-=2; xloc+=2; } else { xloc-=2; yloc-=2; } } }

זה לא קולט את ההזחות אבל אולי אם תעתיקו את זה לvisual studio זה יעשה את זה אוטומטי.. תודה שהפנית את תשומת לבי ואני מקווה שעכשיו תוכל לעבור עליו.. אבל אני באמת חושב שיהיה לך יותר קל פשוט להעביר אותו לויזואל ולעשות בו ניסויים כי הקוד לשי ממש לא מסודר
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #8  
ישן 19-03-2007, 16:34
  JamBurry JamBurry אינו מחובר  
 
חבר מתאריך: 21.01.07
הודעות: 58
בתגובה להודעה מספר 7 שנכתבה על ידי vampire14 שמתחילה ב "עכשיו שעזרו לי עם התזוזה האם..."

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


קוד:
bool isKing = board[y,x].IsKing; board[y, x].Setalive(false); board[y, x].SetKing(false); board[--y, --x].Setalive(true); board[y, x].Setteam(false); board[y,x].SetKing(isKing);


שים לב לזה שהחיסור מתבצע פעם אחת בלבד - אם הייתה פעם שנייה (כמו בדוגמא למעלה), אז זה לא
היה עובד.
בכל מקרה, נקודה חשובה - יש לך קבוצה שלמה של מאפיינים שמתחילים 'לטייל' להם בין אובייקטים שונים. במקום לכתוב 20 מתודות שונות של
setXXX
יהיה הרבה יותר נוח להגדיר מחלקה נפרדת לייצוג המאפיינים של האובייקט (מה שנקרא STATE)
ואז להעביר מופע של המחלקה הזו בין האובייקטים:

קוד:
CheckerState cs = board[y,x].State; board[y,x].Reset(); // reset the state of the checker to 'dead' board[--y, --x].State = cs;


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

HTH
JAM
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #10  
ישן 19-03-2007, 19:34
  JamBurry JamBurry אינו מחובר  
 
חבר מתאריך: 21.01.07
הודעות: 58
בתגובה להודעה מספר 9 שנכתבה על ידי vampire14 שמתחילה ב "איך אני יכול לרכז את כל..."

יש לך מחלקה אחת שקראת לה Paun. בתוכה יש מאפיינים (fields) בשם team, alive וכו'. יש לך גם GetXXX ו - SetXXX לכל אחד מהם. במקום, אתה יכול לעשות דבר כזה:

קוד:
public class Paun { ... private CheckerState state; public CheckerState GetState() { return this.state; } public void SetState(CheckerState newState) { this.state = newState; } ... }


עכשיו נגדיר את CheckerState:
קוד:
public class CheckerState { private bool isAlive; private CheckerColor color; // use CheckerColor enum private bool isKing; ... public bool GetIsAlive() { return this.isAlive; } public void SetIsAlive(bool isNowAlive) { this.isAlive = isNowAlive; } ... public void Reset() { this.isAlive = false; this.isKing = false; ... } }


כדי לגשת לכל אחד מהמאפיינים תכתוב דבר כזה:

קוד:
bool isAlive = board[y, x].GetState().GetIsAlive();

תוכל גם להגדיר GetIsAlive על Paun שניגש ישירות ל-.this.state

היתרונות של זה:
1. אתה יכול להוסיף כמה מאפיינים שאתה רוצה ל-CheckerState בלי לשנות את Paun.
2. כדי להעביר את כל המאפיינים מ-Paun אחד לשני (ולאפס את ה-Paun הראשון) תעשה:

קוד:
Paun p1, p2; ... p1.SetState(p2.GetState()); // Transfer all state from p2 to p1 p2.GetState().Reset; // Reset the state of p2

הרבה יותר קצר וקריא.

כמו שכבר אמרתי קודם, אני הייתי עושה את זה עם Properties ולא Getter/Setter.

(ואגב, משהו קטן - זה את, לא אתה...)

JAM
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

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

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 13:27

הדף נוצר ב 0.09 שניות עם 12 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר