Кто может под мобильный сделать?

Автор timelimit, 01-11-2011, 19:16:33

« предыдущая - следующая »

0 Пользователей и 1 гость просматривают эту тему.

timelimit

Цитата: Proydoha от 05-11-2011, 18:20:10
Цитата: timelimit от 05-11-2011, 18:17:56
А цель программки собственно банальна изучать английские слова, подумал что в такой форме, как плитки, будет интересно...

Цитата: Proydoha от 05-11-2011, 16:58:09
В пару к русскому слову надо найти английское?
В чем ошибка? ))
Или к английскому слову найти русское... ))

Proydoha

Цитата: timelimit от 05-11-2011, 18:42:47
В чем ошибка? ))
Или к английскому слову найти русское... ))

"Да" или "Нет"?

Я понять не могу что надо делать : )

timelimit

Ну раз изучать английский, то думаю что к английскому найти русское... ))

Proydoha

Цитата: timelimit от 05-11-2011, 19:37:52
Ну раз изучать английский, то думаю что к английскому найти русское... ))

Договорились : )

timelimit

Цитата: Proydoha от 05-11-2011, 21:36:23
Цитата: timelimit от 05-11-2011, 19:37:52
Ну раз изучать английский, то думаю что к английскому найти русское... ))

Договорились : )
Спасибо... ))
Рассмотрю варианты как сделать удобнее отображение на экране.... ))

Proydoha

Я делаю вот так:




Кстати почему-то на один столбец и одну строку больше чем надо создаёт, это я не доглядел.

Proydoha

06-11-2011, 03:13:03 #36 Последнее редактирование: 06-11-2011, 03:26:10 от Proydoha
Как-то так.

В папке bin файлы для мобильного, всё остальное - насоздавал MidletPascal 3.4.

В эмуляторе работает нормально : )

2,8,4,6 - навигация
5 - действие
0 - выход в главное меню, если ты в игре

Если открыть винраром файл таймлимит.жар, то можно увидеть файлы Russian.txt и English.txt. Это базы со словами.
Если их изменить, то изменится размер файла .жар
Умные телефоны, такие как мой прекрасный сименс ц75, проигнорируют это.
Глупые скажут:"АХТУНГ! БЕДА! РАЗМЕР .ЖАР-ФАЙЛА НЕ СОВПАДАЕТ С ИНФОРМАЦИЕЙ, ЗАПИСАННОЙ В ФАЙЛЕ .ЖАД!!!"

Если открыть блокнотом таймлимит.жад, то можно увидеть "MIDlet-Jar-Size: 16207"
Это оно.

Код:
[spoiler]program timelimit;
type  card_info = record
      num  : integer;
      word : string;
      end;
const card_w = 10; //Ширина карточки
      card_h = 5;  //Высота карточки
var mode,i,k : integer;
//    s        : string;
    res      : resource;               //Когда мне надо будет открыть текстовый файл, я воспользуюсь этой переменной
    font_img : image;                  //Картинка со шрифтом
    font_img2: image;                  //Картинка с золотым шрифтом
    letter   : image;                  //Промежуточная картинка, в которую записывается буква перед тем, как её нарисуют
    menu     : array [0..5] of string; //Пункты меню
    rows     : integer;                //Количество строк
    columns  : integer;                //Количество столбцов
    cursor_x : integer;                //Положение курсора на игровом поле
    cursor_y : integer;                //Положение курсора на игровом поле
    cursor_c : integer;                //Цвет курсора. От 0 до 255.
    cursor_b : boolean;                //В какую сторону изменяется цвет курсора.
    board    : array [0..30,0..30] of card_info; //Игровое поле. Нету динамических массивов, надо брать с запасом.
    memo_x   : integer;                //Координаты "открытой" карточки
    memo_y   : integer;                //Координаты "открытой" карточки
    popup    : boolean;                //Показывается ли окошко со словом?
    gameover : boolean;                //Все карточки открыты?

function findchar(ch:string): integer; //Функция, ищущая нужный символ в моей импровизированной кодировке и возвращающая его номер.
var font_desc:resource;
    line:string;
    num:integer;
begin
num := 0;
font_desc := openResource('/VN_RU_EN_FONT.txt');
if (resourceAvailable(font_desc)) then
repeat
  line := readLine(font_desc);
  num  := StringToInteger(readLine(font_desc));
{
  setColor(0, 0, 0);
  if line = ch then
  drawText(integertostring(num)+': '+line+' == '+ch, 50, 50);
  if line <> ch then
  drawText(integertostring(num)+': '+line+' <> '+ch, 50, 50);
  repaint;
  delay(1000);
  setColor(255, 255, 255);
  fillRect(0, 0, getWidth, getHeight);
}
  if ch = line then break;
until line='EOF'; //Сверху кусок закомментирован, потому что я написал "until line<>EOF" и рвал волосы:"ПОЧЕМУ ОНО НЕ ИЩЕТ БУКВЫ?!?!?!"
closeResource(font_desc);
findchar := num;
end;

procedure drawstring(s1:string;x,y:integer;font:image); //Процедура, выводящая строку. В ней появилась нужда из-за того, что MP3.4 не дружит с русскими буквами.
var j,num:integer;                                      //Хорошо, что я нарисовал свой шрифт два года назад.
begin
for j:=0 to length(s1) do
begin
  num:=findchar(getChar(s1,j));
  letter := ImageFromImage(font,(num-1)*8,0,8,8);
  drawImage(letter, x+j*8, y);
end;
end;

procedure GameSetup;  //Процедура, подготавливающая игровое поле
var line  : string;
    num   : integer;  //В этих переменных будут храниться разные числа с разными значениями
    num2  : integer;  //Чёрт ногу сломит в моём коду
    nums  : array [0..450] of integer; //Взял с запасом: (30*30)/2
    no_co : boolean;  //Нету совпадений и "на первый-второй рассчитайсь!"
    safety: integer;  //Противостоятор бесконечному циклу
    temp  : card_info;//Буду перемешивать массив - использую
begin
randomize; //Самая любимая процедура в Паскале
cursor_x := 0;
cursor_y := 0;
cursor_c := 255;
cursor_b := true;
memo_x   := -1;
memo_y   := -1;
popup    := false;

safety := 0; //Противостоятор бесконечному циклу
num := 0;    //Собираем номера строк в файлах со словами, которые будут использованы на игровом поле
res := openResource('/English.txt'); //Для этого нужно сперва узнать сколько слов в файлах со словами
if (resourceAvailable(res)) then
repeat
  num  := num+1;
  line := readline(res);
until line = 'EOF'; //Пересчитали. Всего их num.
if (resourceAvailable(res)) then

for i:=0 to (((columns)*(rows))/2) do nums[i]:=0;     //Теперь выберем те из них, которые будут использованы.

for i:=0 to (((columns)*(rows))/2) do                 //Их должно быть (строки * столбцы)/2
begin
  no_co := true;                                       //И не должно быть совпадений
  repeat
   num2:=random(num)+1;
   for k:=0 to ((columns-1)*(rows-1)) do
   if num2 = nums[k] then no_co := false;
   safety := safety+1;
   if safety>600 then break;                           //Противостоятор бесконечному циклу
  until no_co = true;                                  //Бесконечный цикл, если слов меньше, чем карточек
nums[i]:=num2;
end;                                                  //С этого момента в массиве nums у нас есть номера слов. Теперь их надо нанести на игровое поле.
                                                       //По два экземпляра каждого.

no_co:=true;                                          //"на первый-второй рассчитайсь!"
num2 :=0;
for i:=0 to (columns-1) do
  for k:=0 to (rows-1) do
  begin
   if no_co = true  then                               //"Первый!"
   begin
    res := openResource('/Russian.txt');
   end;
   if no_co = false then                               //"Второй!"
   begin
    res := openResource('/English.txt');
   end;
   if (resourceAvailable(res)) then
   for num:=0 to nums[num2] do line := readline(res);
   if (resourceAvailable(res)) then closeResource(res);
   board[i,k].num  := nums[num2];
   board[i,k].word := line;
   no_co := not no_co;
   if no_co = true then num2:=num2+1;
  end;                                                 //Массив заполнен, теперь его надо перемешать.

for i:=0 to (columns-1) do
  for k:=0 to (rows-1) do
  begin
   num :=random(columns);
   num2:=random(rows);
   temp            := board[i,k];
   board[i,k]      := board[num,num2];
   board[num,num2] := temp;
  end;                                                 //Массив перемешан.
i:=0; //Вот это, называется, идиотина использовала переменную-итератор, что бы обозначать выбранные пункты меню, а потом удивлялась:"Почему на один столбец больше создаётся?"
end;

procedure drawcard(x,y:integer);
begin
setColor(200, 200, 200);
fillRect(x, y, card_w, card_h);
setColor(0, 0, 0);
drawRect(x, y, card_w, card_h);
end;

procedure drawcard2(x,y:integer);
begin
setColor(255, 255, 255);
fillRect(x, y, card_w, card_h);
setColor(0, 0, 0);
drawRect(x, y, card_w, card_h);
end;
procedure drawcard3(x,y:integer);
begin
setColor(255, 255, 255);
fillRect(x, y, card_w+1, card_h+1);
end;

procedure drawcursor;
begin
setColor(cursor_c, cursor_c, 0);          //Цвет курсора
if cursor_b then cursor_c := cursor_c - 17 else cursor_c := cursor_c + 17; //"Мигание" курсора
if cursor_c = 255 then cursor_b := true;  //Изменение направления "мигания"
if cursor_c = 0   then cursor_b := false; //Изменение направления "мигания"
drawRect(getWidth/2 - (columns*(card_w+4))/2 - 1 + cursor_x*(card_w+4), getHeight/2 - (rows*(card_h+4))/2 - 1 + cursor_y*(card_h+4), card_w+2, card_h+2); //Рисуем прямоугольник курсора
end;

begin
i        := 0; //Итератор?
mode     := 1; //Режимы игры: 1 - главное меню, 2 - игра, 3 - выход, 4 - game over screen, 5 - экран "паузы". При запуске устанавливаем в еденицу.
rows     := 2; //Количество строк с карточками
columns  := 2; //Количество столбцов с карточками
font_img := loadImage('/VN_RU_EN_FONT.png');      //Шрифт
font_img2:= loadImage('/VN_RU_EN_FONT_GOLD.png'); //Золотой шрифт

res := openResource('/Menu.txt');
if (resourceAvailable(res)) then
begin
  menu[0] := readLine(res);
  menu[1] := readLine(res);
  menu[2] := readLine(res);
  menu[3] := readLine(res);
  menu[4] := readLine(res);
  menu[5] := readLine(res);
  closeResource(res);
end;

repeat

setColor(255, 255, 255);             //Выбрать белый цвет
fillRect(0, 0, getWidth, getHeight); //И зарисовать им экран

if mode = 1 then //Если мы в главном меню
begin

  setColor(0, 0, 0); //Выбрать чёрный цвет и рисовать главное меню средствами, совсем не относящимися к выбору цвета.
  if i = 0 then drawstring(menu[0],getWidth/2-40,10,font_img2) else
  drawstring(menu[0],getWidth/2-40,10,font_img);
  if i = 1 then begin drawstring(menu[1],getWidth/2-40,20,font_img2); drawstring(integertostring(rows),getWidth/2-40+56,20,font_img2); end else
  begin drawstring(menu[1],getWidth/2-40,20,font_img); drawstring(integertostring(rows),getWidth/2-40+56,20,font_img); end;
  if i = 2 then begin drawstring(menu[2],getWidth/2-40,30,font_img2); drawstring(integertostring(columns),getWidth/2-40+80,30,font_img2); end else
  begin drawstring(menu[2],getWidth/2-40,30,font_img); drawstring(integertostring(columns),getWidth/2-40+80,30,font_img); end;
  if i = 3 then drawstring(menu[3],getWidth/2-40,40,font_img2) else
  drawstring(menu[3],getWidth/2-40,40,font_img);
  //drawText('New Game', 10, 10);
  //drawText(IntegerToString(trunc(getHeight/(card_h+2))), 10, 60);
  //drawText(IntegerToString(rows+2), 10, 70);
  //drawText(IntegerToString(rows), 10, 70);
  //drawText(IntegerToString(columns), 10, 80);

  //Обработка нажатий на клавиши:
  if getkeypressed = KE_KEY8 then begin i := i+1; if i>3 then i:=0; end; //Если нажата двойка - перемещаемся на один пункт меню вниз  (В ТЕЛЕФОНАХ КНОПКИ РАСПОЛОЖЕНЫ НЕ ТАК КАК НА НУМПАДЕ!!!)
  if getkeypressed = KE_KEY2 then begin i := i-1; if i<0 then i:=3; end; //Если восьмёрка     - перемещаемся на один пункт меню вверх (В ТЕЛЕФОНАХ КНОПКИ РАСПОЛОЖЕНЫ НЕ ТАК КАК НА НУМПАДЕ!!!)

  //trunc(getWidth /(card_w+2))
  //trunc(getHeight/(card_h+2))

  if getKeyClicked = KE_KEY5 then //Если нажата пятёрка - события в зависимости от выбранного пункта меню
  begin
   if i = 0 then begin GameSetup; mode := 2; end;       //Если выбрана "Новая игра" - создаём игровое поле и переходим во второй режим
   if i = 1 then                                        //Если устанавливаем количество строк, то суммарное количество карточек должно быть чётным и
   begin                                                //количество строк с карточками не должно вылазить за границы экрана
    if odd(columns) then
    begin
     if (rows+2) < (trunc(getHeight/(card_h+4))) then
     rows := rows + 2 else rows := 2;
    end else
    begin
     if (rows+1) < (trunc(getHeight/(card_h+4))) then
     rows := rows + 1 else rows := 1;
    end;
   end;
   if i = 2 then                                         //Та же фигня и с количеством столбцов
   begin
    if odd(rows) then
    begin
     if (columns+2) < (trunc(getWidth/(card_w+4))) then
     columns := columns + 2 else columns := 2;
    end else
    begin
     if (columns+1) < (trunc(getWidth/(card_w+4))) then
     columns := columns + 1 else columns := 1;
    end;
   end;
   if i = 3 then mode := 3;                              //Выход - выход
  end;

end; //Конец событий, происходящих в главном меню

if mode = 2 then //События, происходящие на игровом поле
begin
  for i:=0 to (columns-1) do
   for k:=0 to (rows-1) do
   begin
    drawcard(getWidth/2 - (columns*(card_w+4))/2 + i*(card_w+4),getHeight/2 - (rows*(card_h+4))/2 + k*(card_h+4));
    if (i = memo_x) and (k = memo_y) then drawcard2(getWidth/2 - (columns*(card_w+4))/2 + i*(card_w+4),getHeight/2 - (rows*(card_h+4))/2 + k*(card_h+4));
    if (board[i,k].num = -1) then drawcard3(getWidth/2 - (columns*(card_w+4))/2 + i*(card_w+4),getHeight/2 - (rows*(card_h+4))/2 + k*(card_h+4));
   end;
  drawcursor;
  setColor(0, 0, 0); //Снова чёрный цвет, и снова весь код, связанный с ним, закомментирован.
  //drawText(IntegerToString(rows), 10, 70);
  //drawText(IntegerToString(columns), 10, 80);
  //drawText(IntegerToString(board[cursor_x,cursor_y].num)+' : '+board[cursor_x,cursor_y].word, 10, 70);

  //getWidth/2 - (length(board[cursor_x,cursor_y].word)*8)/2 - 8
  if popup then
  begin
   setColor(255, 255, 255);
   fillRect(getWidth/2 - (length(board[cursor_x,cursor_y].word)*8)/2 - 8, getHeight/2 - 16, length(board[cursor_x,cursor_y].word)*8 + 16, 24);
   setColor(0, 0, 0);
   drawRect(getWidth/2 - (length(board[cursor_x,cursor_y].word)*8)/2 - 8, getHeight/2 - 16, length(board[cursor_x,cursor_y].word)*8 + 16, 24);
   drawstring(board[cursor_x,cursor_y].word,getWidth/2 - (length(board[cursor_x,cursor_y].word)*8)/2,getHeight/2 - 8,font_img);
  end;

  if popup = false then //Если мы смотрим на карточку, то двигаться по полю нельзя
  begin
   if getkeypressed = KE_KEY8 then begin cursor_y := cursor_y + 1; if cursor_y > (rows-1)    then cursor_y := 0;         end; //Вот эти четыре (В ТЕЛЕФОНАХ КНОПКИ РАСПОЛОЖЕНЫ НЕ ТАК КАК НА НУМПАДЕ!!!)
   if getkeypressed = KE_KEY2 then begin cursor_y := cursor_y - 1; if cursor_y < 0           then cursor_y := rows-1;    end; //строки - это   (В ТЕЛЕФОНАХ КНОПКИ РАСПОЛОЖЕНЫ НЕ ТАК КАК НА НУМПАДЕ!!!)
   if getkeypressed = KE_KEY6 then begin cursor_x := cursor_x + 1; if cursor_x > (columns-1) then cursor_x := 0;         end; //навигация по игровому
   if getkeypressed = KE_KEY4 then begin cursor_x := cursor_x - 1; if cursor_x < 0           then cursor_x := columns-1; end; //полю
  end;
  if getkeypressed = KE_KEY0 then begin mode := 5; i:=0; end;
  if getKeyClicked = KE_KEY5 then //Обрабатываем нажатие на самую главную кнопку
  begin
   IF (BOARD[CURSOR_X,CURSOR_Y].NUM <> -1) THEN
   BEGIN
    if popup then popup := false else
    begin
     if (memo_x = -1) and (board[cursor_x,cursor_y].num <> -1) then
     begin
      memo_x := cursor_x;
      memo_y := cursor_y;
      popup  := true;
     end else
     if (memo_x = cursor_x) and (memo_y = cursor_y) then popup := true else
     if board[memo_x,memo_y].num = board[cursor_x,cursor_y].num then
     begin
      popup := true;
      board[memo_x,memo_y].num     := -1;
      board[cursor_x,cursor_y].num := -1;
      memo_x:=-1;
      memo_y:=-1;
     end else
     begin
      memo_x:=-1;
      memo_y:=-1;
      popup := true;
     end;
    end;
   END else if popup then popup:=false;
  end;

  gameover := true;
  for i:=0 to (columns-1) do
   for k:=0 to (rows-1) do
   begin
    if board[i,k].num <> -1 then gameover := false;
   end;
  if gameover and (popup = false) then mode := 4;
  i:=0;
end; //Конец событий, происходящие на игровом поле

if mode = 4 then //Игра окончена
begin
  drawstring(menu[4],getWidth/2-length(menu[4])*4,10,font_img); //"Игра окончена"
  if getKeyClicked = KE_KEY5 then begin mode := 1; i:=0; end;   //Пятёрка, что бы попасть в главное меню
end; //Конец экрана конца игры

if mode = 5 then //Экран "паузы"
begin
  if i = 0 then drawstring(menu[5],getWidth/2-40,10,font_img2) else
  drawstring(menu[5],getWidth/2-40,10,font_img);
  if i = 1 then drawstring(menu[3],getWidth/2-40,20,font_img2) else
  drawstring(menu[3],getWidth/2-40,20,font_img);

  if getkeypressed = KE_KEY8 then begin i := i+1; if i>1 then i:=0; end; //Если нажата двойка - перемещаемся на один пункт меню вниз  (В ТЕЛЕФОНАХ КНОПКИ РАСПОЛОЖЕНЫ НЕ ТАК КАК НА НУМПАДЕ!!!)
  if getkeypressed = KE_KEY2 then begin i := i-1; if i<0 then i:=1; end; //Если восьмёрка     - перемещаемся на один пункт меню вверх (В ТЕЛЕФОНАХ КНОПКИ РАСПОЛОЖЕНЫ НЕ ТАК КАК НА НУМПАДЕ!!!)
  if getKeyClicked = KE_KEY5 then
  begin
   if i = 0 then begin mode := 2;         end;
   if i = 1 then begin mode := 1; i := 0; end;
  end;
end; //Конец экрана "паузы"

{if getkeypressed = KE_KEY0 then mode := 3;} //Это аварийный выход, не зависящий от режима игры. Его надо закомментировать после того, как программа будет дописана.

repaint;    //Нарисовать на экране всё то, что было нарисовано в задний буфер
delay(100); //Подождать 100 милисекунд

until mode = 3; //Программа выполняется пока режим не установится в положение "3".

end.
[/spoiler]

Proydoha

06-11-2011, 14:36:21 #37 Последнее редактирование: 06-11-2011, 14:46:45 от Proydoha
Проверил на своём телефоне.

Главное меню тормозит адово, но всё остальное работает нормально.

А тормозит, наверное, потому, что открывает и прочитывает текстовый файл ~340 раз в секунду. Это, очевидно, было не лучшей моей идеей.

Sasha

Посмотри в инете буферизацию в память.
skype: ab.sasha

Proydoha

Цитата: Sasha от 06-11-2011, 15:17:44
Посмотри в инете буферизацию в память.

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

Или даже в массив букв.

timelimit

На сенсорном телефоне не работает, даже на физической клавиатуре (нокия N97).
На нокии N73 не переключается кол-во столбцов и строк.
Сильно маленький размер шрифта, плохо видно...
Я правильно понял, определяется соответствие слов по порядку в файле?
Т.е. 10-е по порядку слово соответствует 10-му слову в другом файле?
Пока такие замечания...
И есть другое задание(практически конкурс по программированию )))...

Proydoha

Цитата: timelimit от 07-11-2011, 20:45:44
На сенсорном телефоне не работает, даже на физической клавиатуре (нокия N97).
На нокии N73 не переключается кол-во столбцов и строк.

Лэтц фигер ит аут тугезэр
Для "Keypad Access" используется три функции:
GetKeyClicked - возвращает code of the last clicked key on the keypad, or KE_NONE if no key is pressed.
GetKeyPressed - возвращает code of the key that is currently pressed, or KE_NONE if no key is pressed.
И KeyToAction. Он загадочный, я не понимаю как он работает.

ЦитироватьDifferent devices have different key mappings. For example, one device may have FIRE key return key code 100, and the other device may have its FIRE key return key code 120. To avoid this problem, you can use the keyToAction function that translates the key code into mapped game actions.

Я сперва отслеживание нажатия на кнопки повесил на ГетКейПрессд. В итоге, нажимая на новую игру, он заодно ещё и успевал клацнуть по карточке. И после геймовера проклацивал геймовер скрин, главное меню и начинал игру заново. Это было не очень хорошо и для осознавания нажимания на пятёрку я стал использовать ГетКейКликед.

Перемещение осталось на ГетКейПрессед потому что если я заменял все ГетКейПрессед на ГетКейКликед, то он (почему-то) отлавливал нажатие только на одну из кнопок. Например только восьмёрку: по пунктам меню прыгать могу, а больше ничего не могу.

Это в эмуляторе.

ЦитироватьСильно маленький размер шрифта, плохо видно...

Убогий МидлетПаскаль создавался нерусскими дядьками и с русским языком не дружен. При попытке запуска мидлета, в коде которого есть присвоение строковым переменным русских букв, эмулятор тупо вылетает. Я проверил что будет, если прочитать файлы с русскими буквами: он прочитал их в виде каракулей. Мне этого было достаточно, что бы осознавать соответственно какой каракуле какую картинку выводить. Шрифт 8х8 пикселей я из нездорового интереса нарисовал ещё два года назад. Более крупных его вариаций у меня нет

: (

ЦитироватьЯ правильно понял, определяется соответствие слов по порядку в файле?
Т.е. 10-е по порядку слово соответствует 10-му слову в другом файле?

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

timelimit

Почти понял последний ответ... ))
Но все равно спасибо за проявленный интерес...
Может там Саша что нить придумает, когда время будет... ))