Форум программистов, компьютерный форум, киберфорум
Наши страницы
Turbo Pascal
Войти
Регистрация
Восстановить пароль
 
rabbitec
0 / 0 / 2
Регистрация: 17.12.2014
Сообщений: 6
#1

Как обозначить границы поля в "Змейке"? - Turbo Pascal

04.02.2015, 14:02. Просмотров 647. Ответов 11

Как обозначить границы поля в змейке!
Вот сама змейка.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
program PITON;
uses crt;
label o,p;
var z:char;HED,TAIL:array[1..2] of integer;
begin
 
clrscr;
randomize;
HED[1]:=39;
HED[2]:=10;
gotoxy(HED[1],HED[2]);
writeln('H');
TAIL[1]:=HED[1]-1;
TAIl[2]:=HED[2];
gotoxy(TAIL[1],TAIL[2]);
writeln('H');
p: z:=readkey;
if z<>#0 then goto o; z:=readkey;
Case z of
#72:if HED[2]<=1 then goto o else begin gotoxy(TAIL[1],TAIL[2]);writeln(' ');
TAIL:=HED;HED[2]:=HED[2]-1;gotoxy(HED[1],HED[2]);writeln('H');end;
 
#75:if HED[2]<=1 then goto o else begin gotoxy(TAIL[1],TAIL[2]);writeln(' ');
TAIL:=HED;HED[1]:=HED[1]-1;gotoxy(HED[1],HED[2]);writeln('H');end;
 
#77:if HED[1]>=80 then goto o else begin gotoxy(TAIL[1],TAIL[2]);writeln(' ');
TAIL:=HED;HED[1]:=HED[1]+1;gotoxy(HED[1],HED[2]);writeln('H');end;
 
#80:if HED[2]>=24 then goto o else begin gotoxy(TAIL[1],TAIL[2]);writeln(' ');
TAIL:=HED;HED[2]:=HED[2]+1;gotoxy(HED[1],HED[2]);writeln('H');end;
 
end;
goto p;
o: end.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2015, 14:02
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как обозначить границы поля в "Змейке"? (Turbo Pascal):

Поля, находящиеся под угрозой даной фигуры, отметить "*" , а остальные - "0"
Шахматную доску будем представлять в виде квадратного символьного массива...

Составить фразу "текстовый редактор" из слов "тесто", "редакция", "мотор", "который"
1) Составить фразу &quot;текстовый редактор&quot; из слов &quot;тесто&quot;, &quot;редакция&quot;, &quot;мотор&quot;,...

Составить фразу "письменный стол" из слов "тесненный", "полка", "речь", "миф".
1) Составить фразу &quot;письменный стол&quot; из слов &quot;тесненный&quot;, &quot;полка&quot;, &quot;речь&quot;,...

Составить фразу "программное обеспечение" из слов "программист", "оборот", "анчоус", "измерение"
Составить фразу &quot;программное обеспечение&quot; из слов &quot;программист&quot;, &quot;оборот&quot;,...

Заменить символы "1", "2", "3" словами "один", "два", "три"
Дана строка символов. Заменить символы &quot;1&quot;, &quot;2&quot;, &quot;3&quot; словами &quot;один&quot;, &quot;два&quot;,...

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

11
Ssnake707
8 / 8 / 11
Регистрация: 02.02.2015
Сообщений: 140
04.02.2015, 14:15 #2
rabbitec, Пикселями, у тебя есть голова змейки которая двигается по пикселям, вот и обозначь поля, если голова змейки равна или больше границы допустим 500px то она разбилась) и пусть поля будут допустим
правый верхний угол x=0px y=0px
правый нижний угол x=0px y=500px
левый нижний угол x=500px y=500px
левый верхний угол x=500px y=0px
0
APALoff
1638 / 1067 / 1080
Регистрация: 03.07.2013
Сообщений: 4,507
04.02.2015, 14:28 #3
Ssnake707, у него текстовый режим, а не графический.

Добавлено через 2 минуты
Нарисуйте псевдографикой. Единственный момент сложности - это вывести символ в позицию 80,25 без сдвига экрана вверх - тут придется напрямую обращаться к странице видопамяти B800$:0000$ .

Вариант с границами: Не иметь границы!
При достижении края границы пусть змейка появляется с противоположной стороны.
0
Ssnake707
8 / 8 / 11
Регистрация: 02.02.2015
Сообщений: 140
04.02.2015, 14:29 #4
APALoff, если я не ошибаюсь то в gotoxy(x,y) передаются координаты по осям x и y так почему эти координаты и не брать для проверки вышел за границу или нет.
0
APALoff
1638 / 1067 / 1080
Регистрация: 03.07.2013
Сообщений: 4,507
04.02.2015, 14:32 #5
Ssnake707, мы наверное по разному поняли вопрос.
Цитата Сообщение от rabbitec Посмотреть сообщение
Как обозначить границы поля в змейке!
Т.е. отрисовать их, а Вы пытаетесь подсказать механизм контроля выхода за границы...
Хотя может это автор описал не то что он хочет...
0
Ssnake707
8 / 8 / 11
Регистрация: 02.02.2015
Сообщений: 140
04.02.2015, 14:38 #6
APALoff, видимо вы правы.
Цитата Сообщение от APALoff Посмотреть сообщение
Единственный момент сложности - это вывести символ в позицию 80,25
Не пойму откуда именно такие цифры "80,25"
0
Puporev
Модератор
54148 / 41781 / 28887
Регистрация: 18.05.2008
Сообщений: 98,330
04.02.2015, 14:50 #7
Цитата Сообщение от Ssnake707 Посмотреть сообщение
е пойму откуда именно такие цифры "80,25"
Это размеры стандартного текстового окна в Паскале

Добавлено через 7 минут
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
program PITON;
uses crt;
var z:char;
    HED,TAIL:array[1..2] of integer;
begin
 
clrscr;
randomize;
HED[1]:=39;
HED[2]:=10;
gotoxy(HED[1],HED[2]);
writeln('H');
TAIL[1]:=HED[1]-1;
TAIl[2]:=HED[2];
gotoxy(TAIL[1],TAIL[2]);
writeln('H');
repeat
z:=readkey;
if z=#0 then
 begin
  z:=readkey;
  Case z of
  #72:if HED[2]>1 then begin gotoxy(TAIL[1],TAIL[2]);writeln(' ');
  TAIL:=HED;HED[2]:=HED[2]-1;gotoxy(HED[1],HED[2]);write('H');end;
 
  #75:if HED[1]>2 then begin gotoxy(TAIL[1],TAIL[2]);writeln(' ');
  TAIL:=HED;HED[1]:=HED[1]-1;gotoxy(HED[1],HED[2]);write('H');end;
 
  #77:if HED[1]<78 then begin gotoxy(TAIL[1],TAIL[2]);writeln(' ');
  TAIL:=HED;HED[1]:=HED[1]+1;gotoxy(HED[1],HED[2]);writeln('H');end;
 
  #80:if HED[2]<24 then begin gotoxy(TAIL[1],TAIL[2]);writeln(' ');
  TAIL:=HED;HED[2]:=HED[2]+1;gotoxy(HED[1],HED[2]);write('H');end;
  end
  end
else if z=#27 then exit;
until z=#27;
end.
1
Ssnake707
8 / 8 / 11
Регистрация: 02.02.2015
Сообщений: 140
04.02.2015, 14:58 #8
Puporev, Если не ошибаюсь то что бы избежать этого казуса можно сделать поля для змейки не в притык с стандартным окном, пусть поля будет немного меньше, или я не так всё понял?
0
Puporev
Модератор
54148 / 41781 / 28887
Регистрация: 18.05.2008
Сообщений: 98,330
04.02.2015, 15:01 #9
Да, можно и так. По сути у меня поле [3..77,2..23]

Добавлено через 54 секунды
Просто предусмотрены поля для курсора.
0
APALoff
1638 / 1067 / 1080
Регистрация: 03.07.2013
Сообщений: 4,507
04.02.2015, 15:44 #10
Съешь звездочку!

Поле 80,24.
Змейка растет.
Границы прозрачны (форма тора).

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
Uses Crt,Dos;
Const
  Pause = 30; {ms}
  Increment = 2;
Type
  Pyton = Record
            x,y : Byte;
          end;
 
Var
  m     : array[1..2000] of Pyton;
  h,g,L : Word;
  P,i   : Byte; { P =  1 - up; 2 - right; 3 - down; 4 - left}
  Ch    : Char;
  Eat   : Pyton;
 
Procedure MyDelay(a : Longint);
Var
  A0       : Longint;
  H,M,S,S1 : Word;
Begin
  GetTime(H,M,S,S1);
  A0:=s1+s*100+m*60*100+H*60*60*100;
  While s1+s*100+m*60*100+H*60*60*100-A0<a do
    GetTime(H,M,S,S1);
end;
 
Begin
  Randomize;
  L:=0; h:=1; g:=2; Eat.x:=Random(80)+1; Eat.y:=Random(23)+1;
  m[h].x:=34; m[h].y:=12; m[g].x:=35; m[g].y:=12; p:=2;
  ClrScr;
  GoToXY(m[h].x,m[h].y); Write('O@');
  GoToXY(Eat.x,Eat.y); Write('*');
 
  Repeat
    MyDelay(Pause);
    If KeyPressed then
    Begin
      Ch:=ReadKey; If Ch=#0 then Ch:=Readkey;
      Case Ch of
        #72 : If P<>3 then P:=1;
        #77 : If P<>4 then P:=2;
        #80 : If P<>1 then P:=3;
        #75 : If P<>2 then P:=4;
      end;
    end;
 
    i:=g;
    Inc(g);
    If g>2000 then g:=1;
    Case P of
      1 : Begin
            m[g].x:=m[i].x;
            m[g].y:=m[i].y-1;
            If m[g].y<1 then m[g].y:=24;
          end;
      2 : Begin
            m[g].y:=m[i].y;
            m[g].x:=m[i].x+1;
            If m[g].x>80 then m[g].x:=1;
          end;
      3 : Begin
            m[g].x:=m[i].x;
            m[g].y:=m[i].y+1;
            If m[g].y>24 then m[g].y:=1;
          end;
      4 : Begin
            m[g].y:=m[i].y;
            m[g].x:=m[i].x-1;
            If m[g].x<1 then m[g].x:=80;
          end;
    end;
    GoToXY(m[g].x,m[g].y); Write('@');
    GoToXY(m[i].x,m[i].y); Write('O');
    If (m[g].x=Eat.x) and (m[g].y=Eat.y) then
    Begin
      Inc(L,Increment);
      Eat.x:=Random(80)+1; Eat.y:=Random(23)+1;
      GoToXY(Eat.x,Eat.y); Write('*');
    end;
    If L>0 then Dec(L)
    else
      Begin
        GoToXY(m[h].x,m[h].y); Write(' ');
        Inc(h);
        If h>2000 then h:=1;
      end;
  Until Ch=#27;
end.
0
TrueTerm
168 / 116 / 45
Регистрация: 25.12.2014
Сообщений: 384
19.02.2015, 14:50 #11
Цитата Сообщение от APALoff Посмотреть сообщение
Единственный момент сложности - это вывести символ в позицию 80,25 без сдвига экрана вверх - тут придется напрямую обращаться к странице видопамяти B800$:0000$ .
Можно и без обращения к видеопамяти. Сначала вывести в 24-ю строку то, что должно быть в 25-й, потом для этой строки выполнить insline (что сдвинет 24-ю строку в 25-ю). Затем можно заполнить остальные 24 строки экрана.
Вот пример, помещающий * в позицию (80,25):
Pascal
1
2
3
4
5
6
7
uses CRT;
begin
clrscr;
gotoxy(80,24);write('*');
gotoxy(1,24);insline;
readkey;
end.
0
APALoff
1638 / 1067 / 1080
Регистрация: 03.07.2013
Сообщений: 4,507
19.02.2015, 15:46 #12
TrueTerm, зачёт!
Хоть и "костыль", но работать должно.
0
19.02.2015, 15:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2015, 15:46
Привет! Вот еще темы с решениями:

Составить програму, которая б после каждой буквы "е" в данном слове дописывала букву "о" и меняла словосочетание "да" на "нет"
Составить програму, которая б после каждой буквы &quot;е&quot; в данном слове дописывала...

Проверить слово "Дом" и содержит ли оно буквы: "а" , "б" ,"о","д"
программа должна проверить слово &quot;Дом&quot; и содержит ли оно буквы: &quot;а&quot; , &quot;б&quot;...

Составить программу, которая из слов "мышь", " сканер", "слива" получает слово "клавиша"
Помогите пожалуйста. Необходимо составить программу, которая: из слов &quot;мышь&quot;,...

Ввести строку. Заменить все буквы "е" и "а" в тексте на "8" , "4" и "6". Вывести на экран модифицированную строку
Ввести строку. Заменить все буквы &quot;е&quot; и &quot;а&quot; в тексте на &quot;8&quot; , &quot;4&quot; и &quot;6&quot;....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru