Форум программистов, компьютерный форум CyberForum.ru

Змейка - C++

Восстановить пароль Регистрация
 
Chamenur
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 10
05.07.2013, 07:06     Змейка #1
Решил написать собственный аналог змейки. Создал костяк программы, и у меня возникло три вопроса.
1. Змейка отказывается двигаться влево(нажат CapsLock и раскладка английская, при других параметрах все ОК).
2. Как сделать управление с помощью клавиш?(+Page Up, Page Down, Home, End)
3. Экран сильно мерцает при передвижении змейки. Возможно из-за system("cls"). Можно ли изменять положение змейки как-нибудь по другому.
Собственно, сам код:
C++
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include <iostream>
#include <conio.h>
#include <windows.h>
using namespace std;
 
int main() 
{   
   CONSOLE_CURSOR_INFO CCI;
   CCI.bVisible=false;
   CCI.dwSize=1;
   SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&CCI);
   
   int m1=15, n1=5,
       m2=16, n2=5,
       m3=17, n3=5,
       m4=18, n4=5;
   char floor[24][48];
   for (int i=0; i<24; i++)
         for (int j=0; j<48; j++)
            floor[i][j]=' ';
   for (int i=0; i<24; i++)
   {
      floor[i][0]=178;
      floor[i][46]=178;
   }
   for (int i=0; i<48; i++)
   {
      floor[0][i]=178;
      floor[23][i]=178;
   }
   floor[m1][n1]=219;
   floor[m2][n2]=219;
   floor[m3][n3]=219;
   floor[m4][n4]=219;
   floor[5][5]='*';
   char a=0;
   
   while (a!=VK_SPACE)
   {
      for (int i=0; i<24; i++)
      {
         for (int j=0; j<47; j++)
            cout << floor[i][j];
         cout << endl;
      }
      a=getch();
      switch(a)
      {
         //Вверх
         case 119:
         case 87:
         case 150:
         case 230:
            if (floor[m1-1][n1]!=' ' || m1-1<0)
               break;
            else
            {
               floor[m4][n4]=' ';
               n4=n3;
               n3=n2;
               n2=n1;
               m4=m3;
               m3=m2;
               m2=m1;
               m1--;
               break;
            }
         //Вниз
         case 83:
         case 115:
         case 235:
         case 155:
            if (floor[m1+1][n1]!=' ' || m1+1>23)
               break;
            else
               {
                  floor[m4][n4]=' ';
                  m4=m3;
                  m3=m2;
                  m2=m1;
                  n4=n3;
                  n3=n2;
                  n2=n1;
                  m1++;
                  break;
               }
         //Влево
         case 65:
         case 97:
         case 228:
         case 48:
            if (floor[m1][n1-1]!=' ' || n1-1<0)
               break;
            else
               {
                  floor[m4][n4]=' ';
                  n4=n3;
                  n3=n2;
                  n2=n1;
                  m4=m3;
                  m3=m2;
                  m2=m1;
                  n1--;
                  break;
               }
         //Вправо
         case 68:
         case 100:
         case 130:
         case 162:
            if (floor[m1][n1+1]!=' ' || n1+1>47)
               break;
            else
               {
                  floor[m4][n4]=' ';
                  n4=n3;
                  n3=n2;
                  n2=n1;
                  m4=m3;
                  m3=m2;
                  m2=m1;
                  n1++;
                  break;
               }
         default:
            break;
      }  
      floor[m1][n1]=219;
      floor[m2][n2]=219;
      floor[m3][n3]=219;
      floor[m4][n4]=219; 
      system ("cls");
   }
   system ("pause");
    return 0;
}
Заранее, спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2013, 07:06     Змейка
Посмотрите здесь:

C++ змейка
C++ Змейка в С
C++ змейка с++
C++ и снова змейка
C++ Консольная змейка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
05.07.2013, 10:53     Змейка #2
Цитата Сообщение от Chamenur Посмотреть сообщение
2. Как сделать управление с помощью клавиш?(+Page Up, Page Down, Home, End)
http://www.cyberforum.ru/blogs/34326/blog263.html, тебе останется измнить коды клавишь
VK_PRIOR21PAGE UP key
VK_NEXT22PAGE DOWN key
http://delphi.about.com/od/objectpascalide/l/blvkc.htm

Полная ин-ция о функции парсинга нажатия GetAsynKeyState здесь
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Добавлено через 1 минуту
Цитата Сообщение от Chamenur Посмотреть сообщение
a=getch();
- изъять
Цитата Сообщение от Chamenur Посмотреть сообщение
Экран сильно мерцает при передвижении змейки. Возможно из-за system("cls"). Можно ли изменять положение змейки как-нибудь по другому.
- да если использовать не псевдографику а GDI

Добавлено через 35 секунд
Цитата Сообщение от Chamenur Посмотреть сообщение
1. Змейка отказывается двигаться влево(нажат CapsLock и раскладка английская, при других параметрах все ОК).
- на гетче застряёт видимо не охота править, т.к надеюсь прислушаешся к советам выше

Добавлено через 2 минуты
Chamenur, всё что нужно для начала написания GDI графики найдёшь здесь
Построить на экране рисунок одно подъездного дома, если известны координаты левого верхнего угла дома
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
05.07.2013, 11:05     Змейка #3
Открой для себя массивы и циклы, а уж потом пиши змейку.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
05.07.2013, 11:06     Змейка #4
Чтобы экран не моргал, можно, например, напрямую работать с консолью, "затирая старые секции" змейки
Chamenur
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 10
05.07.2013, 11:14  [ТС]     Змейка #5
-=ЮрА=-, Спасибо, за подробный ответ.
Kuzia domovenok, Я их неправильно и неэффективно применяю?
Цитата Сообщение от Croessmah Посмотреть сообщение
напрямую работать с консолью
Как?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
05.07.2013, 11:16     Змейка #6
Цитата Сообщение от Chamenur Посмотреть сообщение
Я их неправильно и неэффективно применяю?
Принцип змейки прост:
есть структура "клетка змейки", содержащая координаты одной клетки.
Змейка это очередь из таких клеток, имеющих соответственно соседние координаты.
При очередном шаге игры надо:
удалить одну клетку из хвоста очереди,
создать новую клетку с координатами головы очереди.
прибавить к этим координатам направление движения, например (1,0)
добавить созданную клетку в голову очереди.
отрисовать змейку в соответствии с координатами клеток из очереди.
подождать следующего кадра.
Если замечены нажатия стрелок, изменить направление движение с (1,0) на соответствующее
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2013, 11:27     Змейка
Еще ссылки по теме:

Змейка C++
Змейка (SNake) C++
Змейка C++

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

Или воспользуйтесь поиском по форуму:
Chamenur
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 10
05.07.2013, 11:27  [ТС]     Змейка #7
Kuzia domovenok,
У меня нет автоматического передвижения, я управляю своей змейкой(или псевдо-змейкой, как я теперь понял) только клавишами.
Спасибо, за принцип, попробую создать программу по нему.
Yandex
Объявления
05.07.2013, 11:27     Змейка
Ответ Создать тему
Опции темы

Текущее время: 05:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru