Как сделать рейтинг в игре?

127
10 января 2021, 00:10

Есть игра "Найди элементы на картинке" есть две разных картинки,где нужно искать элементы.

Получается что нужно как то сделать рейтинг,но у меня не получается

Суть такова: у меня не получается посчитать их время прохождения (у таймера обратный отсчет,т.е. с 3-х минут). И тут есть проблемы. Нужно как то посчитать за какое время они нашли все предметы и нужно запоминать каждую игру! (чтобы потом в дальнейшем выводить результат каждой игры)

Вот код всего процесса:

public Form3()
    {
        InitializeComponent();
        objects = new List<MapObject>();
        objects.Add(new MapObject()
        {
            Name = "Парусник",
            X = 180,
            Y = 34,
            Width = 27,
            Height = 37
        });
        objects.Add(new MapObject()
        {
            Name = "Пароход",
            X = 304,
            Y = 20,
            Width = 49,
            Height = 19
        });
        objects.Add(new MapObject()
        {
            Name = "Кактус",
            X = 369,
            Y = 127,
            Width = 11,
            Height = 20
        });
        objects.Add(new MapObject()
        {
            Name = "Лошадь",
            X = 336,
            Y = 80,
            Width = 18,
            Height = 18
        });
        objects.Add(new MapObject()
        {
            Name = "Дирижер",
            X = 228,
            Y = 156,
            Width = 17,
            Height = 19
        });
        objects.Add(new MapObject()
        {
            Name = "Мяч",
            X = 213,
            Y = 261,
            Width = 20,
            Height = 20
        });
    }
List<MapObject> objects;
private void Timer1_Tick(object sender, EventArgs e)
    {
        tk = --i;
        TimeSpan span = TimeSpan.FromSeconds(tk);
        string label = span.ToString(@"mm\:ss");
        label1.Text = label.ToString();
        if (i <= 0)
        {
            label9.Visible = true;
            label1.Visible = false;
            timer1.Stop();
            pictureBox1.Visible = false;
            pictureBox2.Visible = true;
        }

    }
int i;
int tk;
string c;
private void Button2_Click(object sender, EventArgs e)
    {
        button2.Visible = false;
        pictureBox1.Visible = true;
        i = 180;
        c = "3:00";
        label1.Text = c;
        timer1.Interval = 1000;
        timer1.Enabled = true;
        timer1.Start();
    }
private void PictureBox1_MouseClick(object sender, MouseEventArgs e)
    {
        int currentX = e.X;
        int currentY = e.Y;
        bool FindSome = false;
        for (int i = 0; i < objects.Count; i++)
        {
            if (currentX > (objects[i].X - objects[i].Width / 2) & currentX < (objects[i].X + objects[i].Width / 2)
            & currentY > (objects[i].Y - objects[i].Height / 2) & currentY < (objects[i].Y + objects[i].Height / 2))
            {
                MessageBox.Show("Вы нашли слово : " + objects[i].Name);
                objects[i].IsClicked = true;
                FindSome = true;
            }

        }
        if (!FindSome) TimeDec();

        if (IsAllClicked())
        {
            label8.Visible = true;
            label1.Visible = false;
            timer1.Stop();
            pictureBox1.Visible = false;
            pictureBox2.Visible = false;
        }
    }
private void TimeDec()
    {
        MessageBox.Show("Никуда не попали");
        i -= 5;
    }
private bool IsAllClicked()
    {
        bool AllObjectsClicked = true;
        foreach (MapObject item in objects)
        {
            if (!item.IsClicked)
            {
                AllObjectsClicked = false; break;
            }
        }
        return AllObjectsClicked;
    }

Вот код из класса(mapobject):

class MapObject
{
    public string Name;
    public int X;
    public int Y;
    public int Width;
    public int Height;
    public bool IsClicked = false;
}
Answer 1

Ну вот в коде место, где игрок нашел все предметы.

