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

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

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

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

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

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

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

8
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
08.07.2014, 10:39
Цитата Сообщение от Scully Посмотреть сообщение
Какой компонент лучше всего использовать для таблицы
StringGrid даст вам свободу выбора любого числа столбцов.
А записывать/загружать через промежуточный StringList.
0
0 / 0 / 1
Регистрация: 21.05.2014
Сообщений: 26
08.07.2014, 16:42  [ТС]
Спасибо! С записью\считыванием разобрался.
Как теперь можно было бы упорядочить результаты? (сопоставить данные в ячейках)
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
08.07.2014, 16:56
Ну выбирайте какую-нибудь сортировку, проходитесь ею по требуемому столбцу, и меняйте строки. Но это вариант в лоб.
Лучше загоните все строки в StringList, а у него уже есть метод CustomSort. В одну строку все отсортируется. Правда реализацию сортировки написать придется. Но вы же знаете по какому признаку будут ваши строки сортироваться.
Сортировка строк в memo по датам
0
0 / 0 / 1
Регистрация: 21.05.2014
Сообщений: 26
10.07.2014, 08:41  [ТС]
Удалось реализовать нужную табличку и теперь возникает вопрос: как сделать так, чтобы, допустим, если игрок победил на уровне сложности "Тяжёлый" с 3-мя оставшимися попытками и его результат записался в таблицу 4-ым сверху так, чтобы остальные, что ниже, сдвинулись вниз? И так по аналогии...
0
0 / 0 / 1
Регистрация: 21.05.2014
Сообщений: 26
10.07.2014, 08:53  [ТС]
Тупанул и не добавил скриншот для наглядности...
Миниатюры
Таблица рекордов для игры "Угадай число"  
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
10.07.2014, 09:02
Scully, покажите, как вы делаете.
0
0 / 0 / 1
Регистрация: 21.05.2014
Сообщений: 26
10.07.2014, 09:36  [ТС]
Код кнопки "Таблица рекордов" в главном меню.
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
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
10.07.2014, 12:15
Лучший ответ Сообщение было отмечено 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.07.2014, 12:15
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru