PDA

View Full Version : تغییر موقعیت دکمه ها به صورت رندوم



mohammad2407
پنج شنبه 17 اردیبهشت 1394, 20:35 عصر
سلام دوستان من یک ماشین حساب دارم میخوام وقتی برنامه باز میشه موقعیت دکمه ها تغییر کنه

بهترین مثال کیبورد امنیتی بانک ها هنگام پرداخت آنلاین میباشد که با هر بار باز شدن صفحه موقعیت دکمه ها تغییر میکنه

https://epayment.bmi.ir/MoneyTransfer



من میخوام دکمه های ماشین حساب اون هم فقط عدد ها جا به جا بشن

130987

Mahmoud Zaad
پنج شنبه 17 اردیبهشت 1394, 21:03 عصر
سلام
علی الحساب، به نظر من باید تکست دکمه ها رو به صورت رندم تغییر بدید و موقع محاسبه هم خاصیت تکست دکمه رو بخونید و ازش استفاده کنید. روی این موضوع فکر کنید تا ببینیم چه راه حلی واسش پیدا میشه.

mohammad2407
پنج شنبه 17 اردیبهشت 1394, 22:42 عصر
به نظر شما اگر موقعیت عوض بشه بهتر نیست یعنی راحت تر نیست ؟

چون اگر قرار باشه تکس دکمه ها عوض بشه کد های زیادی باید عوض و جا به جا بشن

button1.Location = new Point(52, 198);

ghasem110deh
پنج شنبه 17 اردیبهشت 1394, 23:00 عصر
سلام
یه کلاس درست کنید و این کدها رو قرار بدین :

public void moveCtrl(Control Control1, Control Control2) {
int xC1 = Control1.Location.X;
int yC1 = Control1.Location.Y;
int xC2 = Control2.Location.X;
int yC2 = Control2.Location.Y;
Control1.Location = new System.Drawing.Point(xC2, yC2);
Control2.Location = new System.Drawing.Point(xC1, yC1);
}

قراره جای باتون ها با هر بار لود شدن فرم عوض بشه (با باتون هایی که بعدا معرفی می کنید)

و توی رویداد لود_فرم :

Button[] c = {button1, button2, button3, button4, button5}; Random rn = new Random();
int rnd = rn.Next(0, c.Length);
xc.moveCtrl(button1, c[rnd]);


خط اول میگه که کدوم دکمه ها باید جا بجا بشن ...
و تو خط آخر میگه کدوم با بقیه جابجا بشه ! که می تونی تعدادش رو مث خط اول بیشتر از یه باتون کنی (تو این حالت فقط باتون1 جاش با یکی از اون چند تا عوض میشه)
البته کدها رو بعد از فراخوانی کلاس کدهای بالا رو بنویسید ... مثل فراخوانی یه فرم :

Class1 c1 = new Class1

Mahmoud Zaad
جمعه 18 اردیبهشت 1394, 09:57 صبح
خب، اول یه کلاس داریم که یه Extension هست برای List ، این یه الگوریتم نامرتب سازی (http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle) (shuffle به طور عامیانه میشه بُر زدن که توی ورق بازی استفاده میشه) یک مجموعه هست. پس کدهای زیر رو توی یه کلاس یا آخر کدهای فرمتون بنویسید:

static class MyExtensions
{
public static void Shuffle<T>(this IList<T> list)
{
Random rng = new Random();
int n = list.Count;
while (n > 1)
{
n--;
int k = rng.Next(n + 1);
T value = list[k];
list[k] = list[n];
list[n] = value;
}
}
}

بعد ده تا دکمه برای اعداد 0 تا 9 روی فرم قرار بدید و Name اونها رو از btn0 تا btn9 قرار بدید و در آخر در لود فرم یا در یک دکمه کدهای زیر رو بنویسید:
List<Button> lst = new List<Button>();
lst.Add(btn0);
lst.Add(btn1);
lst.Add(btn2);
lst.Add(btn3);
lst.Add(btn4);
lst.Add(btn5);
lst.Add(btn6);
lst.Add(btn7);
lst.Add(btn8);
lst.Add(btn9);

lst.Shuffle();



int _number = 0;
foreach (Button btn in lst)
{
btn.Text = _number.ToString();
_number++;
}

روش کار هم به این صورته که اول دکمه ها رو در یک لیست قرار میدیم بعد لیست رو به هم می زنیم تا ترتیبش از دست بره بعد اعداد 0 تا 9 رو به لیست به هم ریخته اختصاص میدیم. حالا می تونید از خاصیت Text باتن ها استفاده کنید.

mohammad2407
جمعه 18 اردیبهشت 1394, 11:20 صبح
الان کد شما کاملا درست عمل میکنه خیلی هم عالی هست ولی فقط Text دکمه ها رو تغییر میده

مثلا الان وقتی روی دکمه 3 کلیک میکنم 6 میزنه من نمیخوام کد های اصلی من بهم بخوره

Mahmoud Zaad
جمعه 18 اردیبهشت 1394, 12:40 عصر
شما مثلاً برای دکمه 3 چه کدی نوشتید؟

mohammad2407
جمعه 18 اردیبهشت 1394, 13:02 عصر
شما مثلاً برای دکمه 3 چه کدی نوشتید؟


textBox1.Text += "3";

Mahmoud Zaad
جمعه 18 اردیبهشت 1394, 13:12 عصر
textBox1.Text += "3";
خب عرض کردم شما به جای اون "3" بنویسید btn3.Text برای بقیه دکمه ها هم همین کار رو بکنید. به جای "0" در دکمه 0 بنویسید btn0.Text و ...

mohammad2407
جمعه 18 اردیبهشت 1394, 13:17 عصر
ایول دمت گرم


:بوس:




لطف کردی

RmeXXXXXXXXX
شنبه 19 اردیبهشت 1394, 17:38 عصر
میشه یه آرایه 10 عنصری از نوع اینت داشت و مقادیر تصادفی 0 تا 9 را دورنش گذاشت! حالا خونه صفرم (که یک عددیست از 0 تا 9 )را به دکمه صفر انتساب بدین! بقیه هم بهمین ترتیب...