Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 1
Регистрация: 21.05.2014
Сообщений: 26
1

Таблица рекордов для игры "Угадай число"

08.07.2014, 10:22. Показов 3000. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Передо мною стоит задача: сделать в С++ Builder 6 игру "Угадай число".
Справился со всем, кроме таблицы рекордов. Нужно сделать так, чтобы в ней могло быть максимум 10 игроков и места распределялись в зависимости от того, на какой сложности игрок играл и сколько попыток у него осталось.
Простую таблицу рекордов мне реализовать удалось (см. приложение), но необходимо реализовать то, что описано выше.
Как я понимаю, для более презентабельного вида, колонок в таблице лучше сделать 3 (отдельно под имя, уровень сложности и кол-во попыток), но в ValueListEditor'e я этого реализовать не смог, поэтому записал в одну из колонок 2 опции (уровень сложности \ оставшееся кол-во попыток). Выбрал именно этот компонент, потому что им просто взаимодействовать с файлами (запись\загрузка строк).
Какой компонент лучше всего использовать для таблицы и как реализовать то, что я описал выше?
Заранее благодарен за помощь.
Миниатюры
Таблица рекордов для игры "Угадай число"  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.07.2014, 10:22
Ответы с готовыми решениями:

Таблица рекордов для 2d игры
Всем привет, как можно сделать таблицу рекордов для 2d игры WinAPI c++? Может есть какие-то...

Таблица рекордов для игры
Доброго времени суток! Подскажите, пожалуйста, как сделать таблицу рекордов. Есть игра. Сначала...

Реализовать генерацию случайных чисел для игры "Угадай число"
Всем привет!написал код для игры. По условию компьютер должен загадать число от 1 до 100 и...

Составить программу игры «Угадай число».
Составить программу игры «Угадай число». Компьютер загадывает трехзначное число при помощи...

Таблица рекордов для игры
Добрый день! Посоветуйте как можно реализовать таблицу рекордов для небольшой игры? Таблицу...

8
Почетный модератор
Эксперт С++
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
08.07.2014, 10:39 2
Цитата Сообщение от Scully Посмотреть сообщение
Какой компонент лучше всего использовать для таблицы
StringGrid даст вам свободу выбора любого числа столбцов.
А записывать/загружать через промежуточный StringList.
0
0 / 0 / 1
Регистрация: 21.05.2014
Сообщений: 26
08.07.2014, 16:42  [ТС] 3
Спасибо! С записью\считыванием разобрался.
Как теперь можно было бы упорядочить результаты? (сопоставить данные в ячейках)
0
Почетный модератор
Эксперт С++
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
08.07.2014, 16:56 4
Ну выбирайте какую-нибудь сортировку, проходитесь ею по требуемому столбцу, и меняйте строки. Но это вариант в лоб.
Лучше загоните все строки в StringList, а у него уже есть метод CustomSort. В одну строку все отсортируется. Правда реализацию сортировки написать придется. Но вы же знаете по какому признаку будут ваши строки сортироваться.
Сортировка строк в memo по датам
0
0 / 0 / 1
Регистрация: 21.05.2014
Сообщений: 26
10.07.2014, 08:41  [ТС] 5
Удалось реализовать нужную табличку и теперь возникает вопрос: как сделать так, чтобы, допустим, если игрок победил на уровне сложности "Тяжёлый" с 3-мя оставшимися попытками и его результат записался в таблицу 4-ым сверху так, чтобы остальные, что ниже, сдвинулись вниз? И так по аналогии...
0
0 / 0 / 1
Регистрация: 21.05.2014
Сообщений: 26
10.07.2014, 08:53  [ТС] 6
Тупанул и не добавил скриншот для наглядности...
Миниатюры
Таблица рекордов для игры "Угадай число"  
0
Почетный модератор
Эксперт С++
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
10.07.2014, 09:02 7
Scully, покажите, как вы делаете.
0
0 / 0 / 1
Регистрация: 21.05.2014
Сообщений: 26
10.07.2014, 09:36  [ТС] 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
void __fastcall TForm1::Button2Click(TObject *Sender)
{
        Form6->Left=Screen->Width/2-Form6->ClientWidth/2;
        Form6->Top=Screen->Height/2-Form6->ClientHeight/2;
        Form6->StringGrid1->Cells[0][0] = "Имя";
        Form6->StringGrid1->Cells[1][0] = "Сложность";
        Form6->StringGrid1->Cells[2][0] = "Оставшиеся попытки";
        if(FileExists("records.dat"))
        {
                TStringList *rec = new TStringList;
                rec->LoadFromFile("records.dat");
                for (int g = 0; g < 10; g++)
                {
                        Form6->StringGrid1->Rows[g+1]->DelimitedText = rec->Strings[g];
                }
                for (int g = 0; g < 10; g++)
                {
                        for (int u = 0; u < 9; u++)
                        {
                                if ((Form6->StringGrid1->Cells[1][u+2] == "Тяжёлый" && StrToInt(Form6->StringGrid1->Cells[2][u+1]) < StrToInt(Form6->StringGrid1->Cells[2][u+2])) || (Form6->StringGrid1->Cells[1][u+2] == "Тяжёлый" && (Form6->StringGrid1->Cells[1][u+1] == "Средний" || Form6->StringGrid1->Cells[1][u+1] == "Лёгкий")) || (Form6->StringGrid1->Cells[1][u+2] == "Средний" && Form6->StringGrid1->Cells[1][u+1] == "Средний" && StrToInt(Form6->StringGrid1->Cells[2][u+1]) < StrToInt(Form6->StringGrid1->Cells[2][u+2])) || (Form6->StringGrid1->Cells[1][u+2] == "Средний" && Form6->StringGrid1->Cells[1][u+1] == "Лёгкий") || (Form6->StringGrid1->Cells[1][u+1] == "Лёгкий" && Form6->StringGrid1->Cells[1][u+2] == "Лёгкий" && StrToInt(Form6->StringGrid1->Cells[2][u+1]) < StrToInt(Form6->StringGrid1->Cells[2][u+2])))
                                {
                                        rec->Exchange(u, u+1);
                                        Form6->StringGrid1->Rows[u+1]->DelimitedText = rec->Strings[u];
                                        Form6->StringGrid1->Rows[u+2]->DelimitedText = rec->Strings[u+1];
                                }
                        }
                }
                delete rec;
        }
        else
        {
                Form6->StringGrid1->Cells[0][1] = "-пусто-";
                Form6->StringGrid1->Cells[0][2] = "-пусто-";
                Form6->StringGrid1->Cells[0][3] = "-пусто-";
                Form6->StringGrid1->Cells[0][4] = "-пусто-";
                Form6->StringGrid1->Cells[0][5] = "-пусто-";
                Form6->StringGrid1->Cells[0][6] = "-пусто-";
                Form6->StringGrid1->Cells[0][7] = "-пусто-";
                Form6->StringGrid1->Cells[0][8] = "-пусто-";
                Form6->StringGrid1->Cells[0][9] = "-пусто-";
                Form6->StringGrid1->Cells[0][10] = "-пусто-";
        }
        Form6->ShowModal();
}
Кнопка "Записать" на форме победы. Там всего вперемешку. Надо её полностью переписывать.

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
void __fastcall TForm4::Button1Click(TObject *Sender)
{
        Button1->Enabled = false;
        TStringList *rec = new TStringList;
        for (int d = 0; d< 10; d++)
        {
                if (Form6->StringGrid1->Cells[1][d+1] == " ")
                {
                        Form1->x = 1;
                }
        }
        for (int d = 0; d < 10; d++)
        {
                //if ((Form6->StringGrid1->Cells[1][d+1] == " " && Form2->ComboBox1->ItemIndex == 0) || (Form6->StringGrid1->Cells[1][d+1] == "Лёгкий" && Form2->ComboBox1->ItemIndex == 0 && Form1->i >= Form6->StringGrid1->Cells[2][d+1] && Form1->x == 0 /*&& d != 9 && Form6->StringGrid1->Cells[2][d+2] */))
                if (Form2->ComboBox1->ItemIndex == 0 && (Form1->x == 1 && (d == 9 || (Form6->StringGrid1->Cells[1][10-d-1] == "Лёгкий" && Form1->i < Form6->StringGrid1->Cells[1][10-d-1] && Form1->i >= Form6->StringGrid1->Cells[1][10-d] && d != 9))))
                {
                        for (int i = 0; i < d; i++)
                        {
                                Form6->StringGrid1->Rows[10-i] = Form6->StringGrid1->Rows[10-i-1];
                        }
                        Form6->StringGrid1->Cells[0][10-d] = Edit1->Text;
                        Form6->StringGrid1->Cells[1][10-d] = "Лёгкий";
                        Form6->StringGrid1->Cells[2][10-d] = Form1->i;
                        for (int g = 0; g < 10; g++)
                        {
                                rec->Add(Form6->StringGrid1->Rows[g+1]->DelimitedText);
                        }
                        rec->SaveToFile("records.dat");
                        delete rec;
                        break;
                }
                /*if ((Form6->StringGrid1->Cells[1][d+1] == " " && Form2->ComboBox1->ItemIndex == 1) || (Form6->StringGrid1->Cells[1][d+1] == "Лёгкий" && Form1->x == 0 && Form2->ComboBox1->ItemIndex == 1) || (Form6->StringGrid1->Cells[1][d+1] == "Средний" && Form2->ComboBox1->ItemIndex == 1 && Form1->i >= Form6->StringGrid1->Cells[2][d+1] && Form1->x == 0))
                {
                        Form6->StringGrid1->Cells[0][d+1] = Edit1->Text;
                        Form6->StringGrid1->Cells[1][d+1] = "Средний";
                        Form6->StringGrid1->Cells[2][d+1] = Form1->i;
                        for (int g = 0; g < 10; g++)
                        {
                                rec->Add(Form6->StringGrid1->Rows[g+1]->DelimitedText);
                        }
                        rec->SaveToFile("records.dat");
                        delete rec;
                        break;
                }
                //if ((Form6->StringGrid1->Cells[1][d+1] == " " && Form2->ComboBox1->ItemIndex == 2) || (Form6->StringGrid1->Cells[1][d+1] == "Лёгкий" && Form1->x == 0 && Form2->ComboBox1->ItemIndex == 2) || (Form6->StringGrid1->Cells[1][d+1] == "Средний" && Form1->x == 0 && Form2->ComboBox1->ItemIndex == 2) || (Form6->StringGrid1->Cells[1][d+1] == "Тяжёлый" && Form2->ComboBox1->ItemIndex == 2 && Form1->i >= Form6->StringGrid1->Cells[2][d+1] && Form1->x == 0))
                {
                        Form6->StringGrid1->Cells[0][d+1] = Edit1->Text;
                        Form6->StringGrid1->Cells[1][d+1] = "Тяжёлый";
                        Form6->StringGrid1->Cells[2][d+1] = Form1->i;
                        for (int g = 0; g < 10; g++)
                        {
                                rec->Add(Form6->StringGrid1->Rows[g+1]->DelimitedText);
                        }
                        rec->SaveToFile("records.dat");
                        delete rec;
                        break;
                }*/
        }
        Form1->x = 0;
}
0
Почетный модератор
Эксперт С++
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
10.07.2014, 12:15 9
Лучший ответ Сообщение было отмечено Scully как решение

Решение

Сортирует каждый столбец по убыванию, начиная со второго. Если в столбце встречается две одинаковые строки, то сортирует по следующему столбцу.
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
//---------------------------------------------------------------------------
#include<memory>
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm6 *Form6;
char GlobalTextDelimiter; // Глобальный разделитель. Чтобы был виден в функции сортировки.
//---------------------------------------------------------------------------
__fastcall TForm6::TForm6(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm6::FormCreate(TObject *Sender)
{
        Form6->StringGrid1->Cells[0][0] = "Имя";
        Form6->StringGrid1->Cells[1][0] = "Сложность";
        Form6->StringGrid1->Cells[2][0] = "Оставшиеся попытки";
 
        GlobalTextDelimiter = ' ';
}
//---------------------------------------------------------------------------
int __fastcall HowToSort( TStringList *TableRow, int numRow1, int numRow2 )
{
std::auto_ptr<TStringList> Row1( new TStringList() ), Row2( new TStringList() ); // Для наглядности и удобства нумерации. По хорошему можно парсить врукопашную по глобальному разделителю.
 
Row1->Delimiter = GlobalTextDelimiter;
Row2->Delimiter = GlobalTextDelimiter;
 
Row1->DelimitedText = TableRow->Strings[numRow1];
Row2->DelimitedText = TableRow->Strings[numRow2];
 
const int FirstOverSecond = -1, FirstUnderSecond = 1, DontCare = 0;
 
unsigned index = 0;
while( ++index < Row1->Count ) // Начиная со второго столбца
  if( StrToIntDef( Row1->Strings[index], 0 ) > StrToIntDef( Row2->Strings[index], 0 ) )
    return FirstOverSecond;
  else
  if( StrToIntDef( Row1->Strings[index], 0 ) < StrToIntDef( Row2->Strings[index], 0 ) )
    return FirstUnderSecond;
 
return DontCare;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm6::Button1Click(TObject *Sender)
{
std::auto_ptr<TStringList> List( new TStringList() );
 
List->LoadFromFile("records.dat");
List->Delimiter = GlobalTextDelimiter;
 
List->CustomSort( HowToSort ); // Собственно сортировка
 
StringGrid1->RowCount = List->Count + StringGrid1->FixedRows;
for( unsigned i=0; i<List->Count; i++ ) // Вывод
  StringGrid1->Rows[i + StringGrid1->FixedRows]->DelimitedText = List->Strings[i];
 
}
//---------------------------------------------------------------------------
Названия уровней сложности в файле заменены на соответствующие номера: 1 - Легкий, 2 - Средний, 3 - Тяжелый. Для удобства сравнения друг с другом. При выводе следует подменять их на соответствующие названия обратно.
2
10.07.2014, 12:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.07.2014, 12:15
Помогаю со студенческими работами здесь

Java. Таблица рекордов для игры
Хочу в игру добавить таблицу рекордов,чтобы 20 лучших результатов сохраняло в таблицу. Подскажите,...

Создание бд таблица рекордов для игры
Помогите написать бд к игре, знаю как писать в делфи но в лазарусе нет компонента adoconnection....

Таблица рекордов для игры в WForms
Начал учить Basic относительно недавно. Решил сделать небольшую игру в WForms. Основу игры вроде...

Delphi таблица рекордов для игры Змейка
Хочу в игру добавить таблицу рекордов. Чтобы 10 лучших результатов записывались в таблицу....

Таблица рекордов для игры в типизированном файле
Доброго времени суток форумчане. Написал курсовую на игровую тематику. Нужно добавить для нее...

Сортировка в файле с разными типами данных (таблица рекордов для игры)
я сделал запись в файл таким образом: пример: Сложный уровень, 1, cetx Сложный уровень, 13, eysy...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru