הטלת קוביות ב-c# - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


raiman1

Recommended Posts

שלום לכולם!

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

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 בכל קוביה.

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

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

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

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

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

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

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

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

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

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

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

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

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

זה נובע מאופן הפעולה של האובייקט 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);

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

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

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

ארכיון

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

×
  • צור חדש...