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

и снова змейка - C++

Восстановить пароль Регистрация
 
Asante
18 / 18 / 0
Регистрация: 05.10.2011
Сообщений: 92
10.08.2012, 17:56     и снова змейка #1
у меня огромная просьба,задали на выходные написать змейку на С++ в Visual Sudio 2010, но очень много ограничений в плане библиотек,поэтому интернет отпадает(уже гуглил,везде то что мы не учили)сам никак не справлюсь,если не тяжело не могли бы вы мне помочь,мозг уже закипает,перемещение с одной звездочкой сделал,а как влепить 3 и двигать их не могу написать
Код
#include<iostream>
	#include<ctime>
	#include<conio.h>
	#include<Windows.h>
	using namespace std;
	void main()
	{srand(time(0));
	const int row = 20;
	const int col = 20;
	int mass[row][col]={};
	int stx=3;
	int sty=5;
	for ( int j = 0 ; j < row ; j++ )
	{
	 for (int i = 0 ; i < col ; i++ )
	 {
	  mass[j][i] = ' ';
	 }
	}
	mass[stx][sty] = '*';
	mass[stx+1][sty] = '*';
	mass[stx-1][sty] = '*';
	int inp = 0;
	do
	{

	system("cls");
	for ( int j = 0 ; j < row ; j++ )
	 {
	  for (int i = 0 ; i < col ; i++ )
	  {  
	   cout << char (mass[j][i]) << " ";
	  }
	  cout << endl ;
	 }
	Sleep(300);
	if (_kbhit())
	{inp=_getch();
		if (inp==224)
		{
		 inp=_getch();
		}
	}
	switch (inp)
	{
	case 75://vniz
	 mass[stx][sty] = ' ';
	 mass[stx][--sty] = '*';
	 break;
	case 77://vpravo
	 mass[stx][sty] = ' ';
	 mass[stx][++sty] ='*';
	 break;
	case 72://vverx
	 mass[stx][sty] = ' ';
	 mass[--stx][sty] = '*';
	 break;
	case 80://vlevo
	 mass[stx][sty] = ' ';
	 mass[++stx][sty] = '*';
	break;
	default:
	 mass[stx][sty] = '*';
	 mass[stx+1][sty] = '*';
	 mass[stx+2][sty] = '*';
	 mass[stx-1][sty] = ' ';
	break;
	 } 
	}
	while(inp!=27);


	}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2012, 17:56     и снова змейка
Посмотрите здесь:

C++ змейка
C++ Змейка в С
C++ змейка с++
C++ игра змейка
C++ Змейка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
10.08.2012, 21:28     и снова змейка #2
Какие либы/хедеры использовать можно?
RaiaNKnight
 Аватар для RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 458
Записей в блоге: 1
10.08.2012, 21:35     и снова змейка #3
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
#include <iostream>
#include <ctime>
#include <conio.h>
#include <vector>
#include <Windows.h>
 
using namespace std;
 
struct coord
{
    int x;
    int y;
};
 
void move(vector <coord> &snake)
{
    for(int i=snake.size()-1;i>0;i--)
    {
        snake[i].x=snake[i-1].x;
        snake[i].y=snake[i-1].y;
    }
}
bool check_collision(vector <coord> &snake)
{
    for(int i=1;i<snake.size();i++)
        if(snake[i].x==snake[0].x&&snake[i].y==snake[0].y)
            return true;
    return false;
}
void add_element_to_snake(vector <coord> &snake,char elem,int &curr_length)
{
    curr_length++;
    coord xy;
    xy.x=snake[curr_length-2].x;
    xy.y=snake[curr_length-2].y;
    snake.push_back(xy);
}
 
int main()
{
    srand(time(0));
    vector <coord> snake;
    int curr_length=1;
    const int row = 20, col = 20;
    char mass[row][col]; 
    coord xy;
    xy.x=rand()%20; xy.y=rand()%20; //head
    snake.push_back(xy);
    for ( int j = 0 ; j < row ; j++ )
        for (int i = 0 ; i < col ; i++ )
            mass[j][i] = ' ';
    mass[snake[0].x][snake[0].y] = '*'; 
    for(int i=0;i<10;i++)
    {
        mass[rand()%20][rand()%20]='*';  //еда 
    }
    int inp = 0;
    do
    {
        system("cls");
        for ( int j = 0 ; j < row ; j++ )
        {
            for (int i = 0 ; i < col ; i++ )
                cout << mass[j][i] << " ";
            cout << endl ;
        }
        Sleep(800);
        if (_kbhit())
        {
            inp=_getch();
            if (inp==224)
                inp=_getch();
        }
        mass[snake[snake.size()-1].x][snake[snake.size()-1].y]=' ';
        move(snake);
        switch (inp)
        {
            case 75://left
                snake[0].y--;
                if(snake[0].y<0)
                    snake[0].y=19;
                break;
            case 77://right
                snake[0].y++;
                if(snake[0].y>19)
                    snake[0].y=0;
                break;
            case 72://up
                snake[0].x--;
                if(snake[0].x<0)
                    snake[0].x=19;
                break;
            case 80://down
                snake[0].x++;
                if(snake[0].x>19)
                    snake[0].x=0;
                break;
        } 
        char curr_elem = mass[snake[0].x][snake[0].y];
        if(curr_elem=='*')
            if(!check_collision(snake))
                add_element_to_snake(snake,curr_elem,curr_length);
            else
            {
                system("cls");
                cout<<"Score - "<<curr_length<<endl;
                cout<<"Game over!";
                break;
            }
        for(int i=0;i<snake.size();i++)
            mass[snake[i].x][snake[i].y]='*';
    }
    while(inp!=27);
    _getch();
    return 0;
}
Если змейка состоит из 2 и более элементов, то при попытке идти "назад", т.е. при действии типа -> <- проигрыш. Можете исправить, если желаете.
И вообще, вам бы как-нибудь избавиться от постоянного очищения консоли, долго уж это.
Есть вроде бы методы для прямого вывода в определенную позицию или нет?

