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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Chamenur
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 10
#1

Змейка - C++

05.07.2013, 07:06. Просмотров 615. Ответов 6
Метки нет (Все метки)

Решил написать собственный аналог змейки. Создал костяк программы, и у меня возникло три вопроса.
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;
}
Заранее, спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2013, 07:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Змейка (C++):

змейка - C++
Хочу написать игру змейка, как на первых телефонах. не могу придумать классы которые, при этом использовать(свои). Помогите...

Змейка - C++
Надо заполнить массив нулями по змейке как на рисунке. Не могу придумать как заполнять нулями по строкам( Вот код : #include...

Змейка в С - C++
Доброй ночи всем. Подскажите пожалуйста как можно написать игру змейку в консольном окне на С? 3аранее спасибо

змейка с++ - C++
ребят,вот наработки,не могу придумать нормальный алгоритм перемещения змейки,точнее перемещение,когда она будет увеличиваться... ведь ей...

Змейка - C++
Можно пожалуйста самую простую змейку консольную на c++ вобще самую простую без очков без всяких дополнений просто змейка ограда для нее и...

Не совсем змейка - C++
Доброго времени суток! Пожалуйста помогите решить задачу: Входные данные: 4 1 3 6 10 2 5 9 13 4 8 12 15 7 11 14 16 Выходные...

6
-=ЮрА=-
Заблокирован
Автор 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 графики найдёшь здесь
Построить на экране рисунок одно подъездного дома, если известны координаты левого верхнего угла дома
1
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 1
05.07.2013, 11:05 #3
Открой для себя массивы и циклы, а уж потом пиши змейку.
0
Croessmah
Эксперт CЭксперт С++
13513 / 7671 / 866
Регистрация: 27.09.2012
Сообщений: 18,881
Записей в блоге: 3
Завершенные тесты: 1
05.07.2013, 11:06 #4
Чтобы экран не моргал, можно, например, напрямую работать с консолью, "затирая старые секции" змейки
1
Chamenur
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 10
05.07.2013, 11:14  [ТС] #5
-=ЮрА=-, Спасибо, за подробный ответ.
Kuzia domovenok, Я их неправильно и неэффективно применяю?
Цитата Сообщение от Croessmah Посмотреть сообщение
напрямую работать с консолью
Как?
0
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 1
05.07.2013, 11:16 #6
Цитата Сообщение от Chamenur Посмотреть сообщение
Я их неправильно и неэффективно применяю?
Принцип змейки прост:
есть структура "клетка змейки", содержащая координаты одной клетки.
Змейка это очередь из таких клеток, имеющих соответственно соседние координаты.
При очередном шаге игры надо:
удалить одну клетку из хвоста очереди,
создать новую клетку с координатами головы очереди.
прибавить к этим координатам направление движения, например (1,0)
добавить созданную клетку в голову очереди.
отрисовать змейку в соответствии с координатами клеток из очереди.
подождать следующего кадра.
Если замечены нажатия стрелок, изменить направление движение с (1,0) на соответствующее
1
Chamenur
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 10
05.07.2013, 11:27  [ТС] #7
Kuzia domovenok,
У меня нет автоматического передвижения, я управляю своей змейкой(или псевдо-змейкой, как я теперь понял) только клавишами.
Спасибо, за принцип, попробую создать программу по нему.
0
05.07.2013, 11:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2013, 11:27
Привет! Вот еще темы с ответами:

и снова змейка - C++
у меня огромная просьба,задали на выходные написать змейку на С++ в Visual Sudio 2010, но очень много ограничений в плане библиотек,поэтому...

Игра змейка - C++
Кто делал подобную игру отзовитесь, есть пару вопросов! заранее спасибо!

Консольная змейка - C++
Написал консольную змейку, но почему-то не работает управление :) Ну, как не работает, цвет на пробел то меняется, но W, A, S, D чтоб...

Консольная змейка - C++
Добрый день. С недавнего времени я пишу в консоли игру с одноименным названием. Занятие, прошу заметить, довольно увлекательное :) ...


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

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

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