עבור לתוכן

הטלת קוביות ב-c#

Featured Replies

פורסם

שלום לכולם!

יש לי בעיה באיזה תרגיל של הטלת קוביות. בתרגיל אני צריך ליצור את המחלקה קוביה:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Dei
{
private int num;
public Dei()
{
this.num = 1;
}
public void Roll()
{
Random rnd = new Random();
this.num = rnd.Next(1, 7);
}
public int GetNum()
{
return this.num;
}

}
}

בנוסף אני צריך לכתוב תוכנית שיוצרת שתי קוביות ובכל תור זורקת את שתי הקוביות עד שיוצא דאבל 6. בנוסף בכל תור היא רושמת את המספרים שיצאו. הבעיה שלי זה שיוא לי רק דאבלים ולא מספרים כמו 4,6 1,2 וכו'. מישהו יכול לומר לי איפה הבעיה??

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class DiceGame
{
static void Main(string[] args)
{
Dei a = new Dei();
Dei b = new Dei();
int z=0;
while ((a.GetNum() + b.GetNum()) < 12)
{
a.Roll();
b.Roll();
z++;
Console.WriteLine("{0},{1}", a.GetNum(), b.GetNum());
}
Console.WriteLine(z);


}
}
}

תודה מראש :xyxthumbs:

פורסם

אל תיצור אובייקט Random חדש בכל הטלת קובייה. צור רק אחד כזה ותשתמש בו שוב ושוב.

פורסם
  • מחבר

ככה? כי אם כן אז יוצאים רק דאבלים...

class Dei
{
private int num;
public Dei()
{
this.num = 1;
}
Random rnd = new Random();
public void Roll()
{
this.num = rnd.Next(1, 7);
}
public int GetNum()
{
return this.num;
}

}

פורסם

אתה עדיין לא יוצר רק אחד - יש לך אובייקט Random בכל קוביה.

אתה צריך שיהיה רק אחד (רמז: static).

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

נ.ב.2. זה אמור להיות "Die", לא "Dei" :P

פורסם
  • מחבר

גם כשקראתי את ההסברים לא כ"כ הבנתי את העניין הזה עם STATIC...

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

אבל לא הבנתי מתי אני אמור להשתמש בתכונות ופעולות של מופע ומתי בשל מחלקה(static)/

נ.ב עשיתי את זה וזה עבד

פורסם

איבר (member) רגיל של אובייקט נקרא "משתנה מופע" (instance variable). זה אומר שכל מופע של המחלקה (כלומר, כל אובייקט מהטיפוס של המחלקה) מחזיק איבר כזה משלו. אם יש מחלקה עם איבר בשם x אז ה-x הזה הוא נפרד לכל מופע של המחלקה.

איבר סטטי (static member) נקרא גם "משתנה מחלקה" (class variable). זה אומר שהמשתנה הזה שייך למחלקה ולא למופעים שלה. כלומר, יש רק אחד כזה עבור כל המחלקה, במקום אחד עבור כל מופע.

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

פורסם
  • מחבר

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

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

פורסם

זה נובע מאופן הפעולה של האובייקט Random.

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

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

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

אתה יכול לנסות את זה בעצמך. תריץ את הקוד הבא (ב-Main אחר, בלי קשר לתכנית שלך):

Random rnd1 = new Random();
Random rnd2 = new Random();

for (int i = 0 ; i < 10 ; i++)
{
System.Console.WriteLine("rnd1: {0}, rnd2: {1}", rnd1.Next(), rnd2.Next());
}

שני הרנדומים אמורים ליצור את אותה סדרה.

ועכשיו, תוסיף את השורה הבאה בין שתי השורות הראשונות (כלומר בין השורה שיוצרת את rnd1 והשורה שיוצרת את rnd2), ותריץ את הקוד שוב:

System.Threading.Thread.Sleep(100);

(השורה הזו גורמת לכך שהתכנית תעצור למשך עשירית שנייה, כדי שנהיה בטוחים שהשעון יתעדכן)

עכשיו שני הרנדומים אמורים ליצור סדרות שונות.

פורסם
  • מחבר

אז איך הפיכת האובביקט random לסטטי פותרת את הבעיה הזאת?

פורסם

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

פורסם
  • מחבר

אוקי הבנתי. :yelclap:

שוב, תודה רבה על העזרה :xyxthumbs: :xyxthumbs: :xyxthumbs:

ארכיון

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

דיונים חדשים