Рефераты. Генерирование псевдослучайных чисел на примере создания игры "Сапер"

Полем называется член-переменная, содержащий некоторое значение. В ООП поля иногда называют данными объекта.

Для классов

public partial class Form1 : Form

public partial class Form2 : Form

полями являются следующие переменные:

private int

MR,//кол-во клеток по вертикали

MC,//кол-во клеток по горизонтали

NM,//кол-во мин

W,//ширина клетки поля

H;//высота клетки поля

private int

nMin,//кол-во найденных мин

nFlag;//кол-во поставленных флагов

private int status;/*отражает различные этапы работы программы:

0-начало игры,

1-игра,

2-конец игры*/

private int[,] Pole;/*элемент массива задает клетку поля и принимает значения

0-8 -кол-во мин в соседних клетках,

9 -в клетке мина,

100-109 -клетка открыта,

200-209 -в клетку поставлен флаг*/

Следует отметить, что переменная Pole хранит в себе ссылку на двумерный массив. Массивы в C# разделяются на два типа: одномерные и многомерные.

Элементы многомерных массивов идентифицируются набором индексов - "координат" в многомерном пространстве. Каждое измерение имеет свою размерность, не зависящую от других.

Инициализация

Pole = new int[MR + 2, MC + 2];

происходит в методе

private void newGame(int r)

{

}

который будет рассмотрен далее.

Доступ к элементам производится с помощью оператора [ ], в котором индексы указываются через запятую. Присвоение значений элементам присваивается в методе:

private void newGame(int r)

{

…………

/*неотражаемым элементам массива минного поля присваиваем

значение -3 для завершения процесса открытия клеток*/

for (row = 0; row <= MR + 1; row++)

{

Pole[row, 0] = -3;

Pole[row, MC + 1] = -3;

}

for (col = 0; col <= MC + 1; col++)

{

Pole[0, col] = -3;

Pole[MR + 1, col] = -3;

}

//обнуление элементов массива минного поля

for (row = 1; row <= MR; row++)

{

for (col = 1; col <= MC; col++)

{

Pole[row, col] = 0;

}

}

………

}

а также в других методах.

Методы

Методом называется реальный код, воздействующий на данные объекта (или поля). При объявлении методов используется конструкция вида:

<модиф_дост><тип_возвр_знач><идент_метода>(<формальн_парам>opt)

{

<тело_метода>

}

Метод в процессе своей работы может не только изменять поля объекта, но и вычислять некоторые дополнительные значения. Если возвращать значения не нужно, то в качестве типа возвращаемого значения указывается void.

Методы, используемые в разработанном приложении и обеспечивающие процесс игры:

private void newGame(int r)//метод, запускающий новую игру

{

…………

//выбор метода расстановки мин

int random = r;

if (random == 1)

{

this.Rand();//вызов метода Rand()

}

if (random == 2)

{

this.Lin();//вызов метода Lin()

}

if (random == 3)

{

this.BBS();//вызов метода BBS()

}

……………

}

//способы расстановки мин

private void Rand()//метод, основанный на использовании класса Random

{

int n = 0;//кол-во поставленных мин

int row, col;

Random rnd = new Random();//генеретор случайных чисел

//расстановка мин

do

{

row = rnd.Next(MR) + 1;

col = rnd.Next(MC) + 1;

if (Pole[row, col] != 9)

{

Pole[row, col] = 9;

n++;

}

}

while (n != NM);

}

private void Lin()//метод, основанный на использовании линейного

конгруэнтного метода

{

int n = 0;

int row, col;

double a = Convert.ToInt64(Math.Exp((double)5 * Math.Log(7))),

m = Convert.ToInt64(Math.Exp((double)31 * Math.Log(2))) - 1;

int x = 27011989, c = 19;

//расстановка мин

do

{

//для нахождения пвевдослучайного числа Х используется

формула x(k+1)=(a * x(k) + c) mod m

x = (int)((a * x + c) % m);

//находится пвевдослучайный индекс клетки на [0,MR]

row =Convert.ToInt32( Math.Ceiling((double) MR * x / (m-1)));

x = (int)((a * x + c) % m);

//находится пвевдослучайный индекс клетки на [0,MС]

col = Convert.ToInt32(Math.Ceiling((double)MC * x / (m-1)));

if (Pole[row, col] != 9)

{

Pole[row, col] = 9;

n++;

}

}

while (n != NM);

}

private void BBS()//метод, основанный на использовании алгоритма Блюма, Блюма

и Шуба

{

int n = 0;

int row, col;

int x = 2701;

int p=2047,q=8191;

int M = p * q;

//расстановка мин

do

{

//для нахождения пвевдослучайного числа Х используется

формула x(k+1)=(x(k)^2) mod m

x = Math.Abs((int)((x * x) % M));

//находится пвевдослучайный индекс клетки на [0,MR]

row = Convert.ToInt32(Math.Ceiling((double)MR * x / (M-1)));

x = Math.Abs((int)((x * x) % M));

//находится пвевдослучайный индекс клетки на [0,MС]

col = Convert.ToInt32(Math.Ceiling((double)MC * x / (M-1)));

if (Pole[row, col] != 9)

{

Pole[row, col] = 9;

n++;

}

}

while (n != NM);

}

private void showPole(Graphics g, int status)//метод,отрисовывающий поле

{

for (int row = 1; row <= MR; row++)

{

for (int col = 1; col <= MC; col++)

{

this.kletka(g, row, col, status);//вызов метода kletka()

}

}

}

private void kletka(Graphics g, int row, int col, int status)

//метод,выводящий содержимое клетки

{

…………

// в клетке флаг

if (Pole[row, col] >= 200)

this.flag(g, x, y);

//отрисовываем границы клетки

g.DrawRectangle(Pens.Black, x - 1, y - 1, x + W, y + H);

// если игра завершена (status=2),показываем мины

if ((status == 2) && ((Pole[row, col] % 10) == 9))

this.mina(g, x, y);

…………

}

private void open(int row, int col)//метод,открывающий текущую и все соседние

клетки, в которых нет мин

{

…………

//рекурсивный процесс открытия всей пустых соседих клеток

if (Pole[row, col] == 0)

{

Pole[row, col] = 100;

//отобразить содержимое клетки

Страницы: 1, 2, 3, 4, 5



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.