Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
rura
0 / 0 / 0
Регистрация: 08.01.2014
Сообщений: 153
#1

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

03.05.2015, 23:23. Просмотров 1012. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Пятнашки почти работают правильно (C++ WinAPI):

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

WinApi Пятнашки ошибка - C++ WinAPI
Помогите разобраться с ошибкой.16 кнопок на вывод и вывод цифр на каждую из 16ти по массиву. // stdafx.h : include file for...

Пятнашки - алгоритм работы автосборки - C++ WinAPI
Доброго времени суток! Думаю тема весьма заезженная, но не смог найти хоть какого-либо намёка на алгоритм &quot;автосборки&quot; пятнашек. Своих...

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

Не работают почти все игры - Windows 7
Всем привет! На ноутбуке переставил винду на 7 x32. Все драйвера поставил. Месяца полтора работал, все хорошо было. В кс 1.6 играл немного,...

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

1
marat_miaki
148 / 137 / 50
Регистрация: 08.04.2013
Сообщений: 549
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
Привет! Вот еще темы с ответами:

Не работают почти все клавиши беспроводной клавиатуры - Клавиатуры
В беспроводной клавиатуре сели батарейки. Купил новые, вставил, подключаю к ноуту - не работает. После (может совпадение) начались чудеса -...

Toshiba satellite 4хлетний почти не включается, некоторые кнопки не работают - Ремонт ноутбуков
Никогда траблов с ноутом не было. Внезапно перестал включаться: включение экрана, BIOS не успевает загрузится, виснет на первых строках и...

Игра "Пятнашки", не работают кнопки - JavaScript
Доброй ночи, уважаемые программисты! Я делаю игру &quot;Пятнашки&quot; на Javascript, нужно чтоб код клавиш (вверх,вниз,вправо,влево) работали. Я...

Как правильно сделать два почти идентичных ajax запроса без копирования дополнительного кода? - jQuery
У меня есть два запроса ajax. Один выполняется при загрузке страницы и выдает данные, например за последний месяц, второй запрос...


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

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

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