Четверг, 28 Ноября 2024, 02:50

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Помогите с MySql кодом.
NizariusДата: Воскресенье, 28 Июля 2013, 03:20 | Сообщение # 1
был не раз
Сейчас нет на сайте
В общем, прохожу обучающий урок по созданию Травиана (как примера браузерной стратегии), но там был устаревший Денвер. Теперь у меня mysql 5.5 и данный код не подходит. Мне надо создать игровую карту с двумя координатами (x и y).

Вот описание кода в уроке: "Сейчас, перед нами возник вопрос инициализации всех полей в создаваемой нами игре. Конечно мы может 255 раз написать SQL-запрос INSERT, но это не интересно и поступило предложение сделать хранимую процедуру на языке mySQL, чтоб генерация участков в таблице fields выглядела более компактно. Так как мы планируем не более 4 типов картинок для незанятых под поселки участков, то, следовательно процедура должна случайным образом формировать значение в поле fid_type таблицы fields. Но если Вы, вдруг, захотите увеличить количество картинок до 5 или 10, то лучше это предусмотреть сразу и, поэтому, мы будет передавать в процедуру генерации полей два аргумента:

1 - начальный номер генерируемого поля
2 - конечный номер генерируемого поля

В строке 1 мы объявляем создание процедуры с именем makefields и указываем, что ей нужно передавать два аргумента (param1 и param2, оба имеющие тип - целое число (int)). В строках с 4-6 мы объявляем три переменные x,y и st, которые будем использовать далее. В строках 7-8 мы открываем два цикла по координатам x и y (это обе наши ранее объявленные переменные). Так как каждый из этих циклов повторяется с 1 до 15, то, все что идет далее до строки 12 - повторится 15х15=225 раз. А это, не что иное как строки с 9 по 11. В 9 строке мы генерируем случайное число в диапазоне от param1 до param2. Это стандартная формула создания диапазона случайных чисел. И если мы передадим в процедуру makefields аргументы 1 и 4, то в строке 9 в переменную st сгенерируется число от одного до четырех и никак не иначе.
Далее, в строке 10 Вы видите оператор SQL INSERT , который вставляет значения переменных x,y и сгенерированного значения переменной st в подготовленную нами ранее таблицу fields"

Вот сам код:

Код
create procedure makefields (param1 int, param2 int)
BEGIN
declare x int default 1;
declare y int default 1;
declare st int default 0;
WHILE y <= 15 DO
WHILE x <= 15 DO
SET st = RAND()*10 / (10 + 1) * ((param2 - param1) + param1)+0.5;
insert into fields (xcoord,ycoord,fid_type) values (x,y,st);
SET x = x+1;
END WHILE;
SET x = 1;
SET y = y+1;
END WHILE;
END;

CALL makefields(1,4);


MySQL выдает ошибку: "Неполное SQl выражение" и указывает на строчку с "END;"

Такие процедуры повторяются пять раз в коде игры. И везде выдается данная ошибка с указанием на END. Объясните плиз, что надо исправить.


Сообщение отредактировал Nizarius - Воскресенье, 28 Июля 2013, 03:21
HerrPotapovДата: Воскресенье, 28 Июля 2013, 19:08 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
Интересное дело. Такая ошибка при поиске в гугле появляется только один раз... В этой теме.
Пожалуйста, скопируй реальный текст ошибки

Добавлено (28.07.2013, 19:08)
---------------------------------------------
А вообще попробуй добавить вот это. Насколько я знаю это опционально, но все же.

Код

CREATE PROCEDURE `makefields` (IN param1 INT, IN param2 INT)   
    LANGUAGE SQL    
    NOT DETERMINISTIC    
    SQL SECURITY DEFINER    
    COMMENT 'A procedure'    
BEGIN
...


Discord: alpotapov#1741

Интервью с разработчиком WarCastle - Читаем и вникаем!


Сообщение отредактировал HerrPotapov - Воскресенье, 28 Июля 2013, 19:10
NizariusДата: Воскресенье, 28 Июля 2013, 20:12 | Сообщение # 3
был не раз
Сейчас нет на сайте
Цитата (HerrPotapov)
Интересное дело. Такая ошибка при поиске в гугле появляется только один раз... В этой теме.
Пожалуйста, скопируй реальный текст ошибки


Эта ошибка выдается в программе dbForge Studio for MySQL. Если вводить в самой базе данных (через денвер), то ошибка выдается следующая:

Код
"SQL-запрос:

BEGIN DECLARE x INT DEFAULT 1;

Ответ MySQL:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'declare x int default 1' at line 2 "

Добавлено (28.07.2013, 20:12)
---------------------------------------------
А всё, спасибо за помощь. Надо теперь писать с delimiter.
Код должен был выглядеть так:

Код
DELIMITER //

create procedure makeresfields (p_fid int)
BEGIN
  -- Фермы  
  insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (253,280,1,p_fid);
  insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (304,273,1,p_fid);
  insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (262,332,1,p_fid);   
  insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (315,325,1,p_fid);  
  insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (461,360,1,p_fid);
  insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (386,196,1,p_fid);  
  -- Рудники
  insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (269,228,2,p_fid);  
  insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (434,305,2,p_fid);  
  insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (490,306,2,p_fid);  
  insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (483,249,2,p_fid);  
  -- Лес
   insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (323,195,3,p_fid);
   insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (446,210,3,p_fid);
   insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (362,391,3,p_fid);   
   insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (381,346,3,p_fid);   
  -- Глина
   insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (360,236,4,p_fid);
   insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (425,255,4,p_fid);
   insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (308,378,4,p_fid);
   insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (412,394,4,p_fid);
END//

DELIMITER ;               

CALL makeresfields(49);
CALL makeresfields(67);


Сообщение отредактировал Nizarius - Воскресенье, 28 Июля 2013, 20:00
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг