Что такое "Змейка" и как с ней бороться?

Введение
Сразу отвечу на первый вопрос. "Змейка" это игра, в которой вы управляете полоской, набирая очки. Цель у игры одна: набрать наибольшее количество очков.

Как-то увидел я на сотовом телефоне эту игру, и уж очень мне захотелось написать точно такую же. В этой статье хочу рассказать, как написать "змейку". С какими проблемами можно столкнуться при создании "змеек". И попробую рассказать, как я их решал.

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

Поле действии "змейки" - массив
Начнем с того, что нам надо придумать то, по чем наша змейка будет двигаться. Лично я вижу всего два способа. Один - это когда змейка движется по абсолютно пустому пространству. Второй же способ - массив. Именно этот способ я выбрал в своем примере. Мне кажется, что при использовании массива открываются некоторые довольно приятные возможности, такие как создание карт, и, вместе с тем, при создании многопользовательской змейки будет удобнее делать проверки.

Из чего состоит "змейка"?
Прежде чем приступать к внутренности "змейки" давайте посмотрим как она движется.

Движение змейки можно рассмотреть с двух сторон:

Первая - это то, что конец змейки становится началом. Плюсы: нам легче будет прорисовывать. Нам не надо постоянно перерисовывать весь массив, нам надо всего лишь затереть конец змейки и нарисовать начало. Такой метод будет очень удобен при работе в DOS.

Минусы: у нас возникают проблемы с опознаванием первого и последнего элементов, а добавление нового элемента тоже будет немало проблем, при какой-либо ошибку у нас может потерятся часть змейки, поверьте в прошлом году при написании "змейки" на Pascal'е у меня было очень много таких "глюков", причем только в многопользовательской игре.

Вторая сторона - каждый элемент змейки становится на место предыдущего. Плюсы: мы всегда знаем, где какой элемент; добавление и удаление будут делаться буквально несколькими строками в коде; у нас ни в коем случае не может потеряться элемент, т.к. мы всегда знаем все.

Минусы: нам надо больше места в ОП для сортирования всех этих элементов.

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

Первый - создать большой массив для змеи и хранить в нем все координаты. Плюсы: плюс один - простота.

Минусы: а когда у нас появится две змейки нам что делать два массива? а три? а четыре? Нет это совершенно не подходит, это занимает много места в ОП, и мы ограниченны длинной змейки. Существуют конечно функции для задания массива SetLength, но при ее использовании появляется ограничение на длину массива, всего 255.

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

Минусы: нам надо будет больше писать (конечно это не самое главное, главное чтобы пользователь был доволен)

Не знаю как вам, а мне второй вариант больше нравится, потому его и реализуем.

Что нам стоит "змею" построить?
Мы уже решили, что элементы нашей "змейки" будут представлять динамическую структуру, тогда элемент змейки будет выглядеть следующим образом:

	type
	  TElem = ^TStek;	//объект не может ссылаться сам на себя
	  TStek = record
	    X: integer;		//координата по X 
	    Y: integer;		//координата по Y
	    View: Byte;		//вид этого элемента при прорисовке
	    Nomber: Word;	//номер элемента
	    Next: TElem;	//следующий элемент змейки
	    Prev: TElem;	//предыдущий элемент змейки
	  end;
	
Сама же змейка будет выглядеть следующим образом - это объект, у которого есть свойства цвет (много змеек - много цветов), длина (в принципе этот параметр можно не вводить, можно узнать длину по номеру последнего элемента, но пусть будет), направление (очень важный параметр, мы же должны знать, куда движется "змейка").

Направлений у нас будет всего 4 соответственно
	TDir = 1..4; //образованно от Direction

	TSnake = object
	  First: TElem;		//первый элемент змейки
	  Last: TElem;		//последний элемент змейки
	  Direction: TDir;	//направление змейки
	  Length: Word;		//длина змейки
	  Color: TColor;		//цвет змейки
	  constructor Create(sDirection: TDir; sLength: Word; sX, sY: Byte; sColor: TColor);
	  //процедура создания змеи
	  destructor Destroy;
	  //процедура уничтожения змеи

	  procedure Release;
	  //процедура, выводящая всю змею на массив (чтобы знать где расположена змея, вдруг
	  //будем вставлять алгоритм поиска пути или еще что в голову придет)

	  procedure Draw(Canvas: TCanvas); 
	  //отрисовывает змею на канвасе (на канвасе, потому, что пример не показывает работу
	  //с Win32API

	  procedure DrawElement(Elem: TElem; Canvas: TCanvas); 
	  //отрисовывает определенный элемент змеи

	  procedure Move(newX, newY: word); 
	  //двигает все элементы змейки на место предыдущего, а первый на новые координаты
	  //можно с помощью этой процедуры двинуть змейку вообще в какое-нибудь случайное
	  //место, а все элементы потом "телепортируются" туда
	  procedure Add;                     
	  //добавляет к змейке элемент (последний)
	  procedure Remove;              
	  //уничтожает элемент змейки (последний)

	  function GetByNomber(Nomber: Word): TElem; 
	  //находит элемент по номеру
	  function GetByCoord(X, Y: word): TElem;         
	  //находит элемент по координатам

	  //Вдруг да понадобится найти элемент с определенным номером или расположением

	  function SetDirection(sDirection: TDir): boolean;
	  //Устанавливает направление змейки
	  //Делается функцией, чтобы змейка не поехала в противоположную сторону

	  procedure SetView(sView: byte);  
	  //Устанавливает вид всей змеи (ну захотелось все змею сделать круглой - сделай!!!)
	end;
Наконец код
Функция создания змейки

При создании мы должны установить цвет, направление, длину, стартовые координаты. Чтобы сильно не мучаться, моя змейка создается в горизонтальном положении, а в процедуре задаются координаты конца.
	constructor TSnake.Create(sDirection: TDir; sLength: Word; sX, sY: Byte; sColor: TColor);
	var
	  i: integer;
	  Beg, Tek, Tek2: TElem;
	begin
	  if sDirection = 3 then Direction := 1 else Direction := sDirection;
	  Length := sLength;
	  Color := sColor;

	  First := nil;
	  Last := nil;

	//делаем проверку на правильное введение координат
	//проверяем, что не вышли за рамки массива
	  if (sX<1) or (sX>AMaxX) or (sY<1) or (sY>AMaxY) or ((sX+sLength)>AMaxX) then
	  begin
	    ShowMessage('Ошибка создания змейки');
	    exit
	  end;

	  if sLength=0 then begin ShowMessage('Ошибка создания змейки'); exit end;
	  new(Beg); //создаем первый элемент змейки

	  Beg^.X := sX + sLength; 	//координата по X - координата конца + длинна
	  Beg^.Y := sY;		 	//по Y все координаты одинаковые
	  Beg^.View := 0;		//вид самый простой
	  Beg^.Nomber := 1;		//номер естественно первый
	  Beg^.Next := nil;		//следующего элемента пока нет
	  Beg^.Prev := nil;		//предыдущего тоже

	  first := beg;			//запомнили первый элемент змейки
					//с этого момента в змейке есть первый элемент уррра!!! 

	  Tek := beg;			//текущий элемент - первый
	  if sLength-1 < 1 then exit;	//если длина 1 тогда ВСЕ


	  for i := 1 to (sLength-1) do begin //иначе начинаем

	    new(Tek2);  			//создаем новый элемент

	    Tek2^.X := Tek^.X - 1; 		//располагаем новый элемент левее
	    Tek2^.Y := Tek^.Y;   		//по оси Y все находятся одинаково
	    Tek2^.View := 0;     		//стартовый вид у всех одинаковый
	    Tek2^.Next := nil;   		//следующий элемент должен быть тот, который мы до этого 
	//создали
	    Tek2^.Prev := Tek;   		// предыдущего пока не существует

	    Tek2^.Nomber := Tek^.Nomber + 1; //прибавляем номер

	    Tek^.Next := Tek2;		//предыдущему ставим существование следующего
	    Tek := Tek2;			//текущий - вновь созданный
	    Last := Tek2;			//последний созданный элемент - это и есть последний 
	//элемент змейки
	  end;
	end;
Вот мы и создали нашу змейку. Теперь надо написать процедуру уничтожения, чтобы в памяти не осталось следов.
	destructor TSnake.Destroy;
	var Tek, Tek2: TElem;
	begin
	  Tek := First;
	  if tek = nil then exit; 		//вдруг змеи нет

	  while tek^.Next <> nil do begin
	    Tek2 := Tek.Next;
	    dispose(tek2);			//уничтожаем
	    tek := tek2;
	  end;
	end;
Далее рассмотри, как рисовать змейку.
	procedure Tsnake.DrawElement(Elem: TElem; anvas: TCanvas);
	var Rect: TRect;
	begin
	  Rect.Left := Elem.X * 5;
	  Rect.Top := Elem.Y * 5;
	  Rect.Bottom := Rect.Top + 5;
	  Rect.Right := Rect.Left + 5;

	  Canvas.Pen.Color := clBlack;
	  Canvas.Brush.Color := Color;
	  case Elem.View of
	  0: Canvas.Rectangle(Rect); 	//тут мы можем сделать и что-нибудь другое, например
	//кружочек вместо квадрата в зависимости от вида
	  end;
	end;
А теперь самое интересное. Рассмотрим функцию движения.

В змейке движение происходит следующим образом: Первый элемент передвигается согласно текущему направлению, а второй становится на место первого, третий на место второго и т.д. Значит, каждый элемент занимает место предыдущего кроме первого. Ну, так давайте это реализуем.
	function TSnake.Move(newX, newY: word): boolean;
	var 
	  tek: TElem;
	  tek2: TElem;
	begin
	  result := false;
	  if First = nil then exit;

	  tek := last;

	  if newX > AMaxX then newX := 1;
	  if newX < 1 then newX := AMaxX;
	  if newY > AMaxY then newY := 1;
	  if newY < 1 then newY := AMaxY;

	  Release;

	  if GameA[newX, newY] > 0 then result := true;

	  while tek^.Prev <> nil do begin
	    tek2 := tek^.Prev;		//предыдущий элемент
	    tek^.X := tek2^.X;		//координаты предыдущего
	    tek^.Y := tek2^.Y;		//элемента
	    tek^.View := tek2^.View;	//вид предыдущего
	    tek :=tek2;			//заново
	  end;

	  First^.X := newX;		//перемещаем начало
	  First^.Y := newY;		//на новые координаты
	end;
Далее надо каким-то образом добавлять и удалять у змейки элементы. Все просто надо просто добавить или удалить последние элемент.
	procedure TSnake.Add; //добавление
	var tek: TElem;
	begin

	  new(tek);		//создаем новый элемент
	  tek^.X := 0;		//координаты можно ставить любые,
	  tek^.Y := 0; 		//все равно при движении все встанет на свои места
	  tek^.Next := nil;	//следующего не существует (он последний)
	  tek^.Prev := Last;	//предыдущий - тот, который был последним
	  tek^.View := Last^.View;	//вид, как у предыдущего
	  tek^.Nomber := Last^.Nomber + 1;	//номер +1
	  Last^.Next := tek;	//новый последний элемент змейки

	  inc(length);		//незабываем увеличить длину

	  Last := Tek;

	end;

	procedure TSnake.Remove; //удаление
	var Tek: TElem;
	begin
	  if Last = First then exit; 	//не можем же мы удалить единственный элемент
					//что тогда у нас останется?
	  Tek := Last;
	  Last := tek^.Prev;
	  Last^.Next := nil;
	  Dispose(tek);

	  inc(length, -1);
	end;
Остальные функции и процедуры посмотрите в исходнике, т.к. они нам не понадобятся.

Создав форму в событии OnCreate, cтавим
	//обнуляем массив
	for i := 1 to AMaxX do
	for j := 1 to AMaxY do
	GameA[i, j] := 0;

	Buffer := TBitMap.Create;
	Buffer.Width := Form1.Width;
	Buffer.Height := Form1.Height;

	//создаем змейку
	Snake.Create(1, 5, 10, 10, clYellow);
	В событии OnDestroy пишем

	Snake.Destroy;
	В событии на таймер ставим

	//очистка канваса
	PatBlt(Buffer.Canvas.Handle,
	0,
	0,
	Buffer.Width,
	Buffer.Height,
	BLACKNESS);

	//согласно направлению двигаем змейку (на самом деле
	//это можно и организовать и в функцию Move, но я решил оставить так
	case Snake.Direction of
	1: Snake.Move(Snake.First.X + 1, Snake.First.Y);
	2: Snake.Move(Snake.First.X, Snake.First.Y + 1);
	3: Snake.Move(Snake.First.X - 1, Snake.First.Y);
	4: Snake.Move(Snake.First.X, Snake.First.Y - 1);
	end;

	Snake.Draw(Buffer.Canvas);

	BitBlt(Form1.Canvas.Handle, 0, 0, Form1.Width, Form1.Height, Buffer.Canvas.Handle,
	0, 0, SRCCOPY); //выводи на форму


Вот и всё, Удачи!


  1. JamesRob
    JamesRob 2 months ago
    https://t.me/PromoPult - Разработка сайтов
    Базы доменов делигированных
    https://t.me/PromoPult - Website promotion
  2. Austinamuck
    Austinamuck 2 months ago
    Рекомендую эту юридическую компанию, как добросовестного и надежного партнера, готового идти навстречу клиентам.
    Особенно мне понравилась отличительная черта сотрудников этой организации - оперативность в работе и готовность быстро
    реагировать на форс-мажорные обстоятельства, возникшие у заказчиков и подстраиваться к ним. Убедился в этом лично, когда понадобилась услуга [url=https://bankrote.zaytcevpartners.ru]списание долгов физических лиц[/url].

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


    =best=22211
  3. JamesRob
    JamesRob 2 months ago
    https://t.me/XrumerSeo - Форум находить
    База Recapcha — количество более 900 000 ссылок. Пробив осуществлялся в связке XRumer 19 0 6 + XEvil 5.0.4
    https://t.me/XrumerSeo - Reputation management
  4. Austinamuck
    Austinamuck a month ago
    Советую данную юридическую компанию, как добросовестного и надежного партнера, готового идти навстречу клиентам.
    Особенно меня порадовала отличительная черта сотрудников компании - оперативность в работе и готовность быстро
    реагировать на форс-мажорные обстоятельства, возникшие у заказчиков и приспосабливаться к ним. Убедился в этом лично, когда понадобилась услуга [url=http://bankrot.space/]Исковое о признании банкротом В Москве[/url].

    Времени было мало. В итоге сотрудники проделали всё грамотно, быстро и аккуратно.
    Высокая организованность и профессионализм сотрудников данной юридической фирмы - неукоснительное свидетельство их дальнейшего успеха и востребованности!
  5. Georgexrc
    Georgexrc 24 days ago
    п»ї
    Хотите добывать криптовалюту, но не знаете, с чего начать? Попробуйте CryptoTab — первый в мире браузер со встроенной функцией майнинга. Он быстрый и простой в использовании — а еще он сделает веб-серфинг выгодным! https://cryptotabbrowser.com/5703690


    https://cryptotabbrowser.com/landing/20/5703690

    https://clck.ru/QAzpT

    =Crypto=
  6. Georgexxn
    Georgexxn 24 days ago
    п»ї
    Как получать пассивный доход в криптовалюте? Скачайте CryptoTab Браузер со встроенным майнинг алгоритмом. Пока вы смотрите сериалы онлайн, сидите в соц. сетях или читаете новости - браузер майнит вам криптовалюту. Больше информации по ссылке - http://bit.ly/2TPy2dj


    https://cryptotabbrowser.com/landing/20/5703690

    https://clck.ru/QAzeH

    =Crypto=
  7. StatApamb
    StatApamb 22 days ago
    Футболка

    http://merchprint.ru/muzhskiye-tolstovki/tolstovka-viking-1853419 - Свитшот
    Старая цена - 3499
    Новая цена - 1999
  8. JoshuaBet
    JoshuaBet 20 days ago
    [url=http://bit.ly/3nFQwsX]coinbase вывод[/url]


    Bitcoin (BTC) Кошелек. Скачать целевой кошелек с Bitcoin (BTC) поддержка и самые лучшие блокчейнами. Только вы руководите собственными средствами. Получать, отправлять, хранить и обмениваться криптовалютой прямо в мобильный интерфейс. Купите Биткоин и Биткоин с Trust Кошелек . Купите Биткоин и другую криптовалюту с вашим Trust Кошелек.. Вы можете купить криптовалюту (BTC/ETH/TRX/XRP/LTC) на сумму от 50 до 20 000 долларов США посредством кредитной карты/дебетовой карты в безопасном режиме из Trust Кошелек. приложения.
    [url=http://bit.ly/3nFQwsX]как вывести биткоины с кошелька[/url]
  9. JoshuaBet
    JoshuaBet 20 days ago
    [url=http://bit.ly/3mWmalc]как вывести с coinbase[/url]


    Биржа Coinbase сломалась по окончании подъема биткоина выше $20 000. Сан-Франциско, США, 16 декабря 2020, 20:40 — REGNUM Криптовалютная биржа Coinbase оказалась перегружена и не смогла проводить часть операций после подъема биткоина выше $20 000, 16 декабря информирует агентство Рейтерс. Зарегистрированная в Калифорнии Coinbase сказала, что «исправляет обстановку» , появившуюся с продажей криптовалют на розничной платформе. Как информировало ИА REGNUM , ранее криптовалюта Bitcoin поднялась в цене выше $20 000 в первый раз за время существования. Максимум торгов биткоина пока составляет около $20 800.
    [url=http://bit.ly/3mWmalc]кошелек биткоин официальный[/url]
  10. Mustinnhk
    Mustinnhk 16 days ago
    [url=http://bit.ly/2JBFtzq]права и обязанности учредителей[/url]

    Привет.
    Не так давно я взял крупный кредит. Всё было надежно, пока не настали сложные времена.
    У меня появилась проблема с возвратом кредита.
    Пришлось немало пообивать пороги различных юридичесикх контор.
    Я нашёл её...Ту самую, которая помогла решить все мои проблемы.
    Мне нужна была услуга [url=http://bit.ly/2JBFtzq]гк рф статья 49[/url]
    .
    Сначала я подробно обрисовал всё на сайте, где меня бесплатно проконсультировали.
    Когда заключил договор с данной юр.фирмой, специалисты этой фирмы консультировали меня по всем вопросам
    и вели полное сопровождение на протяжении всего процесса.
    Всё очень организованно и профессионально сделали сотрудники этой юридической фирмы.
    Мои проблемы были решены за короткий срок.

    Молодцы! Нет слов, настолько все четко сделано, честно говоря неожиданно. Такое качество за такие сроки!
    Большое вам спасибо.

    Рекомендую!
    [url=http://bit.ly/2JBFtzq]алименты отказ[/url]

    Консультации по телефонам:

    Москва, Московская область 8 (499) 350-55-06 доб. 238
    Санкт-Петербург, Ленинградская область 8 (812) 309-06-71 доб. 793
    Федеральный номер 8 (800) 555-67-55 доб. 779
    Краснодарский край 8 (861) 203-64-41 доб. 767
    Свердловская область 8 (343) 318-28-46 доб. 776
    Воронежская область 8 (473) 204-54-67 доб. 765
    Новосибирская область 8 (383) 280-46-81 доб. 764
    Нижегородская область 8 (831) 429-17-72 доб. 771
    Волгоградская область 8 (844) 278-04-56 доб. 769
    Республика Башкортостан 8 (347) 214-53-29 доб. 764
    Красноярский край 8 (391) 204-65-59 доб. 767
    Ростовская область 8 (863) 303-61-49 доб. 771
    Ульяновская область 8 (842) 224-21-78 доб. 764
    Челябинская область 8 (351) 202-13-44 доб. 770
    Ставропольский край 8 (865) 220-71-53 доб. 751
    [URL=http://juruslugimsk.ru/?wmid=14299][IMG]http://static.leadia.org/banners/240x400.png[/IMG][/URL]
  11. Mustinsyv
    Mustinsyv 16 days ago
    [url=http://bit.ly/2JBFtzq]Банкротство граждан физических лиц В Москве[/url]

    Всем привет.
    Недавно я взял крупный кредит. Всё было хорошо, пока не появились сложные времена.
    У меня появилась проблема с возвратом кредита.
    Пришлось много поискать защиту среди различных юридичесикх фирм.
    Удача повернулась ко мне. Я нашёл её...Ту самую, которая решила все мои проблемы.
    Мне понадобилась услуга [url=http://bit.ly/34ogyYf]страховая компания подала на меня в суд[/url]
    .
    Сперва я подробно написал на сайте, где провели бесплатную консультацию.
    После заключения договора с данной юридической фирмой, сотрудники консультировали меня по всем вопросам
    и вели полное сопровождение на протяжении всего процесса.
    Всё очень организованно и профессионально сделали сотрудники этой юридической организации.
    Мои проблемы были решены за короткий срок.

    Молодцы! Нет слов, настолько все четко сделано, честно говоря неожиданно. Такое качество за такие сроки!
    Большое вам спасибо.

    Рекомендую!
    [url=http://bit.ly/2JBFtzq]статья 218 часть 1 ук рф[/url]

    Консультации по телефонам:

    Москва, Московская область 8 (499) 350-55-06 доб. 238
    Санкт-Петербург, Ленинградская область 8 (812) 309-06-71 доб. 793
    Федеральный номер 8 (800) 555-67-55 доб. 779
    Краснодарский край 8 (861) 203-64-41 доб. 767
    Свердловская область 8 (343) 318-28-46 доб. 776
    Воронежская область 8 (473) 204-54-67 доб. 765
    Новосибирская область 8 (383) 280-46-81 доб. 764
    Нижегородская область 8 (831) 429-17-72 доб. 771
    Волгоградская область 8 (844) 278-04-56 доб. 769
    Республика Башкортостан 8 (347) 214-53-29 доб. 764
    Красноярский край 8 (391) 204-65-59 доб. 767
    Ростовская область 8 (863) 303-61-49 доб. 771
    Ульяновская область 8 (842) 224-21-78 доб. 764
    Челябинская область 8 (351) 202-13-44 доб. 770
    Ставропольский край 8 (865) 220-71-53 доб. 751
    [URL=http://juruslugimsk.ru/?wmid=14299][IMG]http://static.leadia.org/banners/240x400.png[/IMG][/URL]
  12. JoshuaBet
    JoshuaBet 3 days ago
    [url=http://bit.ly/3mWmalc]coinbase earn[/url]


    Bitcoin (BTC) Кошелек. Скачать целевой кошелек с Bitcoin (BTC) поддержка и самые лучшие блокчейнами. Лишь вы руководите собственными средствами. Приобретать, отправлять, хранить и обмениваться криптовалютой прямо в мобильный интерфейс. Купите Биткоин и Биткоин с Trust Кошелек . Купите Биткоин и другую криптовалюту с вашим Trust Кошелек.. Вы можете купить криптовалюту (BTC/ETH/TRX/XRP/LTC) на сумму от 50 до 20 000 долларов США с помощью кредитной карты/дебетовой карты в надёжном режиме из Trust Кошелек. приложения.
    [url=http://bit.ly/3mWmalc]coinbase com отзывы[/url]


    [url=https://7plustv.ru/news/2017/12/01/27542?__r=8d8b9b927d068f1]Coinbase перевод[/url]
    [url=http://smu.mgou.ru/index.php/rabotykonf-2013/20-econ-13/72-yusifova]Посмотреть кошелек биткоин[/url]
    [url=https://forum.zakon.kz/topic/195288-%D0%BA%D0%B0%D0%BA-%D0%B2%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D1%82%D1%8C-%D1%82%D0%BE%D0%B2%D0%B0%D1%80-%D0%B2%D0%B7%D1%8F%D1%82%D1%8B%D0%B9-%D0%B2-%D0%BA%D1%80%D0%B5%D0%B4%D0%B8%D1%82/#comment-1524156]Https www coinbase com[/url]
    [url=http://liberaespressione.altervista.org/joomla/forum/casella-dei-suggerimenti/70043#70081]Биткоин кошелек с картой[/url]
    [url=https://helytortenesz.eoldal.hu/cikkek/solt/solt.html#block-comments]Coinbase wallet[/url]
    910bd89
  13. JoshuaBet
    JoshuaBet 3 days ago
    [url=http://bit.ly/3mWmalc]биткоин кошельки с деньгами[/url]

    Кошелек-обменник Trustee — покупай и продавай крипту анонимно на карту от 0,2% Trustee Wallet - совершенный кошелек для покупки и продажи криптовалют с любой банковской карты Visa/MasterСard. Отечественные преимущества - анонимность, самые низкие комиссии от 0,2% и лучший курс на рынке. Узнайте как это трудится - свайпайте вниз! Обменник с функцией хранения крипты. надёжность и Функциональность в одном приложении! Smart-алгоритм. Доверьте выбор курса нам. Smart метод определяет лучший курс на рынке, что разрешает минимизировать Ваши затраты при проведении операций. Помощь нескольких кошельков. Вы можете создавать неограниченное количество кошельков для разных целей: трейдинга, личных расходов и хранения с разбивкой по категориям и уникальными заглавиями, а также импортировать другие кошельки. Транзакция в два клика. Отправляйте криптовалюты легким движением руки - мы побеспокоились, чтобы все элементы управления были на собственных местах.
    [url=http://bit.ly/3mWmalc]акции coinbase[/url]


    [url=https://iz-lna.ru/products/prod_tkan_00414#comment_5348]Coinbase support[/url]
    [url=https://spb.realty.ru/agency/15762#comment3487]Coinbase wallet[/url]
    [url=http://www.playauto.ru/blog/shtatnye-magnitoly-farcar-serii-s400-uzhe-v-prodazhe-novaya-flagmanskaya-model-brenda#comment_269]Биткоин кошелек вход личный[/url]
    [url=https://cubemarket.ru/blog/kakoj-kubik-rubika-vybrat#comment_12163]Биткоин кошелек[/url]
    [url=http://kireevsk-crb-zdrav.ru/forums/topic/coinbase-%d1%81%d0%bc%d1%81/]Coinbase смс[/url]
    2757030
Отменить.