3 / 2 / 1
Регистрация: 14.09.2016
Сообщений: 501
1
.NET 4.x

Почему плохо работает консольная мини игра?

30.09.2018, 14:00. Показов 2149. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Program.cs:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleZaidimas
{
    class Program
    {
        static void Main(string[] args)
        {
           
 
            Map Mapas = new Map(6, 6);
                                
           
            Player player = new Player(Mapas);
 
            
            ConsoleKeyInfo keys;
 
            player.Braizome(); 
 
            while (!player.ArFinish())
            {
                keys = Console.ReadKey();
 
                switch (keys.Key)
                {
                    case ConsoleKey.DownArrow:
                        player.iApacia();
                        break;
                    case ConsoleKey.UpArrow:
                        player.iVirsu();
                        break;
                    case ConsoleKey.RightArrow:
                        player.iDesine();
                        break;
                    case ConsoleKey.LeftArrow:
                        player.iKaire();
                        break;
                }
                player.Braizome();
            }
            Console.WriteLine("Финиш!");
            
        }
    }
}
И есть 2 класса:

Map.cs:

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleZaidimas
{
    class Map
    {
        
       public byte Aukstis { get { return auks; } } // ВЫСОТА
       public byte Plotis { get; private set; }//ШИРИНА
       
        //КООРДИНАТЫ ФИНИША
       public byte FinishX { get; private set; } 
       public byte FinishY { get; private set; }
 
        Random rnd = new Random();
        private byte auks;
 
        public Map(byte aukstis, byte plotis)
        {
            auks = aukstis;
            Plotis = plotis;
 
            
            FinishX = (byte)rnd.Next(0, Plotis);
            FinishY = (byte)rnd.Next(0, auks);
        }
    }
}
Player.cs:

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleZaidimas
{
    class Player
    {
        //КООРДИНАТЫ ИГРОКА
        public byte X { get; set; }
        public byte Y { get; set; }
 
        
        private Map mapas;
        private Random rnd = new Random();
 
        public Player(Map GameMap)
        {
            //ГЕНЕРИРУЕМ ПОЗИЦИЮ ИГРОКА
            mapas = GameMap;
            X = (byte)rnd.Next(0, GameMap.Plotis);
            Y = (byte)rnd.Next(0, GameMap.Aukstis);
 
            //ПРОВЕРЯЕМ НЕ СОВПАДАЕТ ЛИ ПОЗИЦИЯ ИГРОКА С ПОЗИЦИЕЙ ФИНИША
            while (X==mapas.FinishX && Y==mapas.FinishY)
            {
                X = (byte)rnd.Next(0, GameMap.Plotis);
                Y = (byte)rnd.Next(0, GameMap.Aukstis);
            }
        }
 
        //РИСУЕМ КАРТУ
        public void Braizome()
        {
            Console.Clear();
            for (int i = 0; i < mapas.Plotis; i++)
            {
                for (int j = 0; j < mapas.Aukstis; j++)
                {
                    if (X==i && Y == j) 
                    {
                Console.Write("Z ");
                    }
            else if (mapas.FinishX == i && mapas.FinishX == j)
                {
                    Console.Write("F ");
                }
                else
                {
                    Console.Write("- ");
                }
                  
             }
      Console.WriteLine();
            }
        }
 
        public bool ArFinish()
        {
            if(X == mapas.FinishX && Y == mapas.FinishY)
            {
                return true;// ЕСЛИ ДОСТИГЛИ ФИНИША, ТО ВОЗВР. ПРАВДУ
            }
            return false; 
        }
 
// ЗДЕСЬ ЧТОБЫ МОЖНО БЫЛО ПЕРЕДВИГАТЬ "Z". 
        public void iApacia() // ВНИЗ
        {
            if (X < mapas.Aukstis - 1)
            {
                X++;
            }
        }
        public void iVirsu() // ВВЕРХ
        {
            if (X > 0)
            {
                X--;
            }
        }
        public void iDesine() //НА ПРАВО
        {
            if (Y < mapas.Plotis - 1)
            {
                Y++;
            }
        }
        public void iKaire() // НА ЛЕВО
        {
            if (Y>0)
            {
                Y--;
            }
        }
    }
}
Тут игра простая, создается 6 на 6 таблица из "-", буква игрока "Z", которую он может передвигать по этой карте с помощью стрелочек и буква финиша "F". Но есть какой-то баг, изза которого часто когда доходишь до финиша, то ничего не происходит, хотя должно вывести Console.WriteLine("Финиш!"); Но бывает, что и правильно всё срабатывает и выводит сразу Финиш! Также бывает что если долго походить, то даже не дойдя до финиша "F", пишет, что я якобы дошел. Я думаю, тут чтото с этим не так:
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
   public void iApacia() // ВНИЗ
        {
            if (X < mapas.Aukstis - 1)
            {
                X++;
            }
        }
        public void iVirsu() // ВВЕРХ
        {
            if (X > 0)
            {
                X--;
            }
        }
        public void iDesine()
        {
            if (Y < mapas.Plotis - 1) //НА ПРАВО
            {
                Y++;
            }
        }
        public void iKaire() // НА ЛЕВО
        {
            if (Y>0)
            {
                Y--;
            }
        }
    }
}
Как можно исправить?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.09.2018, 14:00
Ответы с готовыми решениями:

2D консольная игра
Хотел сделать с графикой ТЕТРИС, но потом подумал, что неплохо попробовать прощупать сначала такую...

Консольная игра квест
Помогите пожалуйста создать игру-квест, никак не могу понять почему выскакивает ошибка, с...

Консольная игра colors
доброго времени суток, пишу игру colors - представляет собой падающие блоки которые нужно совмещать...

Консольная игра «камень-ножницы-бумага»
Всем привет, нужна ваша помощь в решении данной задачи. Заранее благодарен Создать консольную игру...

2
Эксперт .NET
17350 / 12759 / 3340
Регистрация: 17.09.2011
Сообщений: 21,039
30.09.2018, 14:25 2
Лучший ответ Сообщение было отмечено Terminator004 как решение

Решение

Цитата Сообщение от Terminator004 Посмотреть сообщение
Как можно исправить?
У вас при отрисовке карты в методе Braizome неправильно производится проверка где рисовать финишную точку:
Цитата Сообщение от Terminator004 Посмотреть сообщение
C#
1
else if (mapas.FinishX == i && mapas.FinishX == j)
Обратите внимание, что j тоже сравнивается с FinishX вместо FinishY.
В итоге получается, что в консоли финишная точка отрисовывается не там, где она находится на самом деле — вот иногда вы на нее "наступаете", а финиша не происходит, потому что она не там. Иногда делаете шаг на вроде бы пустое место, а на самом деле там финиш — вот игра и завершается.
Ну а иногда "везет" и координаты финишной точки совпадают и она рисуется где надо.

Не по теме:

Прикольно, что не только у нас страдают именованием идентификаторов местными именами :)

2
3 / 2 / 1
Регистрация: 14.09.2016
Сообщений: 501
30.09.2018, 14:34  [ТС] 3
kolorotur, да, я не заметил, там должно было Y быть, то-есть else if (mapas.FinishX == i && mapas.FinishY == j)
Спасибо большое, теперь багов нет!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.09.2018, 14:34
Помогаю со студенческими работами здесь

Консольная игра камень-ножницы-бумага
Консольная игра камень ножницы бумага. Заранее извиняюсь за тупость , прост я совсем новичок в...

Консольная игра - нужны примеры или идеи
Друзья захотели изучать программирование и был выбран язык C#(сам прогаю на нем, так что понятна...

Использование класса рандом для умений персонажа (консольная игра)
Добры день всем, такой вопрос у меня появился: Можно ли использовать рандом для использования...

Мини-игра наподобие Flappy Bird
Разработка проекта В этой части должна быть предоставлена завершенная мини-игра. Задание:...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru