Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Grizli3
0 / 0 / 0
Регистрация: 28.10.2013
Сообщений: 13
#1

Создание игры "Буквопад" - C#

28.10.2013, 16:51. Просмотров 2006. Ответов 25
Метки нет (Все метки)

Здравствуйте! Сам не особо работал на С#, но учителю понадобилось, а с ним не поспоришь =) Задача вот в чем : сверху экрана летят буквы, сначала с медленной скоростью, которая со временем ускоряется. Игрок должен нажимать на ту букву на клавиатуре, которая есть на экране. Если нажата клавиша с буквой, которой нет на экране - новое очко к счетчику штрафов, если буква на экране "упала" донизу - еще одно штрафное очко. В конце игры выдается количество очков и количество штрафных очков. Как то так =). Все заранее спасибо за любую помощь =)
http://www.cyberforum.ru/csharp-beginners/thread2047471.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2013, 16:51
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Создание игры "Буквопад" (C#):

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

Создание игры "Крестики-Нолики"
Доброе время суток.Подскажите пожалуйста,как можно из элемента Panel,построить...

Создание игры "Расстановка 16 букв"
Помогите с созданием приложения. С таким еще не сталкивался. Где и как вообще...

Создание игры "стрелялки"
Я хожу на курсы по C#. Нам задали домашнее задание сделать игру "стрелялку". В...

Игра "Змейка", ошибка "Globals.Close не объявлен", неправильная логика игры
Нашёл в интернете код игры "змейка" и саму скомпилированную игру. Но есть...

25
lpvoid
322 / 305 / 59
Регистрация: 06.03.2013
Сообщений: 869
28.10.2013, 17:58 #2
муторное дело такие вещи писать, причем муторное весьма, делайте сами, если что непонятно по ходу - спрашивайте).
1
5665tm
170 / 116 / 14
Регистрация: 17.06.2013
Сообщений: 386
Завершенные тесты: 3
28.10.2013, 18:33 #3
В консоли или на WinForms? Есть идея как достаточно просто сделать в консоли, правда игровое поле будет заранее ограниченно в программе, а не размером консоли
0
lpvoid
322 / 305 / 59
Регистрация: 06.03.2013
Сообщений: 869
28.10.2013, 18:34 #4
вот, запилил кой-чего по-быстрому. формочки, играть можно, если что надо еще - допилите, там не сложно.
2
Вложения
Тип файла: zip WindowsFormsApplication2_2013-10-28 20-33-49Z.zip (10.8 Кб, 50 просмотров)
Grizli3
0 / 0 / 0
Регистрация: 28.10.2013
Сообщений: 13
28.10.2013, 19:01  [ТС] #5
lpvoid, благодарю за беспокойство=) Видимо, 10-й Visual Studio мал для Вашей программы, скачаю 13-й. Все что необходимо, думаю, сам изменю.
5665tm, Если не тяжело, то можете изложить идею? Возможно смогу подчерпнуть что-то для себя. Спасибо.
0
lpvoid
322 / 305 / 59
Регистрация: 06.03.2013
Сообщений: 869
28.10.2013, 19:05 #6
Grizli3, открывайте файл .csproj, а не .sln и будет вам щастье)

Не по теме:

извечное неудобство visual studio - отсутствие обратной совместимости сольюшенов

1
Grizli3
0 / 0 / 0
Регистрация: 28.10.2013
Сообщений: 13
28.10.2013, 19:08  [ТС] #7
lpvoid, ооооой я рааак ... =) Спасибо, начало положено, теперь станет легче
0
5665tm
170 / 116 / 14
Регистрация: 17.06.2013
Сообщений: 386
Завершенные тесты: 3
28.10.2013, 20:15 #8
В общем быдлокодил я быдлокодил, и получилось у меня сделать только падение с ускорением, как перехватыть нажатия я без понятия увы. И все же оставлю, мало ли

Кликните здесь для просмотра всего текста
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
using System;
using System.Diagnostics;
using System.Threading;
 
class Program
{
    static void Main()
    {
        // создаем массив хранящий буквы
        char[] ABC = new char[] {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
                       'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 
                       'V', 'W', 'X', 'Y', 'Z'};
        // создаем массив хранящий строки игрового поля в данный момент времени
        // в конкретном примере высота поля 20 строк,также нарисуем верхнюю и нижнюю границы
        string[] field = new string[20];
        field[0] = "\r\r\r\r\r\r\r--------------------------";
        field[field.Length - 1] = "\r\r\r\r\r\r\r---------------------------";
        // паузя показывающии длительность одного кадра
        int zzz;
        // падающая буква
        char liter;
        // ... и рандом для нее
        Random rnd = new Random();
        // цикл для вывода каждой буквы
        // 30 - число упавших букв перед выводом очков
        // одна итерация - одна упавшая в пропасть буква
        for (int i = 0; i < 30; i++)
        {
            // вот так мы сделаем уменьшение паузы
            zzz = 200 - (5 * i);
            // какую букву выведем? великий корейский рандом, я выбираю тебя!
            liter = ABC[rnd.Next(0, 26)];
            // этот цикл имитирует падение буквы
            // одна итерация - 1 кадр
            for (int k = 1; k < (field.Length - 1); k++)
            {
                // очищаем консоль
                Console.Clear(); 
                // еще один цикл - перерисовывает поле
                // одна итерация перерисовка одной строки
                for (int g = 1; g < (field.Length - 1); g++)
                {
                    field[g] = "";
                }
                field[k] = Convert.ToString(liter);
                foreach (string x in field) Console.WriteLine("       {0}", x);
                // пауза
                Thread.Sleep(zzz);
            }
            
        }
        Console.ReadKey();
    }
}
2
Taliesin
38 / 34 / 15
Регистрация: 18.09.2013
Сообщений: 115
29.10.2013, 11:08 #9
Мой вариант:
Кликните здесь для просмотра всего текста
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
using System;
using System.Threading;
 
 
namespace ConsoleApplication2
{class bukvopad
    {
        int cout = 0;
        char Sym;
        int PositionOnLine = 0;
        int PositionOnheight = 0;
        int Speed = 500;
        Random rand = new Random();
        public bukvopad()
        {
            this.NewSym();
        }
        private  void NewSym ()
        {
            string str ="qwertyuioplkjhgfdsazxcvbnm";
            this.Sym = str[rand.Next (0,25)];
            this.PositionOnLine=rand.Next(5,110);
            this.PositionOnheight=0;
        }
        private  void Screen ()
        {
            string strScreen="\n";
            for (int i = 0; i<Console.WindowWidth-25;i++)
                strScreen+=" ";
            strScreen+="Ваши текущие очки: "+this.cout.ToString()+"\n";
            for (int i = 0; i<this.PositionOnheight;i++)
                strScreen+="\n";
            for (int i = 0;i<this.PositionOnLine;i++)
                strScreen+=" ";
                
            strScreen+=this.Sym;
            PositionOnheight++;
            Console.WriteLine(strScreen);
            Thread.Sleep(this.Speed);
            Console.Clear();
        }
        private  void NextSym()
        {
            this.NewSym();
            this.cout+=10;
            this.Speed=this.Speed<50?50:this.Speed-=50;
            
        }
        public void GameWork()
        {
            ConsoleKeyInfo cki = new ConsoleKeyInfo();
            while (this.PositionOnheight <=20)
            {
                this.Screen();
                if (Console.KeyAvailable == true)
                {
                    cki = Console.ReadKey(true);
                    if (this.Sym == cki.KeyChar)this.NextSym();
                }
            }
            Console.Clear();
            Console.WriteLine("\n\n\n\n        Вы набрали {0} очков",this.cout);
        }
    }
class Program
    {
static void Main(string[] args)
{
    bukvopad a = new bukvopad();
    a.GameWork(); 
    Console.ReadKey();
}
 
}
}
1
5665tm
170 / 116 / 14
Регистрация: 17.06.2013
Сообщений: 386
Завершенные тесты: 3
29.10.2013, 13:33 #10
Благодаря листингу от Taliesin разобрался как осуществить перехват нажатия и доделал свой вариант.
Более сложная система подсчета очков, в зависимости от времени реакции. Мой рекорд 2084))

Кликните здесь для просмотра всего текста
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
using System;
using System.Diagnostics;
using System.Threading;
 
class Program
{
    static void Main()
    {
        // создаем массив хранящий буквы
        char[] ABC = new char[] {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
                       'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 
                       'V', 'W', 'X', 'Y', 'Z'};
        // создаем массив хранящий строки игрового поля в данный момент времени
        // в конкретном примере высота поля 20 строк,также нарисуем верхнюю и нижнюю границы
        string[] field = new string[20];
        field[0] = "\r\r\r\r\r\r\r--------------------------";
        field[field.Length - 1] = "\r\r\r\r\r\r\r---------------------------";
        // паузя показывающии длительность одного кадра
        int zzz;
        // падающая буква
        char liter;
        // секундомер для измерения скорости реакции
        var timekey = new Stopwatch();
        // информация о нажатой клавише
        ConsoleKeyInfo Key = new ConsoleKeyInfo();
        // ... и рандом для нее
        Random rnd = new Random();
        // цикл для вывода каждой буквы
        // 30 - число упавших букв перед выводом очков
        // одна итерация - одна упавшая в пропасть буква
        int score = 0;
        for (int i = 0; i < 30; i++)
        {
            // рестарт секундомера
            timekey.Restart();
            // вот так мы сделаем уменьшение паузы после каждой буквы
            zzz = 200 - (5 * i);
            // какую букву выведем? великий корейский рандом, я выбираю тебя!
            liter = ABC[rnd.Next(0, 26)];
            // этот цикл имитирует падение буквы
            // одна итерация - 1 кадр
            for (int k = 1; k < (field.Length - 1); k++)
            {
                // очищаем консоль
                Console.Clear();
                Console.WriteLine("Ваши очки: {0}", score);
                // еще один цикл - перерисовывает поле
                // одна итерация перерисовка одной строки
                for (int g = 1; g < (field.Length - 1); g++)
                {
                    field[g] = "";
                }
                field[k] = Convert.ToString(liter);
                foreach (string x in field) Console.WriteLine("       {0}", x);
                // пауза
                Thread.Sleep(zzz);
                // если была нажата клавиша, то...
                if (Console.KeyAvailable == true)
                {
                    // считываем клавишу
                    Key = Console.ReadKey(true);
                    // если правильно, то...
                    if (Key.KeyChar == Char.ToLower(liter))
                    {
                        // останавливаем таймер
                        timekey.Stop();
                        // прибавляем определенно количество очков, в зависимости от 
                        // времени реакции
                        score += (8000 - Convert.ToInt32(timekey.ElapsedMilliseconds))/100;
                        // и выходим из цикла
                        break;
                    }
                }
            }
        }
        Console.ReadKey();
    }
}


Taliesin, в вашем коде есть небольшая помарка вот здесь:

C#
1
 this.Sym = str[rand.Next (0,25)];
правильно будет

C#
1
 this.Sym = str[rand.Next (0,26)];
дело в том что рандом работает по правилу [a, b), то есть включая a, но не включая b. Можете в этом убедиться запустив такой код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
using System.Threading;
 
class Program
{
    static void Main()
    {
        Random rnd = new Random ();
        while (true)
        {
            Thread.Sleep(500);
            Console.WriteLine(rnd.Next(0, 2));
        }
    }
}
Всегда будет выпадать 0 и 1, но 2 никогда не появится. Также как и буква m в вашей программе
1
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
29.10.2013, 16:54 #11
Цитата Сообщение от lpvoid Посмотреть сообщение
Grizli3, открывайте файл .csproj, а не .sln и будет вам щастье)

Не по теме:

извечное г*вно visual studio - отсутствие обратной совместимости сольюшенов

достаточно ковырнуть две цифры в sln в блокноте и все будет прекрасно. Я больше поражаюсь из-за закешированных данных солюшена, из-за которых я несколько часов ... имел незабываемую ночь с TFS
1
lpvoid
29.10.2013, 17:07
  #12

Не по теме:

Цитата Сообщение от Psilon Посмотреть сообщение
достаточно ковырнуть две цифры в sln в блокноте и все будет прекрасно. Я больше поражаюсь из-за закешированных данных солюшена, из-за которых я несколько часов ... имел незабываемую ночь с TFS
так то оно так (кстати, благодаря вам таки вспомнил про сей трюк), но все же обратную совместимость, имхо, можно было сделать и нормальную.

0
Grizli3
0 / 0 / 0
Регистрация: 28.10.2013
Сообщений: 13
30.10.2013, 11:34  [ТС] #13
lpvoid, Приветствую! У меня будет 1 просьба. Не могли бы Вы оставить в своей работе комменты, кто да за что там отвечает, хотя бы для близиру, а то мое понимание чужих программ затуманенно под ноль =) Спасибо.
0
nio
30.10.2013, 13:47
  #14
 Комментарий модератора 
Прекращаем оффтоп
0
lpvoid
322 / 305 / 59
Регистрация: 06.03.2013
Сообщений: 869
30.10.2013, 14:15 #15
все прокомментировал как мог)
спрашивайте по ходу что на понятно
1
Вложения
Тип файла: zip WindowsFormsApplication2_2013-10-30 16-12-58Z.zip (11.7 Кб, 12 просмотров)
Grizli3
0 / 0 / 0
Регистрация: 28.10.2013
Сообщений: 13
07.12.2013, 14:19  [ТС] #16
lpvoid, 5665tm, Думаю вам будет интересно увидеть прогресс в моей работе =) Так что, скачайте, посмотрите =) Возможно есть что-то то можно убрать или наоборот добавить. Программа почти готова, нужно только прописать всякие исключения. Правда есть 1 вопрос. Как сделать так чтобы падал вниз не 1 битмап (читать как "буква"), а несколько. Ну чтобы падала не 1 буква, а, предположим, рандомно от 1 до 5 одновременно.
0
Вложения
Тип файла: rar WindowsFormsApplication1.rar (75.7 Кб, 12 просмотров)
lpvoid
322 / 305 / 59
Регистрация: 06.03.2013
Сообщений: 869
07.12.2013, 14:32 #17
Grizli3, неплохо сделали.
Цитата Сообщение от Grizli3 Посмотреть сообщение
Как сделать так чтобы падал вниз не 1 битмап (читать как "буква"),
рисуйте массив объектов Letter. если не меняли архитектуру - сделать будет несложно.
0
Grizli3
0 / 0 / 0
Регистрация: 28.10.2013
Сообщений: 13
11.12.2013, 13:43  [ТС] #18
lpvoid, не могли бы Вы показать, как сделать это? Написать, чтобы хотя бы 2 буквы падало. Я что-то тут наделал, наделал, создал массив, но беда в том, что прорисовка всех букв идет на 1-м битмапе, ну и тупо краш. Пока лишь получилось сделать так чтобы 1 элемент массива падал (1 буква). Но теперь даже после отлавливания нажатия идет краш (ничего удивительного, ведь работа забита на массив, а падет всего =)) Как заставить падать больше, я не знаю.
0
Вложения
Тип файла: rar WindowsFormsApplication1.rar (79.3 Кб, 5 просмотров)
Winhttp22
151 / 122 / 22
Регистрация: 16.02.2013
Сообщений: 815
11.12.2013, 16:05 #19
Цитата Сообщение от 5665tm Посмотреть сообщение
В общем быдлокодил я быдлокодил, и получилось у меня сделать только падение с ускорением, как перехватыть нажатия я без понятия увы. И все же оставлю, мало ли

Кликните здесь для просмотра всего текста
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
using System;
using System.Diagnostics;
using System.Threading;
 
class Program
{
    static void Main()
    {
        // создаем массив хранящий буквы
        char[] ABC = new char[] {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
                       'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 
                       'V', 'W', 'X', 'Y', 'Z'};
        // создаем массив хранящий строки игрового поля в данный момент времени
        // в конкретном примере высота поля 20 строк,также нарисуем верхнюю и нижнюю границы
        string[] field = new string[20];
        field[0] = "\r\r\r\r\r\r\r--------------------------";
        field[field.Length - 1] = "\r\r\r\r\r\r\r---------------------------";
        // паузя показывающии длительность одного кадра
        int zzz;
        // падающая буква
        char liter;
        // ... и рандом для нее
        Random rnd = new Random();
        // цикл для вывода каждой буквы
        // 30 - число упавших букв перед выводом очков
        // одна итерация - одна упавшая в пропасть буква
        for (int i = 0; i < 30; i++)
        {
            // вот так мы сделаем уменьшение паузы
            zzz = 200 - (5 * i);
            // какую букву выведем? великий корейский рандом, я выбираю тебя!
            liter = ABC[rnd.Next(0, 26)];
            // этот цикл имитирует падение буквы
            // одна итерация - 1 кадр
            for (int k = 1; k < (field.Length - 1); k++)
            {
                // очищаем консоль
                Console.Clear(); 
                // еще один цикл - перерисовывает поле
                // одна итерация перерисовка одной строки
                for (int g = 1; g < (field.Length - 1); g++)
                {
                    field[g] = "";
                }
                field[k] = Convert.ToString(liter);
                foreach (string x in field) Console.WriteLine("       {0}", x);
                // пауза
                Thread.Sleep(zzz);
            }
            
        }
        Console.ReadKey();
    }
}
ну вот... а если создать не одномерный массив с буквами, а двумерный? Причем вторая яяейка принадлежит к флажку - если буква вылетела на экран - изменили флаг... значит можно ориентироваться по флагу и кнопкам, которые нажал пользователь, чтобы убирать буквы, которые он нажал.
0
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
11.12.2013, 16:06 #20
Winhttp22, гадость говорите, лучше структуру создать, чем "а давайте в 23 ячейке массива у нас будет скрытый флаг? А почему в 23? А чтоб никто не догадался..."
0
11.12.2013, 16:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2013, 16:06
Привет! Вот еще темы с решениями:

Реализация Игры "Жизнь" из книги Уэзерелл Ч. "Этюды для программистов"
Кто нибудь встречал ее нга с#??? Если у кого-то есть, вы не могли бы выложить...

Написание игры "виселица" или любой другой не сложной игры
нужна помощь в написании игры &quot;виселица&quot; или любой другой не сложной игры на с#...

Описать класс "поезд", содержащий поля "пункт назначения", "номер поезда", "время отправления"
Помогите пожалуйста с классом Описать класс «поезд», содержащий следующие...

Проблема при сравнении: "Оператор ">" не может применяться к операндам типа "Т" и "Т""
Добрый день , пишу сортировку , все делаю на основе Т , но вот в чем проблемма...


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

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

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