Как сделать таблицу рекордов в скретч
Перейти к содержимому

Как сделать таблицу рекордов в скретч

  • автор:

OldTV_inc

Я недавно начал заниматься программированием на этой платформе. Создал несколько проектов, в том числе и тот, о котором сейчас пойдёт речь.

В моём проекте (Doom Up!) нужна таблица рекордов. Я уже её начал делать, но столкнулся с одним вопросом: Как определить имя пользователя?

Подойдут любые ответы на данный вопрос (кроме да/нет).

Июнь 22, 2023 09:55:29

Your_old_scratcher

Я недавно начал заниматься программированием на этой платформе. Создал несколько проектов, в том числе и тот, о котором сейчас пойдёт речь.

В моём проекте (Doom Up!) нужна таблица рекордов. Я уже её начал делать, но столкнулся с одним вопросом: Как определить имя пользователя?

Подойдут любые ответы на данный вопрос (кроме да/нет).

(имя пользователя :: sensing)

Сохранение очков и рекордов. Облачные Данные Scratch

Творческое программирование для всех

Нас спрашивают, можно ли сохранять очки на сайте Scratch. Отвечаем: да, это возможно с использование облачных переменных.

Рассмотрим ниже небольшую заготовку игры, в которой с помощью облачной переменной сохраняется достигнутый лучшим игроком рекорд. Управление: двигай мышку влево-вправо и лови падающие яблоки.

Изучаем документацию

Чтобы помочь ещё лучше разобраться в данной теме, мы перевели на русский язык часть документации Scratch, где даны ответы на вопросы о том, что такое облачные переменные, как их создавать и пр. Сделали также несколько иллюстраций и дополнительных уточнений для лучшего понимания.

Что такое облачные переменные?

Облачные переменные позволяют сохранять данные из проекта и предоставлять к ним доступ другим пользователям сообщества Scratch. Вы можете использовать облачные переменные для проведения исследований (опросов) и других проектов, где другие члены сообщества могут со временем получать доступ к данным и изменять их.

Примечание: «облачные» — значит те, которые хранятся на сервере Scratch, в глобальной сети Интернет. Именно поэтому все могут иметь доступ к этим данным.

Кто может видеть данные, сохранённые в облачных переменных?

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

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

В облачных переменных могут храниться только числа.

Если я вижу, что кто-то публикует нежелательный контент с использованием облачных переменных, как мне сообщить об этом?

Нажмите кнопку «Report (Пожаловаться)» красного цвета (на странице проекта под его описанием это третья по счёту кнопка после «Добавить в студию» и “Copy link”, см. картинку ниже), чтобы сообщить о неприемлемом контенте в облачных переменных. Не забудьте указать «облачные переменные» при вводе причины в отчете.

Кнопка «Пожаловаться»

Можно ли создавать чаты с облачными переменными?

На сайте Scratch чаты с облачными переменными не разрешены, хотя технически это возможно.

Как создать облачную переменную?

Перейдите в раздел «Переменные» палитры блоков (группу команд «Переменные»), выберите «Создать переменную» и установите флажок слева от надписи «Облачная переменная (хранится на сервере)» (см. картинку ниже). Данные, связанные с вашей облачной переменной, будут храниться на сервере, сохраняться с течением времени и доступны для всех, кто открывает проект.

Как создать облачную переменную?

Примечание: замечено, что иногда чтобы значение облачной переменной сохранилось и по завершении сеанса игры, при создании переменной необходимо выбрать тип «Только для этого спрайта». Но должно работать и без этого (возможно, в процессе подготовки материала на сайте Scratch был какой-то сбой).

Кто может изменить информацию в облачной переменной?

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

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

Если вы являетесь «Новым скретчером» (новичком) на сайте, вы не сможете использовать проекты с облачными переменными. Чтобы получить доступ к облачным переменным, вам нужно стать Скретчером (получить статус Scratcher).

Сразу после создания аккаунта каждый пользователь помечается как «Новый Скретчер». Чтобы получить статус «Скретчер», нужно делиться своими проектами, комментировать проекты других Скретчеров и терпеливо подождать! После того как вы будете соответствовать требованиям, в профиле появится ссылка, приглашающая стать Скретчером, и вы получите некоторые дополнительные возможности на сайте Scratch. (Примечание: по запросу получить статус «Скретчер» новичкам невозможно).

Возможно ли создавать многопользовательские игры с помощью облачных переменных?

Создать многопользовательскую игру может оказаться сложно из-за проблем со скоростью сети и синхронизацией. Тем не менее, некоторые Скретчеры придумывают креативные способы использования облачных переменных для пошаговых стратегий и других типов игр.

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

В новой версии Scratch 3.0 можно быстро узнать, используются ли в проекте облачные переменные, на странице с описанием проекта. Под окном проигрывателя проекта, сразу под значками «лайк» (иконка сердечка) и «избранное» (звёздочка) отображается поле на светло-синем фоне с надписью Облачные Данные и иконкой облака (см. картинку).

Облачные Данные

Под этой надписью есть также ссылка See Data -> . Если кликнуть по ней, откроется окно сайта Scratch «История облачных данных», в котором можно увидеть сохранённые облачные данные, отсортированные по времени от самых свежих (последних) до более старых (см. пример ниже).

История облачных данных

Примечание: замечено, что если проект был создан в Scratch 2.0 и после обновления Scratch до версии 3.0 его никто не запускал и не сохранял данные, на странице «История облачных данных» будет сообщение о том, что сохранённых данных нет:

There seems to be no Cloud Data activity on this project…

There seems to be no Cloud Data activity on this project…

Аналогично, если новый проект не запустить и не использовать облачные переменные, получим такое же сообщение.

Примеры проектов с использованием облачных переменных

Таблица рекордов

  • https://scratch.mit.edu/projects/303373707/ — Сколько лет Scratcher-ам с вычислением среднего возраста пользователей, выполнивших проект, и подсчётом их количества.
  • http://scratch.aelit.net/igra-google-dino/ — GOOGLE Dino.
  • https://scratch.mit.edu/projects/118210723/ — 3д платформер с таблицей рекордов. Здесь используется шифрование (кодирование) символьных данных (имён пользователей) для их сохранения. Таблица рекордов выглядит следующим образом: Как это сделать, частично можно узнать из Скретч ВИКИ в разделе «Облачный список» (см. по ссылке ниже).

Дополнительные источники

Ещё об использовании облачных переменных в Scratch можно почитать на страницах русскоязычной Скретч ВИКИ:

  • Облачная переменная.
  • Облачный список – здесь рассматривается задача кодирования (шифрования) символьных данных (букв, из которых состоят слова), если требуется с помощью облачной переменной сохранить строковые данные. В результате, каждая буква получает в соответствие некоторое число. И слово, записанное в виде последовательности букв, сохраняется как число (последовательность цифр).

Улучшаем SnakeWPF: добавление списка рекордов

В предыдущей статье мы внесли множество визуальных улучшений в наш SnakeWPF. Сейчас я хотел бы добавить крутую функцию A high score list! (Список рекордов). Кроме того, я бы хотел сделать игру более удобной путем добавления экрана приветствия. Также я заменю непривычное для игр всплывающее окно «You died» («Вы умерли») на дополнительный игровой экран.

Нам понадобится достаточно много дополнительного кода, чтобы это сделать, но давайте начнем с простого — с XAML!

XAML

Первым делом я добавлю большой кусок XAML в окно Snake. Код в основном состоит из 4 новых контейнеров (в данном случае это Border controls), которые будут содержать набор дочерних элементов для поддержки различных сценариев:

  • Первый контейнер будет показывать сообщение «Добропожаловать» при начале игры, информировать о кнопках управления и т.д.
  • Следующий контейнер будет отображать список рекордов
  • Еще один контейнер проинформирует о том, что превзойден один из прежних рекордов, включая TextBox для ввода имени игрока
  • И последний контейнер укажет на гибель игрока без достижения рекорда (и заменит скучный MessageBox, который мы использовали ранее)

Мы добавим эти контейнеры в GameArea Canvas и затем просто спрячем их до тех пор пока они не понадобятся. Как уже говорилось, каждый контейнер будет служить определенной цели и включать немного markup, но мы будем использовать только те элементы управления, которые уже обсуждались ранее.

Приветственное сообщение

Добавьте этот код XAML внутрь элемента управления GameArea Canvas:

 

SnakeWPF
Use the Arrow keys to control the green snake. Make it eat the red apples, but be sure not to crash into the walls or the tail of the snake!
Press SPACE to start!

Здесь коротко говорится, что это за игра, как управлять Змейкой и как начать игру. Border, где находится текст, видим с самого начала, это будет первое, что увидит игрок, когда игра начнется. Внизу экрана я добавил кнопку для показа списка рекордов (который мы добавим через минуту). Управление кликом (Click event handler) мы добавим позже в Code-behind.

Список рекордов

Ну а теперь займемся более сложной частью, потому что я хочу это сделать WPF-способом и использовать привязку данных (data binding) для отображения Списка рекордов вместо создания и обновления этого списка вручную. Но не волнуйтесь, я все объясню по пути. Первым делом, добавьте этот кусок XAML внутрь GameArea Canvas, точно так как мы делали это ранее — Canvas, как упоминалось ранее, будет содержать все наши элементы управления Border, каждый из которых имеет свою собственную функциональность для нашей игры:

 


High Score List
>">




Заметьте что первоначально Border не отображается (Visibility = Collapsed). Мы используем ItemsControl (о котором говорилось ранее), с пользовательским ItemsSource которое мы назвали HighScoreListViewSource. Мы будем использовать CollectionViewSource для того чтобы убедиться, что коллекция (collection), к которой мы привязываемся, была правильно отсортирована. Нам нужно определить этот ресурс в Window XAML, поэтому дабавьте этот фрагмент разметки как дочерний элемент тэга Window, чтобы Window выглядел вот таким образом:

 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfTutorialSamples.Games"
mc:Ignorable="d"
x:Name="window"
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
Title="SnakeWPF - Score: 0" SizeToContent="WidthAndHeight" ContentRendered="Window_ContentRendered" KeyUp="Window_KeyUp"
ResizeMode="NoResize" WindowStyle="None" Background="Black" MouseDown="Window_MouseDown">


" x:Key="HighScoreListViewSource">


.

Обратите внимание, что я добавил новую ссылку: xmlns:scm используемую для доступа к типу SortDescription. Также я добавил свойство x:Name и установил исходное значение window, чтобы мы могли ссылаться на составные определенные в классе MainWindow в Code-behind.

В Window.Resources я добавил CollectionViewSource, который использует привязку для присоединения к свойству HighscoreList, которое мы определим ниже. Также обратите внимание, что я добавляю SortDescription, указывая что список должен быть отсортирован по убыванию по свойству Score. Это означает, что первым будет показан наивысший счет.

В коде ниже мы должны определить свойство HighscoreList, от которого зависит ItemsSource, но мы вернемся к этому после того как мы закончим добавление последнего XAML.

Новый рекорд

Когда игрок побьет предыдущий рекорд мы покажем специальное сообщение с информацие об этом. XAML будет выглядеть вот так, и еще раз, этот код должен быть размещен внутри GameArea Canvas:

  

New Highscore!

Congratulations - you made it into the SnakeWPF highscore list! Please enter your name below.

Все делается просто, TextBox для ввода имени и кнопка Button, которую можно нажать и таким образом добавить имя в список. Позже мы добавим обработчик события (event handler) BtnAddToHighscoreList_Click.

«О нет — вы умерли!»

Последняя часть это экран «О нет, вы умерли и не попали в список рекордов», который мы используем вместо скучного MessageBox, который исполнял ту же функцию раньше. XAML код выглядит вот таким образом:

 

Oh no!
. you died!
Your score:
0
Press SPACE to start a new game!

Этот экран сообщает о неудаче, показывает финальный счет и указывает, как начать игру заново — довольно просто!

C# код

Теперь, когда часть XAML полностью готова, мы можем приступить к написанию соответствующего C# кода. Первым делом реализуем обработчики событий (event handlers), которые мы используем в XAML. Вот код для кнопки «Показать список рекордов» («Show high score list»):

private void BtnShowHighscoreList_Click(object sender, RoutedEventArgs e) 
<
bdrWelcomeMessage.Visibility = Visibility.Collapsed;
bdrHighscoreList.Visibility = Visibility.Visible;
>

Все достаточно просто — при нажатии кнопки мы скрываем сообщение «Добропожаловать» и показываем «Список рекордов» — мы сейчас это добавим.

Создаем список рекордов

Другой обработчик событий (event handler) нужен для того, чтобы добавлять новую запись в Список рекордов, но для этого нам нужно сделать пару добавлений. Первым делом, собственно свойство, которое будет сохранять рекорды:

public ObservableCollection HighscoreList
get; set;
> = new ObservableCollection();

Как видно, это ObservableCollection, содержит тип SnakeHighscore. Первым делом, включите пространство имен (namespace) содержащее тип ObservableCollection:

using System.Collections.ObjectModel;

Затем напишем класс SnakeHighscore:

public class SnakeHighscore
public string PlayerName < get; set; >

public int Score < get; set; >
>

Достаточно простой класс, как вы видите — он служит в качестве контейнера для имени и счета игрока, который достиг списка рекордов.

Загружаем/сохраняем Список рекордов

Нам также нужно написать немного кода, чтобы загружать и сохранять список — метод Save будет вызываться когда новая запись будет записана в список, а метод Load будем вызывать в начале игрыю Я буду использовать простой XML файл для того, чтобы хранить данные для списка, это позволит нам использовать стандартный класс XmlSerializer, с помощью которого легко автоматически загружать и сохранять список.

Существует множество возможностей для загрузки/сохранения данных, и несколько подходящих форматов например JSON или простой текстовый файл (plain text file), но я хотел написать эту часть используя наименьшее количество кода, т.к. это не так важно для изучения WPF. Также, подход XmlSerializer делает код очень гибким — вы легко можете добавить новые свойства в класс SnakeHighScore и они будут автоматически сохранены. Вот мой метод LoadHighscoreList():

private void LoadHighscoreList()
if(File.Exists("snake_highscorelist.xml"))
XmlSerializer serializer = new XmlSerializer(typeof(List));
using(Stream reader = new FileStream("snake_highscorelist.xml", FileMode.Open))
<
List tempList = (List)serializer.Deserialize(reader);
this.HighscoreList.Clear();
foreach(var item in tempList.OrderByDescending(x => x.Score))
this.HighscoreList.Add(item);
>
>
>

Для этого нужно включить в код пару новых пространств имен (namespaces):

using System.IO;
using System.Xml.Serialization;

Не забудьте вызвать метод LoadHighscoreList(), например в конструкторе Window:

public SnakeWPFSample()
InitializeComponent();
gameTickTimer.Tick += GameTickTimer_Tick;
LoadHighscoreList();
>

Теперь создадим метод SaveHighscoreList():

private void SaveHighscoreList()
XmlSerializer serializer = new XmlSerializer(typeof(ObservableCollection));
using(Stream writer = new FileStream("snake_highscorelist.xml", FileMode.Create))
serializer.Serialize(writer, this.HighscoreList);
>
>

Метод Save следует вызывать когда мы добавляем новую запись — это происходит в обработчике событий (event handler) BtnAddToHighscoreList_Click(), который должен выглядеть вот так:

private void BtnAddToHighscoreList_Click(object sender, RoutedEventArgs e)
int newIndex = 0;
// Where should the new entry be inserted?
if((this.HighscoreList.Count > 0) && (currentScore < this.HighscoreList.Max(x =>x.Score)))
SnakeHighscore justAbove = this.HighscoreList.OrderByDescending(x => x.Score).First(x => x.Score >= currentScore);
if(justAbove != null)
newIndex = this.HighscoreList.IndexOf(justAbove) + 1;
>
// Create & insert the new entry
this.HighscoreList.Insert(newIndex, new SnakeHighscore()
PlayerName = txtPlayerName.Text,
Score = currentScore
>);
// Make sure that the amount of entries does not exceed the maximum
while(this.HighscoreList.Count > MaxHighscoreListEntryCount)
this.HighscoreList.RemoveAt(MaxHighscoreListEntryCount);

SaveHighscoreList();

bdrNewHighscore.Visibility = Visibility.Collapsed;
bdrHighscoreList.Visibility = Visibility.Visible;
>

Это достаточно просто: Мы должны решить нужно ли добавлять новую запись в топ списка (как новое лучшее достижение!) или ее стоит разместить ниже. Как только мы получаем новый индекс, мы создаем новый экземпляр класса SnakeHighscore, используя текущий счет и имя, введенное игроком. Затем мы удаляем все ненужные записи снизу списка, если список становится длиннее, чем мы хотим (MaxHighscoreListEntryCount). Затем мы сохраняем список (SaveHighscoreList()) и скрываем контейнер bdrNewHighscore, делая фокус на контейнер bdrHighscoreList.

Однако, остается еще кое-что, что нужно сдеать. Первым делом, эти новые экраны («О нет, вы умерли» и «Список рекордов» и проч.) должны быть скрыты каждый раз когда начинается новая игра. Поэтому верхня часть метода StartNewGame(), который мы написали в прошлый раз, теперь должен выглядеть следующим образом:

private void StartNewGame()
bdrWelcomeMessage.Visibility = Visibility.Collapsed;
bdrHighscoreList.Visibility = Visibility.Collapsed;
bdrEndOfGame.Visibility = Visibility.Collapsed;
.

Следующее, что мы должны сделать это изменить метод EndGame(). Вместо того, чтобы просто показывать MessageBox, мы должны проверить набрал ли игрок достаточно очков, чтобы быть добавленным в Список рекордов или нет. И затем показать соответствующий контейнер:

private void EndGame()
bool isNewHighscore = false;
if(currentScore > 0)
int lowestHighscore = (this.HighscoreList.Count > 0 ? this.HighscoreList.Min(x => x.Score) : 0);
if((currentScore > lowestHighscore) || (this.HighscoreList.Count < MaxHighscoreListEntryCount))
bdrNewHighscore.Visibility = Visibility.Visible;
txtPlayerName.Focus();
isNewHighscore = true;
>
>
if(!isNewHighscore)
tbFinalScore.Text = currentScore.ToString();
bdrEndOfGame.Visibility = Visibility.Visible;
>
gameTickTimer.IsEnabled = false;
>

Главное, что делает этот метод — проверяет есть ли еще свободные места в Списке рекордов (мы определили, что максимально будет 5 записей) или возможно игрок побил один из существующих рекордов. Если так мы разрешаем игроку добавить свое имя с помощью контейнера bdrNewHighscore. Если нового рекорда нет вместо этого мы показываем контейнер bdrEndOfGame. Убедитесь, что константа MaxHighscoreListEntryCount определена.

const int MaxHighscoreListEntryCount = 5;

Я также изменил метод ContentRendered() — теперь, когда у нас есть красивый экран приветствия, мы не хотим, чтобы игра просто запускалась автоматически. Вместо этого мы призываем пользователя нажать Пробел, чтобы начать игру, или нажать на кнопку, чтобы увидеть список рекордов перед началом игры, поэтому мы просто удаляем (или комментируем) вызов StartNewGame().

private void Window_ContentRendered(object sender, EventArgs e) < DrawGameArea(); //StartNewGame(); >

Теперь, закончив все это, начните игру заново, выложитесь по максимуму — и как только игра закончится надеюсь увидите себя в новом списке рекордов Snake WPF!

Обобщая

В этой части мы внесли МНОГО изменений в разработку нашей игры SnakeWPF. Наиболее очевидное это конечно Список рекордов, который потребовал достаточно много добавления кода и XAML, но это того стоило! Вдобавок мы внесли несколько хороших улучшений юзабилити, что делает наш проект все более похожим на настоящую игру.

This article has been fully translated into the following languages:

Is your preferred language not on the list? Click here to help us translate this article into your language!

Игры на Scratch

Игры на Scratch

Курс программирования игр на языке Scratch продолжающего уровня для учеников классов
Ребенку не придётся изучать материал самостоятельно и зубрить его без понимания. Преподаватель объяснит даже сложные темы простым языком, а презентации и интерактивные задания повысят интерес к предмету

Купить полную версию

скидка: 94% выгода: 9410 руб.

Что внутри

формат записи: видео длительность: 258 часов, 30 уроков объем: 7.4 Гб год: 2021 доступ: навсегда сайт: показать

Огромное спасибо за курсы, которые мне были нужны, но я нигде не могла быстро их достать , только у вас мне это удалость. Я нашла и я такая счастливая. Я буду рекомендовать вас всем своим друзьям. Благодарю за быстрое и приятное сотрудничество. Будем в контакте Natalia 27 августа

Отличный, быстрый сервис, отзывчивая тех поддержка в любое время суток решают все вопросы, адекватные цены, никакого обмана, материал приходит сразу после оплаты. Спасибо. Sofia 30 августа

Я в шоке! В приятном шоке. Не верила, что в самом деле можно купить курс за меньшие деньги.Ребята спасибо за работу. Очень бы хотелось купить крус по кройке и шитью Леся 23 мая

Максимально эффективно вместе

О курсе «Игры на Scratch»

Добро пожаловать на курс « Игры на Scratch»! Этот захватывающий обучающий курс, разработанный Романом Никитиным, предлагает уникальную возможность владеющим основами программирования в Scratch ученикам начальной школы значительно улучшить свои проекты.

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

Не откладывайте изучение этого курса — он даст вам возможность раскрыть свой потенциал и стать настоящим профессионалом в программировании!

Пройдя этот курс, вы достигнете следующих результатов:

  • Улучшите свои навыки программирования в Scratch, освоив продвинутый инструмент работы с графикой.
  • Создадите красивое оформление игр с помощью работы с Figma, добавив ярких персонажей и озвучку героев.
  • Узнаете основы геймдизайна и сможете делать игры интересными и привлекательными для игроков.
  • Разработаете мультиплеерные игры с возможностью участия нескольких игроков, настраивая и таблицы рекордов.
  • Освоите процедурную генерацию, которая позволит создавать уровни игр автоматически и упростит процесс .
  • Изучите искусственный интеллект и научитесь создавать компьютерных противников с осмысленным поведением.
  • Познакомитесь с изометрией и трехмерной системой координат, открывая возможность создавать красочные и объемные в Scratch.

Кому нужен этот курс ( Игры на Scratch)

  • Ученикам начальной школы, которые уже владеют основами программирования в Scratch и хотят взять свои проекты на новый уровень.
  • Ребятам, желающим улучшить свои навыки работы с графикой и создавать красивые игры с помощью Figma.
  • Программистам, которые хотят познакомиться с теорией геймдизайна и сделать свои игры интересными и привлекательными для игроков.
  • Любителям мультиплеерных игр, которые хотят настроить и таблицы рекордов для нескольких игроков.
  • Разработчикам, которые заинтересованы в процедурной генерации уровней и упрощении .
  • Людям, которые хотят освоить искусственный интеллект и создавать противников с осмысленным поведением.
  • Творческим личностям, которые хотят расширить свои возможности и создавать красочные в Scratch.

Не упускайте возможность приобрести курс « Игры на Scratch» сегодня! Ускорьте свой прогресс и создавайте захватывающие игровые проекты, вдохновленные новыми знаниями и навыками. Захватите лидерские позиции в мире программирования и разработки игр!

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *