<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Статьи о программировании, все о программировании, исходники программ &#187; Visual Studio</title>
	<atom:link href="http://statprog.ru/tag/visual-studio/feed/" rel="self" type="application/rss+xml" />
	<link>http://statprog.ru</link>
	<description>Авторские статьи, исходники, программы.</description>
	<lastBuildDate>Thu, 12 Aug 2010 16:53:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Определить попадание точки в прямоугольник или эллипс на C#</title>
		<link>http://statprog.ru/2010/05/29/opredelit-popadanie-tochki-v-pryamougolnik-ili-ellips-na-c/</link>
		<comments>http://statprog.ru/2010/05/29/opredelit-popadanie-tochki-v-pryamougolnik-ili-ellips-na-c/#comments</comments>
		<pubDate>Sat, 29 May 2010 18:44:56 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[прямоугольник]]></category>
		<category><![CDATA[эллипс]]></category>

		<guid isPermaLink="false">http://statprog.ru/?p=453</guid>
		<description><![CDATA[Работая в Visual Studio в C# можно легко определить попала ли точка с координатами (X, Y) в область прямоугольника или эллипса. Определяется это даже без применения каких либо геометрических формул, все очень просто &#8211; с помощью стандартных средств Visual Studio. &#8230; <a href="http://statprog.ru/2010/05/29/opredelit-popadanie-tochki-v-pryamougolnik-ili-ellips-na-c/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Работая в Visual Studio в C# можно легко определить попала ли точка с координатами (X, Y) в область прямоугольника или эллипса. Определяется это даже без применения каких либо геометрических формул, все очень просто &#8211; с помощью стандартных средств Visual Studio.<span id="more-453"></span></p>
<p>Давайте посмотрим как же будем это определять.</p>
<pre class="brush: csharp;">//Сначала определим переменные с шириной и высотой прямоугольника и эллипса.
int RectangleWidth = 400;
int RectangleHeight = 200;
int EllipseWidth = 500;
int EllipseHeight = 450;

//Далее зададим им координаты размещения на форме.
int coordR_X = 200;
int coordR_Y = 200;
int coordE_X = 100;
int coordE_Y = 400;

//Создадим прямоугольник и эллипс.
Rectangle RectangleDraw = new Rectangle(coordR_X, coordR_Y, RectangleWidth, RectangleHeight);
Rectangle EllipseDraw = new Rectangle(coordE_X, coordE_Y, EllipseWidth, EllipseHeight);

//Создадим графическую область для прямоугольника и эллипса.
GraphicsPath GraphicsPathRectangle = new GraphicsPath();
GraphicsPath GraphicsPathEllipse = new GraphicsPath();

//Добавим в первую область созданный прямоугольник.
GraphicsPathRectangle.AddRectangle(RectangleDraw);

//Добавим во вторую область созданный эллипс.
GraphicsPathEllipse.AddEllipse(EllipseDraw);

//Создадим точку с координатами (100; 200).
Point PointUser = new Point(100, 200);</pre>
<p>Все, мы выполнили создание прямоугольника, эллипса и точки.<br />
Теперь давай проверим определим в какую область попала точка.<br />
С помощью объекта IsVisible можно это сделать.</p>
<pre class="brush: csharp;">
if (GraphicsPathEllipse.IsVisible(PointUser))
	MessageBox.Show(&quot;Попала в эллипс!&quot;);

if (GraphicsPathRectangle.IsVisible(PointUser))
	MessageBox.Show(&quot;Попала в прямоугольник!&quot;);
</pre>
]]></content:encoded>
			<wfw:commentRss>http://statprog.ru/2010/05/29/opredelit-popadanie-tochki-v-pryamougolnik-ili-ellips-na-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Пьяньчуга &#8211; Моделирование движения пьяного человека на C#</title>
		<link>http://statprog.ru/2010/01/28/pyanchuga-modelirovanie-dvizheniya-pyanogo-cheloveka-na-c/</link>
		<comments>http://statprog.ru/2010/01/28/pyanchuga-modelirovanie-dvizheniya-pyanogo-cheloveka-na-c/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 14:59:09 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[Моделирование]]></category>

		<guid isPermaLink="false">http://statprog.ru/?p=402</guid>
		<description><![CDATA[Надоели скучные и однообразные программы? Давайте немного пофантазируем и напишем программу, которая будет моделировать движение пьяного человека, и представим все это графически. Суть программы будет заключаться в следующем: Будем моделировать движение пьяного человека (он пьян до того, что не знает &#8230; <a href="http://statprog.ru/2010/01/28/pyanchuga-modelirovanie-dvizheniya-pyanogo-cheloveka-na-c/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Надоели скучные и однообразные программы? Давайте немного пофантазируем и напишем программу, которая будет моделировать движение пьяного человека, и представим все это графически.</p>
<p>Суть программы будет заключаться в следующем:</p>
<p>Будем моделировать движение пьяного человека (он пьян до того, что не знает что делает, но лежать ему не хочется). В начальный момент времени задается положение человека в некотором дворе с непроницаемыми стенками и одним выходом. Кроме того даются 5 вероятностей &#8211; остаться на месте и перемещаться в 4 стороны. Если появляется попытка переместиться через стенку, то «пьяньчуга» остается на месте. Сумма вероятностей строго равно 1. Если «пьяньчуга» нашел выход или попал в один из люков, то моделирование заканчивается и выводится соответствующее сообщение.<span id="more-402"></span></p>
<p>И так, в <strong>Visual Studio</strong> в <strong>C#</strong> создайте форму, и объекты как показано на рисунке «Рисунок 1.1». Соответственно, к каждому объекту подписано его имя.</p>
<p style="text-align: justify;"><img src="http://statprog.ru/wp-content/012810_1459_2.jpg" alt="Моделирование движения пьяного человека на C#" width="556" height="351" /></p>
<p style="text-align: justify;"><img src="http://statprog.ru/wp-content/012810_1459_1.png" alt="Рисунок 1.1" /></p>
<p style="text-align: justify;">
<p>После создания формы и всех ее объектов приступим к написанию кода программы.<br />
Для начала я перечислю, какие библиотеки и глобальные переменные необходимы для работы программы.<br />
<strong>Библиотеки:</strong></p>
<pre class="brush: csharp;">using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;</pre>
<p><strong>Глобальные переменные:</strong></p>
<pre class="brush: csharp;">Point[,] coord = new Point[11, 11];
Point[] coord_courses;
coord_points[] mass_points;
Point PointUser = new Point();
Point PointUser_For_searche = new Point();
int shag = 5;
Graphics Line;
Rectangle EllipseDraw = new Rectangle();
Rectangle EllipseDraw2 = new Rectangle();
GraphicsPath GraphicsPathEllipse;</pre>
<p>Для того чтобы запоминать сколько раз «пьяньчуга» попадал в ту или иную точку, мы будем использовать структуру «coord_points», которая включает в себя координаты точки x и y и количество попаданий «Count». Структуру объявляем глобально.</p>
<pre class="brush: csharp;">public struct coord_points
{
	int x;
	int y;
	int Count;
	public coord_points(int X, int Y, int count)
	{
		x = X;
		y = Y;
		Count = count;
	}
	public int X
	{
		get { return x; }
		set { x = value; }
	}
	public int Y
	{
		get { return y; }
		set { y = value; }
	}
	public int count
	{
		get { return Count; }
		set { Count = value; }
	}
};</pre>
<p>Теперь напишем код для кнопки «Нарисовать местность».</p>
<pre class="brush: csharp;">	pictureBox.Refresh(); //Обновить область для рисования
	listBox1.Items.Clear(); // Очищаем ListBox с координатами
	isleovanie.Text = &quot;&quot;; // Очищаем значение исследования
	Line = Graphics.FromHwnd(pictureBox.Handle); // Создаем объект для рисования на pictureBox

	count_iter.Text = 0.ToString();//Обнуляем поле «Кол-во итераций»
	distance.Text = 0.ToString();//Обнуляем поле «Расстояние (пиксеметры)»

	count_courses.Text = 0.ToString();//Обнуляем поле «Общее кол-во шагов»
	count_down.Text = 0.ToString();//Обнуляем поле количество шагов «Вниз»
	count_up.Text = 0.ToString();//Обнуляем поле количество шагов «Вверх»
	count_l.Text = 0.ToString();//Обнуляем поле количество шагов «Влево»
	count_r.Text = 0.ToString();//Обнуляем поле количество шагов «Вправо»

	System.Drawing.Pen red = new Pen(Color.Red, 1);
	SolidBrush EllipseBrush = new SolidBrush(Color.Black);
	Graphics Ellipse = Graphics.FromHwnd(pictureBox.Handle);
	Graphics Ellipse2 = Graphics.FromHwnd(pictureBox.Handle);
	GraphicsPathEllipse = new GraphicsPath();
	Random rnd = new Random();
	int max_h = pictureBox.Height / 2 + pictureBox.Height / 4;
	int max_w = pictureBox.Width / 2 + pictureBox.Width / 4;
	int temp = 0;

	Point start1 = new Point(10, 10);
	Point start2 = new Point(10, 10);
	Point end1 = new Point(10, pictureBox.Height - 50);
	Point end2 = new Point(pictureBox.Width - 10, 10);
	Point end3 = new Point(pictureBox.Width - 10, pictureBox.Height - 50);
	//Координаты помещения
	coord[0, 0].X = end2.X - rnd.Next(pictureBox.Width / 3, pictureBox.Width / 2);
	coord[0, 0].Y = start1.Y;
	coord[0, 1].X = end2.X - rnd.Next(5, pictureBox.Width / 3);
	coord[0, 1].Y = end2.Y;
	//Слева линия
	coord[1, 0].X = start1.X;
	coord[1, 0].Y = start1.Y;
	coord[1, 1].X = end1.X;
	coord[1, 1].Y = end1.Y;
	//Верхняя
	coord[2, 0].X = start1.X;
	coord[2, 0].Y = start1.Y;
	coord[2, 1].X = coord[0, 0].X;
	coord[2, 1].Y = end2.Y;
	//Верхняя 2
	coord[6, 0].X = coord[0, 1].X;
	coord[6, 0].Y = start1.Y;
	coord[6, 1].X = end2.X;
	coord[6, 1].Y = end2.Y;
	//Правая
	coord[3, 0].X = end2.X;
	coord[3, 0].Y = end2.Y;
	coord[3, 1].X = end3.X;
	coord[3, 1].Y = end3.Y;
	//Нижняя
	coord[4, 0].X = end1.X;
	coord[4, 0].Y = end1.Y;
	coord[4, 1].X = end3.X - pictureBox.Width / 2 - pictureBox.Width / 3 - rnd.Next(0, 30);
	coord[4, 1].Y = end3.Y;
	//Нижняя
	coord[7, 0].X = end3.X - pictureBox.Width / 4 - pictureBox.Width / 2 - rnd.Next(0, 50);
	coord[7, 0].Y = end1.Y;
	coord[7, 1].X = end3.X;
	coord[7, 1].Y = end3.Y;
	//Нижняя 2
	coord[8, 0].X = coord[4, 1].X;
	coord[8, 0].Y = end3.Y;
	coord[8, 1].X = coord[4, 1].X;
	coord[8, 1].Y = end3.Y + 40;
	//Нижняя 2
	coord[9, 0].X = coord[7, 0].X;
	coord[9, 0].Y = end3.Y;
	coord[9, 1].X = coord[7, 0].X;
	coord[9, 1].Y = coord[8, 1].Y;
	//Нижняя 3
	coord[10, 0].X = coord[8, 1].X;
	coord[10, 0].Y = coord[8, 1].Y;
	coord[10, 1].X = coord[9, 1].X;
	coord[10, 1].Y = coord[9, 1].Y;
	//Координаты для эллипса
	coord[5, 0].X = rnd.Next(50, max_w);
	coord[5, 0].Y = rnd.Next(50, max_h);
	coord[5, 1].X = rnd.Next(50, max_w);
	coord[5, 1].Y = rnd.Next(50, max_h);
	for (; ; )
	{
		if (coord[5, 1].X == 0 || coord[5, 1].Y == 0)
		{
			temp = rnd.Next(50, max_w);
			if (temp != coord[5, 0].X)
				coord[5, 1].X = temp;

			temp = rnd.Next(50, max_w);
			if (temp != coord[5, 0].Y)
				coord[5, 1].Y = temp;
		}
		else
			break;
	}
	//////////////////
	EllipseDraw = new Rectangle(coord[5, 0].X, coord[5, 0].Y, 10, 10);
	EllipseDraw2 = new Rectangle(coord[5, 1].X, coord[5, 1].Y, 10, 10);

	Line.DrawLine(red, start1.X, start1.Y, end1.X, end1.Y); //Левая

	Line.DrawLine(red, coord[2, 0].X, coord[2, 0].Y, coord[2, 1].X, coord[2, 1].Y); //Верхняя
	Line.DrawLine(red, coord[6, 0].X, coord[6, 0].Y, coord[6, 1].X, coord[6, 1].Y); //Верхняя

	Line.DrawLine(red, end2, end3); //Правая

	Line.DrawLine(red, coord[4, 0].X, coord[4, 0].Y, coord[4, 1].X, coord[4, 1].Y); //Нижняя прямая
	Line.DrawLine(red, coord[7, 0].X, coord[7, 0].Y, coord[7, 1].X, coord[7, 1].Y); //Нижняя прямая

	Line.DrawLine(red, coord[8, 0].X, coord[8, 0].Y, coord[8, 1].X, coord[8, 1].Y); //Нижняя 2 слева

	Line.DrawLine(red, coord[9, 0].X, coord[9, 0].Y, coord[9, 1].X, coord[9, 1].Y); //Нижняя 2 справа

	Line.DrawLine(red, coord[10, 0].X, coord[10, 0].Y, coord[10, 1].X, coord[10, 1].Y); //Нижняя 3 прямая

	int el_x1 = rnd.Next(50, max_w);
	int el_y1 = rnd.Next(50, max_h);

	GraphicsPathEllipse.AddEllipse(new Rectangle(el_x1, el_y1, 10, 10));//Рисуем первый люк
	Ellipse.FillEllipse(EllipseBrush, new Rectangle(el_x1, el_y1, 10, 10));
	//Рисуем случайно все остальные люки (kolvolukov.Text – кол-во люков)
	for (int i = 2; i &lt; = Convert.ToInt32(kolvolukov.Text); i++)
	{
		int el_x2 = rnd.Next(50, max_w);
		int el_y2 = rnd.Next(50, max_h);
		for (; ; )
		{
			if (el_x2 == 0 || el_y2 == 0)
			{
				temp = rnd.Next(50, max_w);
				if (temp != el_x1)
					el_x2 = temp;

				temp = rnd.Next(50, max_w);
				if (temp != el_y1)
					el_y2 = temp;
			}
			else
				break;
		}
		el_x1 = el_x2;
		el_y1 = el_y2;

		GraphicsPathEllipse.AddEllipse(new Rectangle(el_x2, el_y2, 10, 10));
		Ellipse.FillEllipse(EllipseBrush, new Rectangle(el_x2, el_y2, 10, 10));
	}
	searching.Enabled = true; //Активируем кнопку «Провести исследование»</pre>
<p>Напишем метод «MessageShow», который будет выводить сообщение на экран при завершении моделирования.<br />
void MessageShow(int type)<br />
{<br />
if(type == 1)<br />
MessageBox.Show(&#8220;Моделирование закончено!&#8221;);<br />
else<br />
MessageBox.Show(&#8220;Пьянчуга попал в люк&#8221;);<br />
}<br />
Теперь напишем объект «check», который осуществляет ряд проверок движения «пьяньчуги». Если «пьяньчуга» нашел выход или попал в один из люков, выводится соответствующее сообщение и моделирование прекращается.</p>
<pre class="brush: csharp;">int check(int type)
{
	//Конец пути пьянчуги
	if (PointUser.X &gt;= coord[0, 0].X &amp;&amp; PointUser.X &lt; = coord[0, 1].X &amp;&amp; PointUser.Y &lt;= coord[0, 1].Y)
	{
		if(type == 1)
			MessageShow(1);
		return -1;
	}
	//Пьянчуга попал в люк
	if (GraphicsPathEllipse.IsVisible(PointUser))
	{
		if(type == 1)
			MessageShow(2);
		return -1;
	}
	//Слева линия
	if (PointUser.X &lt;= coord[1, 0].X &amp;&amp; PointUser.Y &gt;= coord[1, 0].Y &amp;&amp; PointUser.Y &lt; = coord[1, 1].Y)
	{
		PointUser.X += shag;
	}
	//Верхняя
	if(PointUser.X &gt;= coord[2, 0].X &amp;&amp; PointUser.X &lt; = coord[2, 1].X &amp;&amp; PointUser.Y &lt;= coord[2, 0].Y)
	{
		PointUser.Y += shag;
	}
	//Верхняя 2
	if (PointUser.X &gt;= coord[6, 0].X &amp;&amp; PointUser.X &lt; = coord[6, 1].X &amp;&amp; PointUser.Y &lt;= coord[6, 0].Y)
	{
		PointUser.Y += shag;
	}
	//Правая линия
	if (PointUser.X &gt;= coord[3, 0].X &amp;&amp; PointUser.Y &gt;= coord[3, 0].Y &amp;&amp; PointUser.Y &lt; = coord[3, 1].Y)
	{
		PointUser.X -= shag;
	}
	//Нижняя
	if ((PointUser.X &gt;= coord[4, 0].X &amp;&amp; PointUser.X &lt; = coord[4, 1].X) &amp;&amp; PointUser.Y &gt;= coord[4, 1].Y)
	{
		PointUser.Y -= shag;
	}
	if ((PointUser.X &gt;= coord[7, 0].X &amp;&amp; PointUser.X &lt; = coord[7, 1].X) &amp;&amp; PointUser.Y &gt;= coord[7, 1].Y)
	{
		PointUser.Y -= shag;
	}
	if (PointUser.X &lt; = coord[8, 0].X &amp;&amp; PointUser.Y &gt;= coord[8, 0].Y &amp;&amp; PointUser.Y &lt; = coord[8, 1].Y)
	{
		PointUser.X += shag;
	}
	if ((PointUser.X &gt;= coord[10, 0].X &amp;&amp; PointUser.X &lt; = coord[10, 1].X) &amp;&amp; PointUser.Y &gt;= coord[10, 1].Y)
	{
		PointUser.Y -= shag;
	}
	if (PointUser.X &gt;= coord[9, 0].X &amp;&amp; PointUser.Y &gt;= coord[9, 0].Y &amp;&amp; PointUser.Y &lt; = coord[9, 1].Y)//Нижняя 2 справа
	{
		PointUser.X -= shag;
	}
	return 0;
}</pre>
<p>Следующие объекты и методы необходимы для проверки правильного указания коэффициентов вероятности перемещения и количества люков.</p>
<pre class="brush: csharp;">bool check_ver()
{
	double sum = Convert.ToDouble(go_up.Text) + Convert.ToDouble(go_down.Text) + Convert.ToDouble(go_right.Text) + Convert.ToDouble(go_left.Text);

	if (sum &gt; 1 || sum &lt; 1)
		MessageBox.Show(&quot;Сумма коэффициентов направленности превышает допустимое значение равное 1.&quot;);
	else if (Convert.ToInt32(kolvolukov.Text) &lt; 1 || Convert.ToInt32(kolvolukov.Text) &gt; 50)
		MessageBox.Show(&quot;Количество люков не может быть меньше 1 или больше 50.&quot;);
	else
		return true;

	return false;
}
//Запускается, когда происходит изменение Вероятности перемещения «Вверх»
private void go_up_TextChanged(object sender, EventArgs e)
{
	check_ver();
}
//Запускается, когда происходит изменение Вероятности перемещения «Вниз»
private void go_down_TextChanged(object sender, EventArgs e)
{
	check_ver();
}
//Запускается, когда происходит изменение Вероятности перемещения «Вправо»
private void go_right_TextChanged(object sender, EventArgs e)
{
	check_ver();
}
//Запускается, когда происходит изменение Вероятности перемещения «Влево»
private void go_left_TextChanged(object sender, EventArgs e)
{
	check_ver();
}
//Запускается, когда происходит изменение поля Количество люков
private void kolvolukov_TextChanged(object sender, EventArgs e)
{
	check_ver();
}</pre>
<p>Напишем методы, которые изменяют шаг движения. Если на объект выводятся «точки», шаг составляет 5, если цифры – 15. Создано для удобства вывода на экран.</p>
<pre class="brush: csharp;">private void pic_point_CheckedChanged(object sender, EventArgs e)
{
	shag = 5;
}
private void pic_char_CheckedChanged(object sender, EventArgs e)
{
	shag = 15;
}
//Объект «isPoint» возвращает положение координаты точки, если она есть в массиве mass_points
int isPoint(Point mass_nums, coord_points[] mass_points)
{
	for (int i = 0; i &lt; mass_points.Count(); i++)
	{
		if (mass_points[i].X == mass_nums.X &amp;&amp; mass_points[i].Y == mass_nums.Y)
			return i;
	}
	return -1;
}
//Метод «setCount» увеличивает счетчик попадания человека в точку на 1
void setCount(coord_points[] mass_points, int index)
{
	mass_points[index].count = mass_points[index].count + 1;
}
// Метод «listBox1_MouseDoubleClick» вызывается при двойном клике на объект «listBox1», где хранятся координаты перемещения «пьяньчуги». Метод выделяет красным цветом точку по указанной координате.
private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e)
{
	System.Drawing.Pen red = new Pen(Color.Red, 2);
	Graphics Ellipse = Graphics.FromHwnd(pictureBox.Handle);

	Ellipse.DrawEllipse(red, new Rectangle(mass_points[listBox1.Items.IndexOf(listBox1.Text)].X, mass_points[listBox1.Items.IndexOf(listBox1.Text)].Y, 2, 2));

}</pre>
<p>Наконец, метод «pictureBox_MouseDown», который осуществляет моделирование движения пьяного человека.</p>
<pre class="brush: csharp;">private void pictureBox_MouseDown(object sender, MouseEventArgs e)
{
	if (check_ver() == true)//Если все проверки прошли
	{
		PointUser.X = e.X; //Получаем X-координату точки
		PointUser.Y = e.Y; //Получаем Y-координату точки

		PointUser_For_searche.X = e.X;
		PointUser_For_searche.Y = e.Y;

		Line = Graphics.FromHwnd(pictureBox.Handle);
		System.Drawing.Graphics graph = Graphics.FromHwnd(pictureBox.Handle);

		System.Drawing.Pen WhiteSmoke = new Pen(Color.WhiteSmoke, 1);
		System.Drawing.Pen Black = new Pen(Color.Black, 2);
		EllipseDraw = new Rectangle(PointUser.X, PointUser.Y, 2, 2);
		Graphics Ellipse = Graphics.FromHwnd(pictureBox.Handle);
		Ellipse.DrawEllipse(Black, EllipseDraw);

		Random rnd = new Random();
		int count = 0, countiter = 0, c_left = 0, c_right = 0, c_up = 0, c_down = 0;
		double hod, left, right, up, down;
		coord_courses = new Point[Convert.ToInt32(count_steps.Text)];

		List&lt;Point&gt; mass_nums = new List&lt;point&gt;();

		for (int i = 1; i &lt; = Convert.ToInt32(count_steps.Text); i++)
		{
			if (rnd.Next(1, 5) != 1)//Если вероятность не «стоять на месте»
			{
				coord_courses[count] = PointUser;
				mass_nums.Add(PointUser);

				hod = rnd.NextDouble();
				up = Convert.ToDouble(go_up.Text);
				down = Convert.ToDouble(go_down.Text);
				right = up + down;
				left = up + down + Convert.ToDouble(go_right.Text);
//Если вероятность «идти влево»
				if (hod &gt; left &amp;&amp; hod &lt; left + Convert.ToDouble(go_left.Text))
				{
					PointUser.X -= shag;
					if (check(1) == -1)
						break;
					else
					{
						if (pic_point.Checked)
							Ellipse.DrawEllipse(Black, new Rectangle(PointUser.X, PointUser.Y, 2, 2));
					}
					c_left++;
				}
				else if (hod &gt; 0 &amp;&amp; hod &lt; up) //Если вероятность «идти вверх»
				{
					PointUser.Y -= shag;
					if (check(1) == -1)
						break;
					else
					{
						if (pic_point.Checked)
							Ellipse.DrawEllipse(Black, new Rectangle(PointUser.X, PointUser.Y, 2, 2));
					}
					c_up++;
				}
				else if (hod &gt; right &amp;&amp; hod &lt; right + Convert.ToDouble(go_right.Text)) //вправо
				{
					PointUser.X += shag;
					if (check(1) == -1)
						break;
					else
					{
						if (pic_point.Checked)
							Ellipse.DrawEllipse(Black, new Rectangle(PointUser.X, PointUser.Y, 2, 2));
					}
					c_right++;
				}
				else if (hod &gt; up &amp;&amp; hod &lt; up + down) //вниз
				{
					PointUser.Y += shag;
					if (check(1) == -1)
						break;
					else
					{
						if (pic_point.Checked)
							Ellipse.DrawEllipse(Black, new Rectangle(PointUser.X, PointUser.Y, 2, 2));
					}
					c_down++;
				}
			}
			countiter++;
		}
		count = c_down + c_left + c_right + c_up;

		count_iter.Text = countiter.ToString();
		distance.Text = (count).ToString();

		count_courses.Text = count.ToString();
		count_down.Text = c_down.ToString();
		count_up.Text = c_up.ToString();
		count_l.Text = c_left.ToString();
		count_r.Text = c_right.ToString();

		up = Convert.ToDouble(go_up.Text);
		down = Convert.ToDouble(go_down.Text);
		right = Convert.ToDouble(go_right.Text);
		left = Convert.ToDouble(go_left.Text);

		if (up &gt; down &amp;&amp; up &gt; right &amp;&amp; up &gt; left)
			isleovanie.Text = &quot;При к.н. (Вверх) пьянчуга прошел &quot; + Math.Round(((double)c_up / (double)count) * 100) + &quot;% пути&quot;;
		else if (down &gt; up &amp;&amp; down &gt; right &amp;&amp; down &gt; right)
			isleovanie.Text = &quot;При к.н. (Вниз) пьянчуга прошел &quot; + Math.Round(((double)c_down / (double)count) * 100) + &quot;% пути&quot;;
		else if (right &gt; up &amp;&amp; right &gt; left &amp;&amp; right &gt; down)
			isleovanie.Text = &quot;При к.н. (Вправо) пьянчуга прошел &quot; + Math.Round(((double)c_right / (double)count) * 100) + &quot;% пути&quot;;
		else if (left &gt; up &amp;&amp; left &gt; right &amp;&amp; left &gt; down)
			isleovanie.Text = &quot;При к.н. (Влево) пьянчуга прошел &quot; + Math.Round(((double)c_left / (double)count) * 100) + &quot;% пути&quot;;

		mass_points = new coord_points[mass_nums.Count];
		Point[] coord_courses2 = new Point[mass_nums.Count];
		int index = 0, j = 0;
		for (int i = 0; i &lt; mass_nums.Count; i++)
			if ((index = isPoint(mass_nums[i], mass_points)) &gt; -1)
			{
				setCount(mass_points, index);
			}
			else
			{
				mass_points[j].X = mass_nums[i].X;
				mass_points[j].Y = mass_nums[i].Y;
				mass_points[j].count = 1;
				j++;
			}

		for (int i = j - 1; i &gt;= 0; i--)
		{
			if (!pic_point.Checked)
			{
				if (i + 1 == j)
					graph.DrawString(mass_points[i].count.ToString(), new Font(&quot;Times New Roman&quot;, 8), new SolidBrush(Color.Red), mass_points[i].X - 3, mass_points[i].Y - 8);
				else
					graph.DrawString(mass_points[i].count.ToString(), new Font(&quot;Times New Roman&quot;, 8), new SolidBrush(Color.Black), mass_points[i].X - 3, mass_points[i].Y - 8);
			}
			listBox1.Items.Add(&quot;X:&quot; + mass_points[i].X + &quot;; Y:&quot; + mass_points[i].Y + &quot;; Кол-во:&quot; + mass_points[i].count);
		}
	}
}</pre>
<p>Напишем последний метод «searching_Click», чтобы завершить написание программы. Здесь выполняется исследование.</p>
<pre class="brush: csharp;">private void searching_Click(object sender, EventArgs e)
{
	Random rnd = new Random();
	int count = 0, countiter = 0, c_left = 0, c_right = 0, c_up = 0, c_down = 0;
	double hod, left, right, up, down;

	for (int sch = 1; sch &lt; = 10; sch++)
	{
		PointUser = PointUser_For_searche;
		for (int i = 1; i &lt;= Convert.ToInt32(count_steps.Text); i++)
		{
			if (rnd.Next(1, 5) != 1)
			{
				hod = rnd.NextDouble();
				up = Convert.ToDouble(go_up.Text);
				down = Convert.ToDouble(go_down.Text);
				right = up + down;
				left = up + down + Convert.ToDouble(go_right.Text);

				if (hod &gt; left &amp;&amp; hod &lt; left + Convert.ToDouble(go_left.Text)) //влево
				{
					PointUser.X -= shag;

					if (check(2) == -1)
						break;
					c_left++;
				}
				else if (hod &gt; 0 &amp;&amp; hod &lt; up) //вверх
				{
					PointUser.Y -= shag;

					if (check(2) == -1)
						break;
					c_up++;
				}
				else if (hod &gt; right &amp;&amp; hod &lt; right + Convert.ToDouble(go_right.Text)) //вправо
				{
					PointUser.X += shag;
					if (check(2) == -1)
						break;
					c_right++;
				}
				else if (hod &gt; up &amp;&amp; hod &lt; up + down) //вниз
				{
					PointUser.Y += shag;
					if (check(2) == -1)
						break;
					c_down++;
				}
			}
			countiter++;
		}
	}
	count = c_down + c_left + c_right + c_up;

	count_iter.Text = countiter.ToString();
	distance.Text = (count).ToString();

	count_courses.Text = count.ToString();
	count_down.Text = c_down.ToString();
	count_up.Text = c_up.ToString();
	count_l.Text = c_left.ToString();
	count_r.Text = c_right.ToString();

	up = Convert.ToDouble(go_up.Text);
	down = Convert.ToDouble(go_down.Text);
	right = Convert.ToDouble(go_right.Text);
	left = Convert.ToDouble(go_left.Text);

	if (up &gt; down &amp;&amp; up &gt; right &amp;&amp; up &gt; left)
	{
		isleovanie.Text = &quot;При к.н. (Вверх) пьянчуга прошел &quot; + Math.Round(((double)c_up / (double)count) * 100) + &quot;% пути&quot;;
		label10.Text = &quot;Среднее значение: &quot; + Math.Round((double)c_up / (double)count, 2).ToString();
	}
	else if (down &gt; up &amp;&amp; down &gt; right &amp;&amp; down &gt; right)
	{
		isleovanie.Text = &quot;При к.н. (Вниз) пьянчуга прошел &quot; + Math.Round(((double)c_down / (double)count) * 100) + &quot;% пути&quot;;
		label10.Text = &quot;Среднее значение: &quot; + Math.Round((double)c_down / (double)count, 2).ToString();
	}
	else if (right &gt; up &amp;&amp; right &gt; left &amp;&amp; right &gt; down)
	{
		isleovanie.Text = &quot;При к.н. (Вправо) пьянчуга прошел &quot; + Math.Round(((double)c_right / (double)count) * 100) + &quot;% пути&quot;;
		label10.Text = &quot;Среднее значение: &quot; + Math.Round((double)c_right / (double)count, 2).ToString();
	}
	else if (left &gt; up &amp;&amp; left &gt; right &amp;&amp; left &gt; down)
	{
		isleovanie.Text = &quot;При к.н. (Влево) пьянчуга прошел &quot; + Math.Round(((double)c_left / (double)count) * 100) + &quot;% пути&quot;;
		label10.Text = &quot;Среднее значение: &quot; + Math.Round((double)c_left / (double)count, 2).ToString();
	}
}</pre>
<p>После написание кода программы проверим ее работу:</p>
<ul>
<li>
<div style="text-align: justify;">Указать вероятности перемещения</div>
</li>
<li>
<div style="text-align: justify;">Указать количество люков и тактов</div>
</li>
<li>
<div style="text-align: justify;">Выбрать метод представления пути перемещения («Точки» или «Цифры»)</div>
</li>
<li>
<div style="text-align: justify;">Кликнуть по кнопке «Нарисовать местность»</div>
</li>
<li>
<div style="text-align: justify;">Кликнуть мышкой по области рисования «pictureBox»</div>
</li>
<li>
<div style="text-align: justify;">Посмеяться над «пьяньчугой»</div>
</li>
<li>
<div style="text-align: justify;">Кликнуть по кнопке «Провести исследование»</div>
</li>
</ul>
<p><strong><span style="text-decoration: underline;">Примеры работы программы:</span></strong></p>
<p>«Пьяньчуга» попал в люк:</p>
<p><img src="file:///C:/Users/EVTEEV/AppData/Local/Temp/moz-screenshot.png" alt="" /></p>
<p style="text-align: center;"><a href="http://statprog.ru/wp-content/picpiyan.jpg"><img class="aligncenter size-full wp-image-436" title="Пьяньчуга попал в люк" src="http://statprog.ru/wp-content/picpiyan.jpg" alt="Пьяньчуга попал в люк" width="550" height="350" /></a></p>
<p style="text-align: left;">«Пьяньчуга» нашел выход:</p>
<p style="text-align: center;"><a href="http://statprog.ru/wp-content/picpiyan2.jpg"><img class="aligncenter size-full wp-image-437" title="Пьяньчуга нашел выход" src="http://statprog.ru/wp-content/picpiyan2.jpg" alt="Пьяньчуга нашел выход" width="550" height="350" /></a></p>
<p>Данную статью Вы можете скачать в формате doc<br />
<a href="http://statprog.ru/wp-content/modelirovanie_piyanchugi.rar">Скачать Пьяньчуга &#8211; Моделирование движения пьяного человека на C#</a></p>
<p style="text-align: justify;"><span style="color: black; font-family: Times New Roman; font-size: 12pt;"><strong>Автор:<em> Евтеев Евгений Александрович<br />
</em></strong></span></p>
<p><span style="color: black; font-family: Times New Roman; font-size: 12pt;"><strong>Email:<em> evteev_e2003@mail.ru</em></strong></span></p>
]]></content:encoded>
			<wfw:commentRss>http://statprog.ru/2010/01/28/pyanchuga-modelirovanie-dvizheniya-pyanogo-cheloveka-na-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
