MIDlet Pascal
Поиск по сайту
Форма входа

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0


Яндекс.Метрика

Друзья сайта
IT юмор - развлечения
Заработать в интернете - легко!Просто сиди и кликай.
Суббота, 24.02.2018, 15.06.20
Приветствую Вас Гость | RSS
Главная | Регистрация | Вход
Урок №23 - Таблица рекордов - Хранилище записей RMS
Здравствуйте!В этом уроке Вы научитесь делать любую игру с турнирной таблицей рекордов которая не сотрется при перезапуске приложения.Сам игровой процес я не буду описывать, так как это не касается этого урока и может более заострить внимание на игровом процессе чем на материале из данного урока...Ладно в сторону эту всю болтовню, перейдем к основному!
RMS - это эдакое хранилище в Java в котором можно хранить любую информацию, эдакий реестр, но все ровно это не правильная ассоциация с реестром.Это скорее эдакий файлик в котором хранится информация всех приложений, но другое приложение не имеет доступа к хранилищу нашего приложения, а по этому данные хранимые нашим приложением, не сможет считать другое приложение и наоборот.
И так, давайте приступим к изучению основных процедур/функций по работе с хранилищем записей.

* function OpenRecordStore(name:string):recordstore - Функция открывает хранилище записей с именем name. Если такого хранилища не существует, то создается пустое хранилище с данным именем. 
* function AddRecordStoreEntry(rs:recordStore;data:string):integer - Функция добавляет строку data в хранилище записей rs и возвращает индекс записи внутри хранилища или -1, если произошла ошибка. 
* function GetRecordStoreNextId(rs:recordStore):integer - Функция возвращает следующий незанятый номер записи в хранилище, который будет присвоен записи при добавлении её с помощью функции AddRecordStoreEntry. 
* procedure CloseRecordStore(rs:recordStore) - Процедура закрывает открытое хранилище записей
* function ReadRecordStoreEntry(rs:recordStore;index:integer):string - Функция возвращает информацию, которая хранится в записи под номером index внутри хранилища записей rs. Если такой записи нет, то возвращается пустая строка. 
Теперь определимся с таблицей рекордов.

1.В таблице рекордов 5 записей
2.Записывать в таблицу будет при завершении игры
3.записи будут сортироваться по понижению

И так напишем главный блок кода 

Program StundRMS;
var rs:RecordStore;
    i,score:integer;
Begin 
  repeat
    ... 
    Здесь код игры в с которой в результате выполнения должно быть выполнено условие после until и в переменной score должно быть указано количество набраных балов/очков
    ...
    score:=random(1000)+1; //присваиваем случайное значение рекорду
  until score>0;//условие
  gameover; 
End.

между операторами repeat и until Вам нужно вставить свой код игры.У меня вместо этого подставляется случайное число от 1 до 1000, так как сейчас важнее работоспособность таблици рекордов.После выполнения инструкций операторов repeat until запускаем процедуру gameover, вот в этой то процедуре и происходит самая интерестная часть, а именно:

1.Считывание предыдущих рекордов с хранилища записей
2.Вставка текущего рекорда между большим и меньшим за него значениями
3.Вывод таблицы на экран
4.Сохранение новых результатов в хранилище записей.

И так сейчас введу Вас в некоторые ведомости об особенностях чтения/записи с/в хранилище.И так как записывать/считывать одну строку Вы уже знаете с урока №7 но вот нам нужно считывать/записывать сразу пять строк.Дак вот, особенность состоит в том, что при записи каждой строки в хранилище, нам нужно открывать/закрывать хранилище, иначе он ничего не запишет(либо какойто глюк в компиляторе, либо это нужно делать каким-то другим образом, я не очень много работал хранилищем записи в MIDlet Pascal), ну это впринципе все что я хотел сказать по этому поводу.
Вот код, максимально прокоментированый, процедуры gameover:
procedure gameover;
var records:array [1..5] of integer; //Создаем локальный массив
      j:integer;
begin
  rs:=OpenRecordStore('rec');//открываем RMS с названием "records"  
  //проверку на первое открытие не делаем, так как там по любому есть записи
  for i:=1 to 5 do records[i]:=stringtointeger(ReadRecordStoreEntry(rs,i));//считываем данные в массив
  CloseRecordStore(rs); 
  {между записью и считыванием лучше закрывать/открывать ресурс, иначе могут быть конфликты
  смотрим какую нишу занял текущий рекорд}
  for i:=-5 to -1 do //смотрим побили ли мы рекорд и ставим наш рекорда на определенную нишу
    if records[i*(-1)]<score then  //если мы побили рекорд значит
      begin
        if i*(-1)<5 then records[i*(-1)+1]:=records[i*(-1)]; //если это не последний элемент, тогда подвигаем текущую нишу ниже
        records[i*(-1)]:=score;//записываем в текущую нишу наш рекорд
      end;
  DrawText('Вы заработали:'+score+'$',0,0);
  DrawText('Таблица рекордов:',0,15);
  //по очереди выводим нашу таблицу
  for i:=1 to 5 do DrawText('#'+i+': '+records[i]+'$',0,i*15+30); //выводим построчно результаты
  //предыдущие три строчки заняли 30
  repaint;
  DeleteRecordStore('rec'); //удаляем хранилище для последующей записи
  {
    для записи в хранилище нужно открывать и закрывать хранилище записей, в противном случае оно просто ничего не запишет
  }
  for i:=1 to 5 do //записываем все данные в хранилище записей
    begin
      rs:=OpenRecordStore('rec');//создаем RMS с названием "records"  
      j:=AddRecordStoreEntry(rs,integertostring(records[i]));//записываем все в RMS
      CloseRecordStore(rs);//Закрываем ресурс
    end;
  Delay(5000);//ждем 5 секунд
end;

Вот эта часть кода
  for i:=-5 to -1 do //смотрим побили ли мы рекорд и ставим наш рекорда на определенную нишу
    if records[i*(-1)]<score then  //если мы побили рекорд значит
      begin
        if i*(-1)<5 then records[i*(-1)+1]:=records[i*(-1)]; //если это не последний элемент, тогда подвигаем текущую нишу ниже
        records[i*(-1)]:=score;//записываем в текущую нишу наш рекорд
      end;
может ввести Вас в заблуждение, но из-за того что в цикле for to do значение всегда прибавляется, а нам нужно что бы отсчет шел в обратную сторону я сдела отсчет от -5 до -1, а потом просто умножаем это значение на -1 и получаем желаемый результат.Но давайте теперь поправим меня, так как я это сделал специально что бы Вы поняли что гараздо лучше писать красивый, читабельный, оптимизированый код, чем то что первым взбрело на ум... Мы знаем что на данный момент переменная j не хранит никакой ценной информации по этом мы можем её использовать как отражение переменной i, то есть j:=i*(-1) и вот как теперь выглядит эта часть кода:

for i:=-5 to -1 do //смотрим побили ли мы рекорд и ставим наш рекорда на определенную нишу
  if records[i*(-1)]<score then  //если мы побили рекорд значит
    begin
      j:=i*(-1);
      if j<5 then records[j+1]:=records[j]; //если это не последний элемент, тогда подвигаем текущую нишу ниже
      records[j]:=score;//записываем в текущую нишу наш рекорд
    end;

теперь этот участок кода выглядит намного красивей и читабельней, а со стороны машины, быстродейственее, так как ему не приходится постоянно рассчитывать i*(-1) он это уже сделал.На этом все.
Если вы нашли ошибки/очепятки в тексте то сообщите о них на форуме
А также можете заказать программу/игру на этой странице

www.parkflyer.ru - радиоуправляемые модели, радиоуправляемые модели самолетов, магазин радиоуправляемых моделей
Роспись стен, скульптуры на заказ
Wladymyr © 2012-2018
Создать бесплатный сайт с uCoz