Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/27: Рейтинг темы: голосов - 27, средняя оценка - 4.56
Ann Joker
3 / 3 / 0
Регистрация: 05.10.2011
Сообщений: 86
1

Змейка на консоли - вопрос реализации с нуля

07.10.2012, 07:00. Просмотров 5056. Ответов 2
Метки нет (Все метки)

Недавно поняла, как считывать линию с консоли, уже задали написать змейку.

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

как именно создать этот массив и заставить поворачивать при нажатии соответствующей клавиши.
собственный код просто стыдно выкладывать
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2012, 07:00
Ответы с готовыми решениями:

Змейка в консоли
using System; using System.Collections.Generic; using System.Linq; using...

Игра "Змейка", способы реализации
ЗАДАЛИ СДЕЛАТЬ ИГРУ ЗМЕЙКА ИМЕННО В с# А я с ним не в ладах помогите плиз...

Простой чат в консоли - проверьте корректность реализации
Здравствуйте, подумал может кому то будет полезно или интересно. Я создал...

Вопрос по способу реализации
Вопрос по способу реализации на VS C# 2008. Значит задумка такая у меня. из...

Пористая заготовка: вопрос реализации
Народ, помогииииииииииииите! Нужно очень-очень срочно сделать программку. Я...

2
I2um1
Злой няш
1407 / 1105 / 374
Регистрация: 05.04.2010
Сообщений: 1,949
07.10.2012, 10:30 2
Лучший ответ Сообщение было отмечено Ann Joker как решение

Решение

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
using System;
using System.Collections.Generic;
 
namespace ConsoleApplication
{
    internal class Program
    {
        private static void Main()
        {
            var snake = new Snake(x: 5, y: 5, size: 7);
            Print(snake);
            while (true)
            {
                var key = Console.ReadKey().Key;
                switch (key)
                {
                    case ConsoleKey.UpArrow:
                        snake.Direction = Direction.Up;
                        break;
                    case ConsoleKey.DownArrow:
                        snake.Direction = Direction.Down;
                        break;
                    case ConsoleKey.LeftArrow:
                        snake.Direction = Direction.Left;
                        break;
                    case ConsoleKey.RightArrow:
                        snake.Direction = Direction.Right;
                        break;
                }
                snake.Move(1);
                Print(snake);
            }
        }
 
        private static void Print(Snake snake)
        {
            Console.Clear();
            for (var i = 0; i < snake.Size; i++)
            {
                Console.SetCursorPosition(snake[i].X, snake[i].Y);
                Console.Write(i == 0 ? "*" : "0");
            }
        }
    }
 
    internal class Snake
    {
        private readonly List<Segment> segments;
 
        public Snake(int x, int y, uint size)
        {
            if (size == 0)
                throw new ArgumentException("Размер змеи не может быть равным 0", "size");
            segments = new List<Segment>();
            for (var i = 0; i < size; i++)
                segments.Add(new Segment(x, y + i));
            Direction = Direction.Up;
        }
 
        public Direction Direction { get; set; }
 
        public int Size
        {
            get { return segments.Count; }
        }
 
        public Segment this[int index]
        {
            get { return segments[index]; }
        }
 
        public void Move(int speed)
        {
            int x = 0, y = 0;
            switch (Direction)
            {
                case Direction.Up:
                    y = -speed;
                    break;
                case Direction.Down:
                    y = speed;
                    break;
                case Direction.Left:
                    x = -speed;
                    break;
                case Direction.Right:
                    x = speed;
                    break;
            }
            for (var i = Size - 1; i >= 1; i--)
            {
                segments[i].X = segments[i - 1].X;
                segments[i].Y = segments[i - 1].Y;
            }
            segments[0].X += x;
            segments[0].Y += y;
        }
    }
 
    internal class Segment
    {
        public Segment(int x = 0, int y = 0)
        {
            X = x;
            Y = y;
        }
 
        public int X { get; set; }
        public int Y { get; set; }
    }
 
    internal enum Direction
    {
        Up,
        Down,
        Left,
        Right
    }
}
0
Psilon
Master of Orion
Эксперт .NET
6000 / 4850 / 902
Регистрация: 10.07.2011
Сообщений: 14,460
Записей в блоге: 5
Завершенные тесты: 4
07.10.2012, 13:33 3
Вот графический вариант, берите, что нужно.
Фактически нужно только добавить в direction перегрузку, которая принимает Console.Keys, ну и изменить визуализатор на консоль.
Сама змейка выглядит как-то так:
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
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
 
namespace Snake
{
    public partial class Snake
    {
        private readonly int _scoreForFood; //Очки за подобранную еду
        private static Point _food; //Координаты клетки с едой
        private readonly HashSet<Point> _barriers;
        private readonly Size _size; //Размеры карты
        private readonly Queue<Segment> _snake; //Сама змейка
        private Segment _head; //Голова
        public int Score { get; private set; }
 
        public Snake(int segmentCount,int scoreForFood, Size mapSize, HashSet<Point> barriers)
            //Конструктор, определяет размеры карты и начальное количество сегментов змеи
        {
            _scoreForFood = scoreForFood;
            _snake = new Queue<Segment>();
            _size = mapSize;
            _barriers = barriers;
            var p = new Point((_size.Width - segmentCount) >> 1, _size.Height/2); //Ставим змейку на середину карты
            for (int i = 0; i < segmentCount; i++, p.X++)
                _snake.Enqueue(new Segment(p));
            p.X--;
            _head = p;
            PlaceFood();
        }
 
        public List<Point> GetCoords()
        {
            return _snake.Select(segment => (Point) segment).ToList(); //Возвращаем список координат змеи
        }
 
 
        public List<Terrain> Move(Point relativityDirection, out bool result)
            //Передвигаем змею. Если она себя кусает, возвращаем true
        {
            result = true;
            var coordsToRepaint = new List<Terrain>
                {
                    new Terrain(TerrainInfo.Tail, _snake.Peek()),
                    new Terrain(TerrainInfo.LastHead, _head)
                };
            Segment newHeadPos = _head + relativityDirection;
            if (CheckForCollision(newHeadPos)) return new List<Terrain>();
            MoveHead(newHeadPos);
            _snake.Enqueue(_head);
            coordsToRepaint.Add(new Terrain(TerrainInfo.NewHead, _head));
            if (_head == _food) //Если змея попала на клетку с едой, мы рандомную клетку заполняем едой
            {
                Score += _scoreForFood;
                PlaceFood();
            }
            else _snake.Dequeue(); //Иначе, чтобы змея не увеличилась, убираем последний сегмент
            result = false; //Мы себя не укусили, значит false
            coordsToRepaint.Add(new Terrain(TerrainInfo.Food, _food));
            return coordsToRepaint;
        }
 
        private void MoveHead(Segment s) //Передвигаем голову с учетом телепортов через край
        {
            if (s.X < 0)
                _head.X = _size.Width - 1;
            else if (s.X > _size.Width - 1)
                _head.X = 0;
            else if (s.Y < 0)
                _head.Y = _size.Height - 1;
            else if (s.Y > _size.Height - 1)
                _head.Y = 0;
            else
                _head = s;
        }
 
        private bool CheckForCollision(Segment s)
        {
            return _snake.Contains(s) && (Point) s != _snake.Peek() || CheckBorders(s);
        }
 
        private bool CheckBorders(Segment s)
        {
            return _barriers.Contains(s);
        }
 
        private void PlaceFood()
        {
            var r = new Random();
            var p = new Point();
            do
            {
                p.X = r.Next(_size.Width);
                p.Y = r.Next(_size.Height);
            } while (_snake.Contains(p) || _barriers.Contains(p));
            _food = p;
        }
    }
}
Большой плюс реализации, что каждый ход мы двигаем ТОЛЬКО голову и хвост, при попадании на клетку с едой - только голову.
0
Вложения
Тип файла: rar Snake.rar (218.2 Кб, 204 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.10.2012, 13:33

Создание сайта на C# c нуля, вопрос о CMS
В общем вопрос такой, заинтересовался созданием сайта на C#, один знакомый...

Клиент своего чата на WinRT (вопрос реализации)
Делаю в учебных целях чат. Сервер написал на .NET 4.0 (mono) ну это пока не...

Одинаковые методы в разных классах - вопрос оптимальной реализации
Есть 2 класса которые наследуются от одного интерфейса (т.е. есть общие поля и...


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

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

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