Сохранение очков и рекордов. Облачные Данные 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…

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

- https://scratch.mit.edu/projects/303373707/ — Сколько лет Scratcher-ам с вычислением среднего возраста пользователей, выполнивших проект, и подсчётом их количества.
- http://scratch.aelit.net/igra-google-dino/ — GOOGLE Dino.
- https://scratch.mit.edu/projects/118210723/ — 3д платформер с таблицей рекордов. Здесь используется шифрование (кодирование) символьных данных (имён пользователей) для их сохранения. Таблица рекордов выглядит следующим образом: Как это сделать, частично можно узнать из Скретч ВИКИ в разделе «Облачный список» (см. по ссылке ниже).
Дополнительные источники
Ещё об использовании облачных переменных в Scratch можно почитать на страницах русскоязычной Скретч ВИКИ:
- Облачная переменная.
- Облачный список – здесь рассматривается задача кодирования (шифрования) символьных данных (букв, из которых состоят слова), если требуется с помощью облачной переменной сохранить строковые данные. В результате, каждая буква получает в соответствие некоторое число. И слово, записанное в виде последовательности букв, сохраняется как число (последовательность цифр).
Игры на Scratch
![]()
Курс программирования игр на языке Scratch продолжающего уровня для учеников классов
Ребенку не придётся изучать материал самостоятельно и зубрить его без понимания. Преподаватель объяснит даже сложные темы простым языком, а презентации и интерактивные задания повысят интерес к предмету
Купить полную версию
скидка: 94% выгода: 9410 руб.
Что внутри
формат записи: видео длительность: 258 часов, 30 уроков объем: 7.4 Гб год: 2021 доступ: навсегда сайт: показать
Выбрала, оплатила, получила на почту, скачала — всё это заняло 5 минут)) фантастика) благодарю, буду изучать ) Анна 13 ноября 2023
Впервые здесь покупаю. Оплатила , сразу же пришла ссылка на почту и в личный кабинет . Очень оперативно )) Анна 13 ноября 2023
Все купленые мною курсы хорошего качества, без лагов и подвохов. Всё соответствует описаниям. Поддержка работает. Хороший сервис, спасибо создателю! Ariadna 17 декабря 2023
Максимально эффективно вместе
О курсе «Игры на Scratch»
Добро пожаловать на курс « Игры на Scratch»! Этот захватывающий обучающий курс, разработанный Романом Никитиным, предлагает уникальную возможность владеющим основами программирования в Scratch ученикам начальной школы значительно улучшить свои проекты.
Что делает этот курс особенным? , он предоставляет доступ к новому инструменту работы с графикой, который позволит вам вывести ваши проекты на новый уровень. , вы познакомитесь с теорией геймдизайна и научитесь создавать первые в Scratch.
Не откладывайте изучение этого курса — он даст вам возможность раскрыть свой потенциал и стать настоящим профессионалом в программировании!
Пройдя этот курс, вы достигнете следующих результатов:
- Улучшите свои навыки программирования в Scratch, освоив продвинутый инструмент работы с графикой.
- Создадите красивое оформление игр с помощью работы с Figma, добавив ярких персонажей и озвучку героев.
- Узнаете основы геймдизайна и сможете делать игры интересными и привлекательными для игроков.
- Разработаете мультиплеерные игры с возможностью участия нескольких игроков, настраивая и таблицы рекордов.
- Освоите процедурную генерацию, которая позволит создавать уровни игр автоматически и упростит процесс .
- Изучите искусственный интеллект и научитесь создавать компьютерных противников с осмысленным поведением.
- Познакомитесь с изометрией и трехмерной системой координат, открывая возможность создавать красочные и объемные в Scratch.
Кому нужен этот курс ( Игры на Scratch)
- Ученикам начальной школы, которые уже владеют основами программирования в Scratch и хотят взять свои проекты на новый уровень.
- Ребятам, желающим улучшить свои навыки работы с графикой и создавать красивые игры с помощью Figma.
- Программистам, которые хотят познакомиться с теорией геймдизайна и сделать свои игры интересными и привлекательными для игроков.
- Любителям мультиплеерных игр, которые хотят настроить и таблицы рекордов для нескольких игроков.
- Разработчикам, которые заинтересованы в процедурной генерации уровней и упрощении .
- Людям, которые хотят освоить искусственный интеллект и создавать противников с осмысленным поведением.
- Творческим личностям, которые хотят расширить свои возможности и создавать красочные в Scratch.
Не упускайте возможность приобрести курс « Игры на Scratch» сегодня! Ускорьте свой прогресс и создавайте захватывающие игровые проекты, вдохновленные новыми знаниями и навыками. Захватите лидерские позиции в мире программирования и разработки игр!
Покупайте курс сейчас и откройте двери к увлекательному миру программирования на 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!
Как создать таблицу рекордов в игре? [закрыт]
Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме.
Закрыт 7 лет назад .
Я создал классическую игру змейка на C# с уровнями счетом и т.д., но я захотел сделать таблицу рекордов и у меня не получается, т.к. подсказали сделать на xml, но я с ним некогда не работал. Как это можно реализовать? А именно надо создать на 5 полей где будет написано имя и счет и при наличии большего счета заменить имя и счет.
Отслеживать
13.7k 12 12 золотых знаков 43 43 серебряных знака 75 75 бронзовых знаков
задан 26 мая 2016 в 11:25
илья витюк илья витюк
139 3 3 серебряных знака 13 13 бронзовых знаков
Я бы использовал sqllite или JSON. XML все-таки это как пушкой по воробьям.
26 мая 2016 в 12:03
ну я так бы не сказал конечно может и так но все-же мне будет удобней на xml (да, вот такой я человек)
26 мая 2016 в 12:05
Ну если XML, то на хабре очень хорошая статья. Многое зависит от Ваших требований, которые будут расти с процессом разработки игрушки. Точный код или пример Вам тут смогут подсказать если выложите структуры записей Вашей программы
26 мая 2016 в 12:12
Статья очень занимательная но там ничего несказанно как заменить
26 мая 2016 в 12:22
Это была 1 часть а можете мне найти 2 часть?
26 мая 2016 в 12:26
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Вот мой пример на JSON , если Вам подойдет конечно, использует JavaScriptSerializer !! требует System.Web.Extensions !!
//Ваш класс записи рекорда public class MyRecord < public string Name < get; set;>public int Record < get; set;>>
Как записать лист рекордов в текстовую переменную
//Запись в текстовую переменную forWriteToFile List allRecords = new List(); . //Тут заполнение allRecords . System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); string forWriteToFile = serializer.Serialize(allRecords );
Как прочитать лист рекордов из текстовой переменной
//Чтение из текстовой переменной forWriteToList System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); List allRecords = serializer.DeserializeObject(forWriteToList);
UPD: Пример редактирования
string JSON = Прочитать_Всё_Из_Файла("Рекорды.txt");//тут прочитали из файла в текстовую переменную JSON System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); List allRecords = serializer.Deserialize(JSON); allRecords.RemoveAt(1);//Удалили вторую запись foreach(MyRecord record in allRecords) record.Record++;//Увеличили все рекорды на единицу allRecords.Add(new MyRecord());//Добавили запись JSON = serializer.Serialize(allRecords); //Записали обратно в переменную JSON Записать_В_Файл("Рекорды.txt", JSON);//Далее напишите запись текста в файл
Отслеживать
ответ дан 26 мая 2016 в 12:21
Дмитрий Чистик Дмитрий Чистик
3,132 12 12 серебряных знаков 28 28 бронзовых знаков
А как изменить ?
26 мая 2016 в 12:27
Читаете, меняете или удаляете или добавляете в лист Ваши рекорды и записываете. Намноооого проще XML
26 мая 2016 в 12:28
Ну если XML, то на хабре очень хорошая статья. Многое зависит от Ваших требований, которые будут расти с процессом разработки игрушки. Точный код или пример Вам тут смогут подсказать если выложите структуры записей Вашей программы – Дмитрий Чистик Статья очень занимательная но там ничего несказанно как заменить – илья витюк Это была 1 часть а можете мне найти 2 часть?
26 мая 2016 в 12:29
Для начала придется завести класс или структуру для хранения информации о игроке, например такую:
struct PlayerInfo
В простейшем случае будет достаточно структуры, однако ее в любой момент можно преобразовать в полноценный класс, а заодно и разобраться, чем структуры .NET отличаются от классов (тут уже не раз отвечали на этот вопрос).
Далее создаем хранилище для наших рекордов,
List() recordTable = new List();
прекрасно подойдет для этой цели.
В процессе работы программы, редактируем наш List как обычный массив, в начале программы загружаем в него значения из файла, в конце — выгружаем в файл.
Для хранения на диске, подойдет простой текстовый формат в котором одна строка хранит информацию об одном игроке, а значения разделены точкой с запятой, а ля .csv , например: «Вася Пупкин;100500» . В последствии можно доработать до полноценного .csv или более сложного формата. Не стоит сразу браться за XML, да и для такого простого случая он явно избыточен, либо автор что-то не договаривает =)
Остается реализовать сохранение и загрузку таблицы рекордов, в предложенном варианте с текстовым форматом, все делается построчными чтением и записью в файл, как это сделать есть в официальной документации на MSDN, на этом и многих других ресурсах, поэтому без подробностей.
Для удобства можно добавить в структуру/класс методы для удобного преобразования значений:
public void SetFromCsv(string csvStr) < string[] fields = csvStr.Split(';'); Name = fields[0]; Score = int.Parse(fields[1]); >public string GetCsvString() < return string.Format(";", Name, Score); >
Если все же очень хочется XML, то смотрите в сторону использования XDocument и/или XElement. Они имеют встроенные средства загрузки и сохранения xml-файлов простым указанием полного имени нужного файла. Однако замечу, что сортировать ноды внутри XElement.Nodes , в отличие от List , одной строчкой кода не получится, только руками, последовательно удаляя и создавая ноды в нужном порядке. Поэтому Использовать XML имеет смысл исключительно для хранения и загрузки, а все остальные действия выполнять над List .