Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
lirik
2 / 2 / 0
Регистрация: 17.03.2009
Сообщений: 23
#1

Почему не работает?:( [новичек] - C++

24.03.2009, 04:13. Просмотров 650. Ответов 3
Метки нет (Все метки)

Здравствуйте люди, помогите кто чем может
Пишу свою первую программу на С++ Builder , программа представляет собой игру "Пятнашки"(или как там ее ).

Не получается сделать чтоб при запуске программы все ячейки(кнопки) ,расставлялись в случайном порядке ,они у меня расставляються ,но не все :'(
Помогите пожалуйста найти ошибку!

main.cpp
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
120
121
122
123
124
125
126
127
128
//сдесь не дописана часть процесса игры ,так что на функции rePos, nextPos и boxClick не обращаем внимание:)
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "main.h"
#include "boxs.cpp"
 
#include <iostream>
#include <ctime>
#include <stdio.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
Boxs* playbox[15];
int das = 0;
int matrix[4][4];
int posarray[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 
 
int CleanPos = 16;
 
bool chknum(int tmpnum) {
for (int i = 0; i < 15; i++){
  if (posarray[i] == tmpnum) return false; }
 
return true;
}
 
 
int genNum(){
int a;
a = rand()%16;
if (!chknum(a)){
    genNum();
}else{
posarray[das] = a;
das++;
}
 
return a;
}
 
void setPos () {
 for (int o = 0; o < 15; o++) {
  int position = genNum();
  for (int i = 0; i < 4; i++) {
   for (int j = 0; j < 4; j++) {
    if ((i==3)&&(j==3)) break;
 
    if (position == matrix[i][j]){
     playbox[o]->gamebox->Left = 71*j;
     playbox[o]->gamebox->Top = 71*i;
 
     char bnm[64];
     sprintf( bnm, " Button = %d\n Position = %dx%d\n State = %d\n Matrix = %d", o, i, j, position, matrix[i][j]);
     String mnb = bnm;
     Application->MessageBoxA(mnb.w_str(), L"Rapport", MB_OK);
    }
   }
  }
 }
}
 
void rePos(int direction, int cof, TButton *eobj){
if (direction == 0) {
 eobj->Left += cof;
}else if (direction == 1) {
 eobj->Top += cof;
}
}
 
void nextPos(TButton *obj){
 /*playbox[1]->gamebox->Tag = 5;                        /*
 if (CleanPos == obj->Tag+1) {
  rePos(0, 71, obj);       CleanPos-1;
 }else if (CleanPos == obj->Tag-1) {
  rePos(0, -71, obj);      CleanPos+1;
 }else if (CleanPos == obj->Tag-4) {
  rePos(1, -71, obj);      CleanPos+4;
 }else if (CleanPos == obj->Tag+4) {
  rePos(1, 71, obj);       CleanPos-4;
 }                                         */
}
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){
srand(time(0));
int qwe = 1;
 
for (int i = 0; i < 4; i++) {
 for (int j = 0; j < 4; j++) {
  matrix[i][j] = qwe++;
 }
}
 
 for (int z = 0; z < 15; z++) {
  playbox[z] = new Boxs(z+1);
  playbox[z]->gamebox->Parent = this;
 }
 
setPos();
 
char test[32];
sprintf(test, "%d %d %d %d\n%d %d %d %d\n%d %d %d %d\n%d %d %d \n",
    posarray[0],posarray[1],posarray[2],posarray[3],
    posarray[4],posarray[5],posarray[6],posarray[7],
    posarray[8],posarray[9],posarray[10],posarray[11],
    posarray[12],posarray[13],posarray[14]);
String t1 = test;
Application->MessageBoxA(t1.w_str(), L"Yo", MB_OK);
 
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BoxClick(TObject *Sender){
int ab = 15;
 
for (int i = 0; i < 15; i++) {
if (Sender == playbox[i]->gamebox) Application->MessageBoxA(playbox[i]->gamebox->Name.w_str(), L"caption", 
 
MB_YESNOCANCEL | MB_ICONWARNING);
}
 
}
//---------------------------------------------------------------------------
boxs.cpp
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
//сдесь не обращаем внимание не начто кроме основной части конструктора
#include <iostream>
#include <stdio.h>
#include "boxs.h"
#include <vcl.h>
#include "main.h"
 
Boxs::Boxs(int num) :
    gamebox(new TButton(this)){
 
  gamebox->Caption = num;
  gamebox->Height = 65;
  gamebox->Width = 65;
  gamebox->Font->Size = 24;
  gamebox->OnClick = &Form1->BoxClick;
  gamebox->BringToFront();
 
  char buff[4];
  sprintf(buff, "a%d", num);
  gamebox->Name = buff;
 
  gamebox->Show();
 
}
Boxs::~Boxs() {
    delete[] gamebox;
}
 
void Boxs::StartGame(){
 
}
void Boxs::rePos(){
 
}
main.dfm //делфиевская форма
Delphi
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
object Form1: TForm1
  Left = 0
  Top = 0
  Margins.Left = 10
  Margins.Top = 10
  Margins.Right = 10
  Margins.Bottom = 10
  AutoSize = True
  Caption = 'MiniGame 1.1'
  ClientHeight = 278
  ClientWidth = 278
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  Menu = MainMenu1
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object b9: TButton
    Left = 0
    Top = 142
    Width = 65
    Height = 65
    HelpContext = 75
    Caption = '9'
    Enabled = False
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -32
    Font.Name = 'Tahoma'
    Font.Style = []
    ParentFont = False
    TabOrder = 8
  end
  object b8: TButton
    Left = 213
    Top = 71
    Width = 65
    Height = 65
    HelpContext = 75
    Caption = '8'
    Enabled = False
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -32
    Font.Name = 'Tahoma'
    Font.Style = []
    ParentFont = False
    TabOrder = 7
  end
  object b7: TButton
    Left = 142
    Top = 71
    Width = 65
    Height = 65
    HelpContext = 75
    Caption = '7'
    Enabled = False
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -32
    Font.Name = 'Tahoma'
    Font.Style = []
    ParentFont = False
    TabOrder = 6
  end
  object b6: TButton
    Left = 71
    Top = 71
    Width = 65
    Height = 65
    HelpContext = 75
    Caption = '6'
    Enabled = False
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -32
    Font.Name = 'Tahoma'
    Font.Style = []
    ParentFont = False
    TabOrder = 5
  end
  object b5: TButton
    Left = 0
    Top = 71
    Width = 65
    Height = 65
    HelpContext = 75
    Caption = '5'
    Enabled = False
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -32
    Font.Name = 'Tahoma'
    Font.Style = []
    ParentFont = False
    TabOrder = 4
  end
  object b4: TButton
    Left = 213
    Top = 0
    Width = 65
    Height = 65
    HelpContext = 75
    Caption = '4'
    Enabled = False
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -32
    Font.Name = 'Tahoma'
    Font.Style = []
    ParentFont = False
    TabOrder = 3
  end
  object b3: TButton
    Left = 142
    Top = 0
    Width = 65
    Height = 65
    HelpContext = 75
    Caption = '3'
    Enabled = False
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -32
    Font.Name = 'Tahoma'
    Font.Style = []
    ParentFont = False
    TabOrder = 2
  end
  object b2: TButton
    Left = 71
    Top = 0
    Width = 65
    Height = 65
    HelpContext = 75
    Caption = '2'
    Enabled = False
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -32
    Font.Name = 'Tahoma'
    Font.Style = []
    ParentFont = False
    TabOrder = 1
  end
  object b16: TButton
    Left = 213
    Top = 213
    Width = 65
    Height = 65
    HelpContext = 75
    Caption = '16'
    Enabled = False
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -32
    Font.Name = 'Tahoma'
    Font.Style = []
    ParentFont = False
    TabOrder = 15
  end
  object b15: TButton
    Left = 142
    Top = 213
    Width = 65
    Height = 65
    HelpContext = 75
    Caption = '15'
    Enabled = False
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -32
    Font.Name = 'Tahoma'
    Font.Style = []
    ParentFont = False
    TabOrder = 14
  end
  object b14: TButton
    Left = 71
    Top = 213
    Width = 65
    Height = 65
    HelpContext = 75
    Caption = '14'
    Enabled = False
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -32
    Font.Name = 'Tahoma'
    Font.Style = []
    ParentFont = False
    TabOrder = 13
  end
  object b13: TButton
    Left = 0
    Top = 213
    Width = 65
    Height = 65
    HelpContext = 75
    Caption = '13'
    Enabled = False
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -32
    Font.Name = 'Tahoma'
    Font.Style = []
    ParentFont = False
    TabOrder = 12
  end
  object b12: TButton
    Left = 213
    Top = 142
    Width = 65
    Height = 65
    HelpContext = 75
    Caption = '12'
    Enabled = False
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -32
    Font.Name = 'Tahoma'
    Font.Style = []
    ParentFont = False
    TabOrder = 11
  end
  object b11: TButton
    Left = 142
    Top = 142
    Width = 65
    Height = 65
    HelpContext = 75
    Caption = '11'
    Enabled = False
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -32
    Font.Name = 'Tahoma'
    Font.Style = []
    ParentFont = False
    TabOrder = 10
  end
  object b10: TButton
    Left = 71
    Top = 142
    Width = 65
    Height = 65
    HelpContext = 75
    Caption = '10'
    Enabled = False
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -32
    Font.Name = 'Tahoma'
    Font.Style = []
    ParentFont = False
    TabOrder = 9
  end
  object b1: TButton
    Tag = 16
    Left = 0
    Top = 0
    Width = 65
    Height = 65
    HelpContext = 75
    Caption = '1'
    Enabled = False
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -32
    Font.Name = 'Tahoma'
    Font.Style = []
    ParentFont = False
    TabOrder = 0
  end
  object MainMenu1: TMainMenu
    Left = 192
    Top = 65520
    object N1: TMenuItem
      Caption = #1060#1072#1081#1083
      object N2: TMenuItem
        Caption = #1053#1086#1074#1072#1103' '#1080#1075#1088#1072
      end
      object N3: TMenuItem
        Caption = '-'
      end
      object N4: TMenuItem
        Caption = #1042#1099#1093#1086#1076
      end
    end
    object N5: TMenuItem
      Caption = '?'
      object N6: TMenuItem
        Caption = #1054' '#1087#1088#1086#1075#1088#1072#1084#1084#1077
      end
    end
  end
end
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.03.2009, 04:13     Почему не работает?:( [новичек]
Посмотрите здесь:

C++ Одномерные массивы на Visual C++ 2008 : я новичек HELP
C++ Я новичек. Проверил силы - не работает прога
C++ Работа с файлами, новичек ищет совета.
почему не работает? C++
Не могу никак понять (новичек). C++
почему не работает? C++
Почему не работает? C++
C++ почему не работает?
C++ Почему не работает if-else
C++ Почему не работает?
C++ Почему не работает?
C++ Почему не работает gets?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
24.03.2009, 05:13     Почему не работает?:( [новичек] #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bool chknum(int tmpnum)
{
    for (int i = 0; i < 15; i++)
        if (posarray[i] == tmpnum)
            return false;
    return true;
}
 
int genNum(void)
{
    int a;
 
    a = rand()%16;
    if (!chknum(a))
        genNum();
    else
        posarray[das++] = a;
    return a;
}
каково условие выхода из рекурсивной функции, когда все числа будут заполнены ?

Добавлено через 10 минут 4 секунды
C++
1
    int position = genNum();
эта строка за что отвечает ?
lirik
2 / 2 / 0
Регистрация: 17.03.2009
Сообщений: 23
24.03.2009, 07:17  [ТС]     Почему не работает?:( [новичек] #3
Здравствуйте accept , спасибо за ответ!

в строке
C++
1
int position = genNum();
указываеться на какую позицию нужно поместить очередную кнопку , тоесть есть поле 4x4 одно из них открыто , соответственно переменная position равна от 1 до 15;

в функции genNum создаеться случайное число , затем проверяеться небыло ли это число уже создано , если было то опять вызываеться genNum , если нет то это число записываеться в массив posarray , потом функция возвращает переменной position это число , если вы можете предложить другое решение этой задачи , буду бесконечно благодарен ,т.к. мое решение крайне не красиво , и скорее всего не правильно

условия вывода нет , функция вызываеться 15 раз , значит масив заполниться 15 раз

Добавлено через 2 минуты 49 секунд
Для всех дебилов вроде меня

НЕ НУЖНО ОБЪЯВЛЯТЬ ПЕРЕМЕННЫЕ В РЕКРУСИВНЫХ ФУНКЦИЯХ!)

C++
1
2
3
4
5
6
7
8
9
10
11
int genNum(void)
{
    int a;//НЕ ПРАВИЛЬНО
 
    a = rand()%16;
    if (!chknum(a))
        genNum();
    else
        posarray[das++] = a;
    return a;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
    int a; //ПРАВИЛЬНО
int genNum(void)
{
 
 
    a = rand()%16;
    if (!chknum(a))
        genNum();
    else
        posarray[das++] = a;
    return a;
}
ВО ДУРАК А

всем спасибо, все работает
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
24.03.2009, 10:08     Почему не работает?:( [новичек] #4
Код
    int posarray[15] = { 0 };
там правило есть в стандарте, что если количество инициализаторов меньше числа элементов, оставшиеся инициализируются нулями

Код
    int posarray[15] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
вот если для второго вида применить функцию genNum, она как выйдет ? на нуле ? а если он никогда не сгенерится ?
ограничитель встраивают прямо в функцию (проверять das, если он меньше 16, то можно вызывать, если нет, то всё return и только)

чем больше глобальных переменных, тем хуже
программа становится монолитной, а должна состоять из отдельных частей (тогда их можно совершенствовать по отдельности, тогда как остальные части продолжают работать в обычном виде, и так каждую часть, не вырубая всей программы), иначе если захочешь что-то изменить, то сначала придётся сломать программу, переделать, потом заново собрать и так для каждого изменения, особенно сложно в таких случаях добавлять в программу новые возможности, потому что старые их как бы не пускают (всё ими занято и врезки не предусмотрены).
Yandex
Объявления
24.03.2009, 10:08     Почему не работает?:( [новичек]
Ответ Создать тему
Опции темы

Текущее время: 09:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru