На нашем сайте мы используем cookie для сбора информации технического характера и обрабатываем IP-адрес вашего местоположения. Продолжая использовать этот сайт, вы даете согласие на использование файлов cookies. Здесь вы можете узнать, как мы пользуемся файлами cookies.
Я согласен
логотип upread.ru

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


Появилась задача: создать программу, имитирующую движение вперед, в звездную систему, внутрь галактики. Эту задачу необходимо немного переиначить, чтобы решить: имитировать наше движение вперед будут звезды, которые и будут двигаться. Программу будем создавать в 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 - я вам помогу за небольшую плату.




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

Читайте также:




Простая реализация алгоритма быстрого поиска на Java
Применение алгоритмов на примере перколяции


© upread.ru 2013-2019
При перепечатке активная ссылка на сайт обязательна.
Задать вопрос
письмо
Здравствуйте! Вы можете задать мне любой вопрос. Если не получается отправить сообщение через эту форму, то пишите на почу up777up@yandex.ru
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.