Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
rura
0 / 0 / 0
Регистрация: 08.01.2014
Сообщений: 153
#1

Пятнашки почти работают правильно

03.05.2015, 23:23. Просмотров 1024. Ответов 1
Метки нет (Все метки)

Ребят, помогите пожалуйста найти ошибочку. Вроде как работает только при первой замене "одного квадратика на другой". Дальше работает как-то непонятно...

Полагаю, что я неправильно сделала цикл..

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
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
// Sceleton.cpp : Defines the entry point for the application.
//
 
#include "stdafx.h"
 
 
 
char name[]="Qwerty";//Необходимо для регистрации окна
 
HINSTANCE hInst;
int APIENTRY WinMain(HINSTANCE hInstance,//хендлер приложения
                     HINSTANCE ,
                     LPSTR     lpCmdLine,//командная строка
                     int       nCmdShow)//вид окна
{
    
    hInst = hInstance;
    // 1.Создание внешнего вида ОКНА
    WNDCLASS win;//объект для информации об окне
    win.style=CS_HREDRAW|CS_VREDRAW;//Стили перерисовки
    win.lpfnWndProc=WFunc;//Имя оконной функции
    win.cbClsExtra=win.cbWndExtra=0;
    win.hInstance=hInstance;//имя приложения, к которому привязано окно
    win.hIcon=LoadIcon(NULL,IDI_ASTERISK);//иконка, идентификатор иконки ID_APPLIKATION
    win.hCursor=LoadCursor(NULL,IDC_ARROW); //курсор
    win.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//Цвет фона
    win.lpszMenuName=NULL;//меню отсутствует
    win.lpszClassName=name;//Имя для регистрации
 
    //2.Регистрация окна в Операционной системе
    if (!RegisterClass(&win))
    {
        MessageBox(NULL,"Окно не зарегистрировано","Ошибка",MB_OK);
        return -1;//если окно не зарегистрировано
    }
 
    //3.Создание ОКНА
    HWND hwnd; //Объявление хендлера Окна
    hwnd=CreateWindow(name,"Первое окно",WS_OVERLAPPEDWINDOW/*|WS_VISIBLE*/,50,50,
                      500,500,HWND_DESKTOP,NULL,hInstance,NULL);//Создание хендлера Окна
 
    
 
    //4*.Отображение окна
 
    ShowWindow(hwnd,nCmdShow); //nCmdShow - для показа  окна
    UpdateWindow (hwnd); //обновить сразу окно - перерисовка
 
    //5.создание насоса сообщений
    MSG msg; //описание переменной Сообщения
    while (GetMessage(&msg,0,0,0))
    {
        TranslateMessage(&msg);  //разрешает использовать клавиатуру
        DispatchMessage(&msg); //отправка обработанного сообщения в ОС
    }
    
    return msg.wParam; //корректное закрытие основной программы
}
 
 
//////////////////////////////////////////////////////////////////////////////////////////////////
 
// stdafx.h : include file for standard system include files,
//  or project specific include files that are used frequently, but
//      are changed infrequently
//
 
#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_
 
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
 
#define WIN32_LEAN_AND_MEAN     // Exclude rarely-used stuff from Windows headers
 
#include <windows.h>
#include <string.h>
#include <stdio.h>
 
#include <stdlib.h>
 
 
 
LRESULT CALLBACK WFunc (HWND,UINT,WPARAM,LPARAM);
 
void ShowMas(HWND[],int[]);
TCHAR str[256] = "";
 
#include <time.h>   
 
#endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
// stdafx.cpp : source file that includes just the standard includes
//  Sceleton.pch will be the pre-compiled header
//  stdafx.obj will contain the pre-compiled type information
 
#include "stdafx.h"
 
extern HINSTANCE hInst;
 
 
LRESULT CALLBACK WFunc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND hBut[16];
    static int mas[16];
    PAINTSTRUCT ps;
    HDC hdc; 
    static int sx,sy;
    int i,j,numb;
    switch (message)
    {
    
    case WM_DESTROY:
                    PostQuitMessage(0); //корректная обработка окончания сообщения
                    break;
 
    case WM_CREATE:
        srand(time(0));
 
        for( i=0;i<16;i++)
            hBut[i]=CreateWindow("BUTTON","",WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON,0,0,0,0,hwnd,0,hInst,0);
            
        for( i=0;i<16;i++)
            {
xyz: mas[i]=rand()%16;
                for(j=0;j<i;j++)
                    if(mas[i]==mas[j]&&i!=j)
                        goto xyz;
            }
        ShowMas(hBut,mas);
 
        break;
 
    case WM_SIZE:
        sx=LOWORD(lParam)/4;
        sy=HIWORD(lParam)/4;
        break;
 
    case WM_COMMAND:
        
        for(i=0;i<16;i++)
 
            if(HWND(lParam)==hBut[i])
            {
                if(mas[i-4]==0)         
                    {
                        GetWindowText(hBut[i],str,256);
                        SetWindowText(hBut[i-4],str);
                        SetWindowText(hBut[i],"");
                        
                    }   
                if(mas[i-1]==0)         
                    {
                        GetWindowText(hBut[i],str,256);
                        SetWindowText(hBut[i-1],str);
                        SetWindowText(hBut[i],"");
                        
                    }   
                if(mas[i+1]==0)         
                    {
                        GetWindowText(hBut[i],str,256);
                        SetWindowText(hBut[i+1],str);
                        SetWindowText(hBut[i],"");
                        
                    }   
                if(mas[i+4]==0)         
                    {
                        GetWindowText(hBut[i],str,256);
                        SetWindowText(hBut[i+4],str);
                        SetWindowText(hBut[i],"");
                        
                    }   
                                
            }
        break;
 
 
 
    case WM_PAINT:
        
        hdc=BeginPaint(hwnd,&ps);
        for(int i=0;i<16;i++)
        MoveWindow(hBut[i],(i%4)*sx,(i/4)*sy,sx,sy,1);
        EndPaint(hwnd,&ps);
        break;
 
 
    default:
        return
            DefWindowProc(hwnd,message,wParam,lParam);//возврат неотработанного сообщения
    }
    return 0L;
}
 
void ShowMas(HWND h[],int m[])
{
    char s[256]="";
    for(int i=0;i<16;i++)
        if(m[i]!=0)
            {
                sprintf(s,"%d",m[i]);
                SetWindowText(h[i],s);
            }
        else
            SetWindowText(h[i],"");
}
Добавлено через 1 минуту
Если не ошибаюсь, то проблемка может быть, начиная с строки 141...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2015, 23:23
Ответы с готовыми решениями:

Пятнашки
Подскажите в чем ошибка ,делаю пятнашки ,и когда нажимаю к примеру на кнопку с...

WinApi Пятнашки ошибка
Помогите разобраться с ошибкой.16 кнопок на вывод и вывод цифр на каждую из...

Пятнашки - алгоритм работы автосборки
Доброго времени суток! Думаю тема весьма заезженная, но не смог найти хоть...

Пятнашки не работают. Вывод с cout
Ребят помогите разобрать. Написал. вроде работало. Препод поросил переделать...

Давайте разберём , как эти пятнашки работают?
Давайте разберём , как эти пятнашки работают? ...

1
marat_miaki
149 / 138 / 87
Регистрация: 08.04.2013
Сообщений: 557
05.05.2015, 06:17 #2
Надо еще вылет за поле на верху исправить
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
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
#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_
 
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
 
#define WIN32_LEAN_AND_MEAN     // Exclude rarely-used stuff from Windows headers
 
#include <windows.h>
#include <string.h>
#include <stdio.h>
 
#include <stdlib.h>
 
  
LRESULT CALLBACK WFunc (HWND,UINT,WPARAM,LPARAM);
 
void ShowMas(HWND[],int[]);
TCHAR str[256] = L"";
 
#include <time.h>   
 
#endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
 
 
extern HINSTANCE hInst;
  
//#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
 
 
TCHAR name[]=L"Qwerty";//Необходимо для регистрации окна
 
HINSTANCE hInst;
int APIENTRY WinMain(HINSTANCE hInstance,//хендлер приложения
                     HINSTANCE ,
                     LPSTR     lpCmdLine,//командная строка
                     int       nCmdShow)//вид окна
{
    
    hInst = hInstance;
    // 1.Создание внешнего вида ОКНА
    WNDCLASS win;//объект для информации об окне
    win.style=CS_HREDRAW|CS_VREDRAW;//Стили перерисовки
    win.lpfnWndProc=WFunc;//Имя оконной функции
    win.cbClsExtra=win.cbWndExtra=0;
    win.hInstance=hInstance;//имя приложения, к которому привязано окно
    win.hIcon=LoadIcon(NULL,IDI_ASTERISK);//иконка, идентификатор иконки ID_APPLIKATION
    win.hCursor=LoadCursor(NULL,IDC_ARROW); //курсор
    win.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//Цвет фона
    win.lpszMenuName=NULL;//меню отсутствует
    win.lpszClassName=name;//Имя для регистрации
 
    //2.Регистрация окна в Операционной системе
    if (!RegisterClass(&win))
    {
        MessageBox(NULL,L"Окно не зарегистрировано",L"Ошибка",MB_OK);
        return -1;//если окно не зарегистрировано
    }
 
    //3.Создание ОКНА
    HWND hwnd; //Объявление хендлера Окна
    hwnd=CreateWindow(name,L"Первое окно",WS_OVERLAPPEDWINDOW/*|WS_VISIBLE*/,50,50,
                      500,500,HWND_DESKTOP,NULL,hInstance,NULL);//Создание хендлера Окна
 
    
 
    //4*.Отображение окна
 
    ShowWindow(hwnd,nCmdShow); //nCmdShow - для показа  окна
    UpdateWindow (hwnd); //обновить сразу окно - перерисовка
 
    //5.создание насоса сообщений
    MSG msg; //описание переменной Сообщения
    while (GetMessage(&msg,0,0,0))
    {
        TranslateMessage(&msg);  //разрешает использовать клавиатуру
        DispatchMessage(&msg); //отправка обработанного сообщения в ОС
    }
    
    return msg.wParam; //корректное закрытие основной программы
}
 
 
 
LRESULT CALLBACK WFunc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND hBut[16];
    static int mas[16];
    PAINTSTRUCT ps;
    HDC hdc; 
    static int sx,sy;
    int i,j;
    time_t t;
 
    switch (message)
    {
    
    case WM_DESTROY:
                    PostQuitMessage(0); //корректная обработка окончания сообщения
                    break;
 
    case WM_CREATE:
        srand((unsigned)time(&t));
 
        for( i=0;i<16;i++)
            hBut[i]=CreateWindow(L"BUTTON",L"",WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON,0,0,0,0,hwnd,0,hInst,0);
            
        for( i=0;i<16;i++)
            {
            xyz: mas[i]=rand()%16;
                for(j=0;j<i;j++)
                    if(mas[i]==mas[j]&&i!=j)
                        goto xyz;
            }
        ShowMas(hBut,mas);
 
        break;
 
    case WM_SIZE:
        sx=LOWORD(lParam)/4;
        sy=HIWORD(lParam)/4;
        break;
 
    case WM_COMMAND:
        
        for(i=0;i<16;i++)
 
            if(HWND(lParam)==hBut[i])
            {
                if(mas[i-4]==0)         
                    {
                        GetWindowText(hBut[i],str,256);
                        SetWindowText(hBut[i-4],str);
                        SetWindowText(hBut[i],L"");
                       mas[i]=0; 
                wchar_t* end_ptr;
                       mas[i-4]=wcstol(str, &end_ptr, 10);
                     } 
                
                if(mas[i-1]==0)         
                    {
                        GetWindowText(hBut[i],str,256);
                        SetWindowText(hBut[i-1],str);
                        SetWindowText(hBut[i],L"");
                       mas[i]=0; 
                wchar_t* end_ptr;
                       mas[i-1]=wcstol(str, &end_ptr, 10);
 
                    }   
                if(mas[i+1]==0)         
                    {
                        GetWindowText(hBut[i],str,256);
                        SetWindowText(hBut[i+1],str);
                        SetWindowText(hBut[i],L"");
                        mas[i]=0;
                                    wchar_t* end_ptr;
                       mas[i+1]=wcstol(str, &end_ptr, 10);
 
                    }   
                if(mas[i+4]==0)         
                    {
                        GetWindowText(hBut[i],str,256);
                        SetWindowText(hBut[i+4],str);
                        SetWindowText(hBut[i],L"");
                        mas[i]=0;
                wchar_t* end_ptr;
                       mas[i+4]=wcstol(str, &end_ptr, 10);
 
                    }   
                              
            }
        break;
 
 
 
    case WM_PAINT:
        
        hdc=BeginPaint(hwnd,&ps);
        for(int i=0;i<16;i++)
        MoveWindow(hBut[i],(i%4)*sx,(i/4)*sy,sx,sy,1);
        EndPaint(hwnd,&ps);
        break;
 
 
    default:
        return
            DefWindowProc(hwnd,message,wParam,lParam);//возврат неотработанного сообщения
    }
    return 0L;
}
 
void ShowMas(HWND h[],int m[])
{
    TCHAR s[256]=L"";
    for(int i=0;i<16;i++)
        if(m[i]!=0)
            {
                swprintf(s,L"%d",m[i]);
                SetWindowText(h[i],s);
            }
        else
            SetWindowText(h[i],L"");
}
Добавлено через 29 минут
подправил и вроде работает
C++
1
2
 133 if(mas[i-4]==0 && i>3) 
  143 if(mas[i-1]==0&& i!=0)
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.05.2015, 06:17

Не работают почти все игры
Всем привет! На ноутбуке переставил винду на 7 x32. Все драйвера поставил....

Не работают почти две клавиши на ноуте
Смотрите люди, на ноут ничего не проливал, но не работают две клавиши, то есть,...

Не включается компьютер, но кулеры работают (почти)
Добрый вечер. Товарищи, помогите. Не включается компьютер. Ситуация такая:...


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

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

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