if (IsAllClicked())
        {
            ...

Сюда и будем добавлять логику сохранения рекорда. Эту логику я предлагаю вынести в отдельный метод, например, SaveRecord:

if (IsAllClicked())
{
    SaveRecord();
    ...

В этом методе будут все расчеты и сохранение.

Нужно как то посчитать за какое время они нашли все предметы

Это можно сделать на основе того сколько времени осталось (i):

public void SaveRecord() 
{
    int timeInSeconds = 180 - i;

Пара моментов:

  • дайте переменной более говорящее название например timeLeft;
  • объявите константу для общей длины игры, чтобы не писать каждый раз 180;
  • Timer к сожалению не гарантирует точность отсчета. Пока он, наверное, Вам подойдет, но готовьтесь тому что замер времени с секундомером не будет сходится с таймером Вашей игры. Если в будущем понадобятся более точные измерения посмотрите в сторону Stopwatch.

и нужно запоминать каждую игру! (чтобы потом в дальнейшем выводить результат каждой игры)

Для этого я бы создал специальный класс для хранения одного рекорда:

public class Record
{
//пользователь, установивший рекорд
public string Username {get; set;}
//время в секундах
public int TimeInSeconds {get; set;}
}

Теперь можно хранить список рекордов и в методе SaveRecord создать новый рекорд и добавить его в список:

private List<Record> records = new List<Record>();
public void SaveRecord() 
{
    var record = new Record();
    record.TimeInSeconds = 180 - i;
    records.Add(record);
}

Примерно такое начало. Для наглядности можете выводить сообщение о времени в MessageBox. Далее осталось добавить остальные части условия:

  1. Сортируйте список рекордов и вставляйте рекорд на нужное место.
  2. Удаляйте «лишние» рекорды (если нужно отображать только ограниченное количество).
  3. Запрашивайте у пользователя имя и проставляйте его в записи о рекорде.
  4. Выводите рекорды в отдельной форме.
  5. Сохраняйте рекорды в файл/настройки/БД и считывайте их оттуда.

Попробуйте выполнять эти пункты по одному. Если что-то не получится, то Вы сможете задать более точные вопросы. В вопросы обязательно включайте свою попытку решения, подробно описывайте ее, расскажите что именно пошло не так. Так Вы быстрее получите ответ.

З.Ы. Вопросы вида «вот мой код допишите в него штуку» очень плохо подходят для обучения, т.к. отвечающие не понимают с чем именно у Вас возникают сложности и не знают что нужно объяснять. В результате в качестве ответа Вы можете получить код, который до конца не понимаете, и ничему при этом не научитесь.

О том, как облегчить задачу себе и окружающим: Если не знаете как написать/исправить код, то лучше не пишите его сразу в большом проекте. Вместо этого создайте новый проект, который будет выполнять только проблемную часть, и сконцентрируйтесь на ней. Если все получится, то у Вас будет код, который можно вставить в Вашу игру. Если не получится, то получится короткий пример, который можно будет опубликовать здесь как вопрос.

Например:

  • Не знаете как посчитать время потраченное на игру? Напишите новый проект единственный смысл которого: посчитать время. В нем будет таймер, счетчик и кнопка, которая останавливает таймер.

  • Не знаете как вставить новый рекорд в список? Напишите проект, который только и делает, что добавляет один готовый рекорд в один готовый список.

  • Не знаете как спросить у пользователя имя? Напишите проект, который ничего не делает кроме как запрашивает имя пользователя.

  • Не знаете как показать список рекордов в форме? Напишите проект, который показывает готовый список в форме.

  • Не знаете как сохранять рекорды в файл? Напишите проект, который только и делает, что берет готовый список рекордов и записывает их в файл.

Так Вам легче будет разобраться в проблеме. Если в проекте 10 строк, то каждую из них можно разобрать досконально. Если в проекте нет лишнего кода, то меньше вероятность того что несколько разных ошибок «наложатся» друг на друга.

Если не разберетесь сами и захотите задать вопрос здесь, то с маленьким проектом это будет сделать гораздо легче. Не нужно будет рассказывать заново всю логику игры. Вопрос получится короче, будет лучше принят и получит больше ответов за более короткое время. Большинству отвечающих здесь не захотят дописывать за Вас игру, но при этом смогут быстро ответить на простой вопрос о стандартных классах.

Разумеется то, что эти проблемы маленькие по масштабу не означает что к ним нужно относится несерьезно. По каждому из этих вопросов нужно будет предварительно поискать информацию в интернете, попробовать несколько вариантов. При публикации вопроса обязательно нужно будет указать свою попытку.

В общем, разбивайте задачи на части и работайте с ними по одной.

READ ALSO
Форматировать данные в Excel как таблицу

Форматировать данные в Excel как таблицу

Работаю с Excel на c#Задаю имена столбцов, вывожу данные

137
Как сделать при запросе у пользователя имени,чтобы он мог ввести не более 10 символов в textbox?

Как сделать при запросе у пользователя имени,чтобы он мог ввести не более 10 символов в textbox?

есть textbox в него вводится имя нужно сделать несколько условий :

119
Ошибка через 25 минут

Ошибка через 25 минут

Не могу понять в чем проблемаЧерез 25 минут, если ПО в бездействии выбрасывает следующую ошибку в методе get()

103
Как показывать текст в MessageBox с новой строки?

Как показывать текст в MessageBox с новой строки?

есть небольшой код в результате которого показывается messagebox,а как сделать чтобы какая то часть текста показывалась с новой строки?например...

104