P.s. И ошибки тоже не исключены
Asante
18 / 18 / 0
Регистрация: 05.10.2011
Сообщений: 92
10.08.2012, 21:48  [ТС]     и снова змейка #4
к сожалению необходимо без векторов(мы их не учили),а все что можно использовать в первом коде
RaiaNKnight
 Аватар для RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 458
Записей в блоге: 1
10.08.2012, 21:54     и снова змейка #5
Ну исправь на массив ограниченной длины. В чем проблема?
Asante
18 / 18 / 0
Регистрация: 05.10.2011
Сообщений: 92
10.08.2012, 22:12  [ТС]     и снова змейка #6
не могу понять как и куда его вставить,я пытался ничего не выходит
-=ЮрА=-
Заблокирован
Автор FAQ
10.08.2012, 22:48     и снова змейка #7
Asante, посмотрите сюда, возможно пригодиться
Очень простое заполнение матрицы змейкой по диагоналям

Добавлено через 52 секунды
Код со скрином отработки в консоли здесь
Заполнение змейкой
Asante
18 / 18 / 0
Регистрация: 05.10.2011
Сообщений: 92
10.08.2012, 22:55  [ТС]     и снова змейка #8
Спасибо,Юра,но не совсем то,там есть вещи которые мы еще не учили,хотя все заполнения понятны
-=ЮрА=-
Заблокирован
Автор FAQ
10.08.2012, 23:21     и снова змейка #9
Цитата Сообщение от Asante Посмотреть сообщение
хотя все заполнения понятны
- дык файловое чтение изыми из кода и динамическое выделение памяти замени на статику, из всего кода важна лишь
C++
1
double **FillArr (int n)
а уж как её приспособить - это дело программиста
Asante
18 / 18 / 0
Регистрация: 05.10.2011
Сообщений: 92
10.08.2012, 23:24  [ТС]     и снова змейка #10
мы такого ниразу не писали,что это означает?(прости за необразованость)
-=ЮрА=-
Заблокирован
Автор FAQ
10.08.2012, 23:52     и снова змейка #11
Это функция пользователя,ок я понял что ты еще в самом начале изучения языка,сутра перепишу тебе проект исходя из имеющихся у тебя знаний и навыков
-=ЮрА=-
Заблокирован
Автор FAQ
11.08.2012, 10:07     и снова змейка #12
Asante, как и обещал
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
#include <iomanip>
#include <iostream>
using namespace std;
 
const int N = 32; //Данная константа будет определять максимальный размер матрицы
 
int main()
{
    int i, j, k = 0;//Счётчики
    int diag    = 0;//Тоже счётчик но для диагоналей
    int n = 0;//Будет содержать размер матрицы
    //Выделяем память под элементы массива
    double arr[N][N] = {0};
    cout<<"Enter size of matrix : ";cin>>n;
    if(N < n)
        cout<<"size of matrix is too large\n";
    else
    {
        //Собственно заполнение матрицы
        for(diag = 0; diag < 2*n; diag++)
        {
            for(i = 0; i < n; i++)
            for(j = 0; j < n; j++)
            {
                if(diag + 1 == (i + 1) + (j + 1))
                {
                    if(diag % 2)
                        arr[i][j] = k + 1;
                    else
                        arr[j][i] = k + 1;
                    k = k + 1;
                }
            }
        }
        //Печать заполненной матрицы
        for(i = 0; i < n; i++)
        {
            for(j = 0; j < n; j++)
                cout<<setw(2)<<arr[i][j]<<" ";
            cout<<endl;
        }
    }
    return 0;
}
Миниатюры
и снова змейка  
Asante
18 / 18 / 0
Регистрация: 05.10.2011
Сообщений: 92
11.08.2012, 12:47  [ТС]     и снова змейка #13
код почти понятен(кроме setw(2)),но как применить его не пойму
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
11.08.2012, 12:49     и снова змейка #14
Цитата Сообщение от Asante Посмотреть сообщение
но как применить его не пойму
Да никак. Это ведь совершенно другая задача
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2012, 13:32     и снова змейка
Еще ссылки по теме:

Змейка C++
C++ Как сделать чтобы таймер дойдя до 0 стартовал снова и снова?
Змейка C++

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

Или воспользуйтесь поиском по форуму:
Asante
18 / 18 / 0
Регистрация: 05.10.2011
Сообщений: 92
11.08.2012, 13:32  [ТС]     и снова змейка #15
я про тоже,сделал поле сделал змейку,правда еще не бегает))),как вставить еду чтоб не появлялась на змейке
Yandex
Объявления
11.08.2012, 13:32     и снова змейка
Ответ Создать тему
Опции темы

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