Программа "Вперед, в галактику!"


Появилась задача: создать программу, имитирующую движение вперед, в звездную систему, внутрь галактики. Эту задачу необходимо немного переиначить, чтобы решить: имитировать наше движение вперед будут звезды, которые и будут двигаться. Программу будем создавать в Microsoft Visual C#. Проект - приложение Windows Forms. Итак, ниже код программы, а затем минимально необходимые пояснения к нему.

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;

namespace stars
{
    public partial class Form1 : Form
    {
        Panel panel;
        Button startBtn;
        Timer timer;
        static int n = 80;
        Rectangle[] rect = new Rectangle[n];
        Graphics graphics;
        int[] x = new int[n];
        int[] y = new int[n];
        int[] dx = new int[n];
        int[] dy = new int[n];
        Random rnd=new Random();     

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            ClientSize = new System.Drawing.Size(600, 400);
            panel = new Panel();
            panel.Size = new Size(400, 400);
            Controls.Add(panel);
            graphics = panel.CreateGraphics();
            startBtn = new Button();
            startBtn.AutoSize = true;
            startBtn.Location = new Point(405, 5);
            startBtn.Text = "start";
            startBtn.Click += startBtn_Click;
            Controls.Add(startBtn);

            for (int i = 0; i < n; i++ )
            {
                x[i] = rnd.Next(10, 390);
                if (x[i] >= 200) dx[i] = 2;
                else dx[i] = -2;
                y[i] = rnd.Next(10, 390);
                if (y[i] >= 200) dy[i] = 2;
                else dy[i] = -2;
                rect[i] = new Rectangle(x[i], y[i], 1, 1);
            }

            timer = new Timer();
            timer.Tick += timer_Tick;
        }

        void startBtn_Click(object sender, EventArgs e)
        {
            timer.Enabled = !timer.Enabled;
            if (startBtn.Text=="start")
            startBtn.Text = "stop";
            else startBtn.Text = "start";      
        }

        void timer_Tick(object sender, EventArgs e)
        {
            graphics.Clear(Color.Black);
            Move();
            for (int i = 0; i < n; i++)
            {
                graphics.DrawRectangle(new Pen(Color.White), rect[i]);
            }    
        }

        void Move()
        {         
           for (int i = 0; i < n; i++)
            {             
                x[i] = x[i] + dx[i];
                y[i] = y[i] + dy[i];

                if ((x[i] < 400) && (x[i] > 0) && (y[i] < 400) && (y[i] > 0))
                {
                    rect[i].Offset(dx[i], dy[i]);                  
                }

                else {

                    if (x[i] <= 0) { 
                        rect[i].Offset(200, dy[i]);
                        x[i] =  x[i] + 200;                   
                    }

                    if (y[i] <= 0)
                    {
                        rect[i].Offset(dx[i],200);
                        y[i] = y[i] + 200;
                    }

                    if (x[i] >= 400)
                    {
                        rect[i].Offset(-200, dy[i]);
                        x[i] = x[i] - 200;
                    }

                    if (y[i] >= 400)
                    {
                        y[i] = y[i] - 200;
                        rect[i].Offset(dx[i], -200);
                    }                                
                }             
            }       
        }
        }
    }
Массивы x и y хранят себе начальные координаты звезд; dx и dy - это смещения по осям для каждой звезды. Высчитываются они относительно центра: координата звезды (определяемая случайным образом) больше 200 - тогда +2, меньше - тогда -2. По нажатию кнопки "start" активируем таймер; в этом же методе проверяем текст на кнопке и меняем его - со старт на стоп и наоборот.

Каждая звезда - это на самом деле у нас не звезда, а прямоугольник; рисуется он в строке. За передвижение звезд отвечает метод Move; в нем прямоугольник перерисовывается с помощью Offset. Одновременно в Move мы пересчитываем координаты звезды и, если она вышла за пределы окна, то возвращаем её в центр. Смотрим результат:



Вот так относительно несложно можно сделать имитацию движения вперед в звездном небе. Разумеется, программу можно усовершенствовать и дополнять: делать звезды увеличивающимися, изменять их скорость и так далее - но основа уже заложена. Если вам требуется помощь по C#, необходима программа или что-то еще, то вы можете написать на почту up777up@yandex.ru - я вам помогу за небольшую плату.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, си шарп, имитация движения, звездное небо




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Урок 39. Коллекция Стек (Stack) C#
Программа "Ловим фокус"
Алгоритм XOR-обмена на C#