Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
2 / 2 / 3
Регистрация: 05.10.2014
Сообщений: 209
1

Как создать такое же окно с фишками? Игра "Пятнашки"

07.05.2015, 20:11. Показов 1943. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
 
#define SIZE  4
#define NUMBS SIZE*SIZE
#define UP    0
#define DOWN  1
#define LEFT  2
#define RIGHT 3
 
int board[SIZE][SIZE];
 
void FillBoard   ( void );
int  HaveSolution( void );
int  EndOfGame   ( void );
void PrintBoard  ( void );    
void Move        ( int  );
 
 
int main( void )
{
    HANDLE cInput = GetStdHandle(STD_INPUT_HANDLE);
    DWORD dr;
    INPUT_RECORD  rec;
    //init
    system("title 15 P U ZZ L E");
    FillBoard();
    PrintBoard();
    //
    while( !EndOfGame() )
    {
        
        //Sleep(50);
        ReadConsoleInput(cInput, &rec, sizeof(INPUT_RECORD), &dr);
        FlushConsoleInputBuffer(cInput);
        if(rec.EventType == KEY_EVENT && rec.Event.KeyEvent.bKeyDown)
        {
            switch(rec.Event.KeyEvent.wVirtualKeyCode) 
            {
            case VK_LEFT:
                Move(LEFT);
                break;
            case VK_RIGHT:
                Move(RIGHT);
                break;
            case VK_UP:
                Move(UP);
                break;
            case VK_DOWN:
                Move(DOWN);
                break;
            }
            PrintBoard();
        }
    }
    return 0;
}
 
void FillBoard( void )
{
    do
    {
        srand( time( NULL ));
        int numbers[NUMBS] = {0};
        int i;
        int nextNum;
        for(i = 0; i < NUMBS-1; i++)
            while(1)
            {
                nextNum = rand()%(NUMBS-1)+1;
                if(numbers[nextNum] == 0)
                {
                    numbers[nextNum] = 1;
                    board[ i/SIZE ][ i%SIZE ] = nextNum;
                    break;
                }
            }
    } while( !HaveSolution() );
}
 
int HaveSolution( void )
{
    int i, j;
    int inv = 0;
    for(i = 0; i < NUMBS; i++)
    {
        if(board[ i/SIZE ][ i%SIZE ] == 0)
            inv += i+1;
        for(j = 0; j < i; j++)
            if(board[ j/SIZE ][ j%SIZE ] > board[ i/SIZE ][ i%SIZE ])
                inv++;
    }
    return (inv%2 ? 0 : 1);
}
 
int EndOfGame( void )
{
    int i;
    for(i = 0; i < NUMBS-1; i++)
        if(board[ i/SIZE ][ i%SIZE ] != i+1)
            return 0;
    return 1;
}
 
void PrintBoard( void )
{
    system("cls");
    system("color 0F");
    HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);//Äåñêðèïòîð óñòðîéñòâà ñòàíäàðòíîãî âûâîäà. Âíà÷àëå, ýòî - äåñêðèïòîð àêòèâíîãî ýêðàííîãî áóôåðà êîíñîëè
    COORD cPos;
    unsigned char BL = 219;
    SetConsoleTextAttribute(hCon, BACKGROUND_RED | BACKGROUND_RED | BACKGROUND_INTENSITY);//ÖÂÅÒ ÂÅÐÕÍÅÉ ÏÎËÎÑÊÈ
    printf("PYATNASHKI 15");
    SetConsoleTextAttribute(hCon, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_RED| BACKGROUND_BLUE);//ÖÈÔÐÛ È ÖÂÅÒ ÎÁÎËÎ×ÊÈ
    int i, j;
    for(i = 0; i < SIZE; i++)
    {
        for(j = 0; j < SIZE; j++)
        {
            cPos.X = j*3;
            cPos.Y = i*2+1;
            //maybe at five or maybe at six
 
            SetConsoleCursorPosition(hCon, cPos);//Óñòàíàâëèâàåò ïîçèöèþ êóðñîðà â çàäàííîì ýêðàííîì áóôåðå êîíñîëè.
            printf("%c%c%c%c", BL, BL, BL, BL);
            cPos.Y = i*2+2;
            cPos.X = j*3;
            SetConsoleCursorPosition(hCon, cPos);
            if(board[i][j])
                printf("%c%2i%c", BL, board[i][j], BL);
            else
                printf("%c  %c", BL, BL);
            cPos.Y = i*2+3;
            cPos.X = j*3;
            SetConsoleCursorPosition(hCon, cPos);
            printf("%c%c%c%c", BL, BL, BL, BL);
        }
    }
    SetConsoleTextAttribute(hCon, BACKGROUND_RED| BACKGROUND_RED| BACKGROUND_INTENSITY);
    printf("\nD  A  S  H  A\n");
}
 
void Move( int direction )
{
    int dy[] = {1,-1, 0, 0};
    int dx[] = {0, 0, 1,-1};
    int i, j;
    for(i = 0; i < SIZE; i++)
        for(j = 0; j < SIZE; j++)
            if(board[i][j] == 0)
            {
                int newy = i + dy[direction];
                int newx = j + dx[direction];
                if( newy >= 0 && newy < SIZE &&
                    newx >= 0 && newx < SIZE)
                    {
                        board[i][j] = board[newy][newx];
                        board[newy][newx] = 0;
                    }
                return;
            }
}
выше представлен код игры в пятнашки.Вопрос такой:как создать такое же окно для игры рядом,т.е. чтобы при запуске былезало 2 ОДИНАКОВЫХ окна,т.е. чтобы расположение фишек было в них одинаковым,но управление вторым окном осуществлялось не с помощью стрелочек,а с помощью клавиш a,w,d,s.Нужно это для дальнейшего написания игры в двух режимах:игрок-игрок и игрок-компьютер.Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.05.2015, 20:11
Ответы с готовыми решениями:

Игра пятнашки, или Как создать структуру хранения "Дерево"?
Для реализации алгоритма игры пятнашки необходима структура Дерево, которая бы хранила матрицы...

Как создать Такое окно?
Я не знаю как сюда скрины вставлять, надеюсь поймете без скринов. вот возьмем обычный блокнот ну...

Игра с фишками
Добрые люди у кого есть похожая задача в Delphi на эту тематику помогите с кодом!Очень нужно! ...

Игра с фишками
Как решить задачу: На квадратном поле размером NхN с помощью датчика случайных чисел расставлены M...

11
2 / 2 / 3
Регистрация: 05.10.2014
Сообщений: 209
13.05.2015, 02:53  [ТС] 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
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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
 
#define SIZE  4
#define NUMBS SIZE*SIZE
#define UP    0
#define DOWN  1
#define LEFT  2
#define RIGHT 3
 
int board[SIZE][SIZE];
 
void FillBoard   ( void );
int  HaveSolution( void );
int  EndOfGame   ( void );
void PrintBoard  ( void );    
void Move        ( int  );
 void PrintBoard2  ( void );  
 void FillBoard2  ( void );
int  HaveSolution2( void );
int main( void )
{
    HANDLE cInput = GetStdHandle(STD_INPUT_HANDLE);
    DWORD dr;
    INPUT_RECORD  rec;
    //init
    system("title 15 P U ZZ L E");
    FillBoard();
    PrintBoard();
    //
    while( !EndOfGame() )
    {
        
        //Sleep(50);
        ReadConsoleInput(cInput, &rec, sizeof(INPUT_RECORD), &dr);
        FlushConsoleInputBuffer(cInput);
        if(rec.EventType == KEY_EVENT && rec.Event.KeyEvent.bKeyDown)
        {
            switch(rec.Event.KeyEvent.wVirtualKeyCode) 
            {
            case VK_LEFT:
                Move(LEFT);
                break;
            case VK_RIGHT:
                Move(RIGHT);
                break;
            case VK_UP:
                Move(UP);
                break;
            case VK_DOWN:
                Move(DOWN);
                break;
            }
            PrintBoard();
        }
        
    }
//   HANDLE cInput = GetStdHandle(STD_INPUT_HANDLE);
   // DWORD dr;
   // INPUT_RECORD  rec;
    //init
    system("title 15 P U ZZ L E");
    FillBoard2();
    PrintBoard2();
    //
    while( !EndOfGame() )
    {
        
        //Sleep(50);
        ReadConsoleInput(cInput, &rec, sizeof(INPUT_RECORD), &dr);
        FlushConsoleInputBuffer(cInput);
        if(rec.EventType == KEY_EVENT && rec.Event.KeyEvent.bKeyDown)
        {
            switch(rec.Event.KeyEvent.wVirtualKeyCode) 
            {
            case VK_LEFT:
                Move(LEFT);
                break;
            case VK_RIGHT:
                Move(RIGHT);
                break;
            case VK_UP:
                Move(UP);
                break;
            case VK_DOWN:
                Move(DOWN);
                break;
            }
            PrintBoard2();
        }
        
    }
    return 0;
}
 
void FillBoard( void )
{
    do
    {
        srand( time( NULL ));
        int numbers[NUMBS] = {0};
        int i;
        int nextNum;
        for(i = 0; i < NUMBS-1; i++)
            while(1)
            {
                nextNum = rand()%(NUMBS-1)+1;
                if(numbers[nextNum] == 0)
                {
                    numbers[nextNum] = 1;
                    board[ i/SIZE ][ i%SIZE ] = nextNum;
                    break;
                }
            }
    } while( HaveSolution() );
}
 void FillBoard2( void )
{
    do
    {
        srand( time( NULL ));
        int numbers[NUMBS] = {0};
        int i;
        int nextNum;
        for(i = 0; i < NUMBS-1; i++)
            while(1)
            {
                nextNum = rand()%(NUMBS-1)+1;
                if(numbers[nextNum] == 0)
                {
                    numbers[nextNum] = 1;
                    board[ i/SIZE ][ i%SIZE ] = nextNum;
                    break;
                }
            }
    } while( HaveSolution2() );
}
int HaveSolution( void )
{
    int i, j;
    int inv = 0;
    for(i = 0; i < NUMBS; i++)
    {
        if(board[ i/SIZE ][ i%SIZE ] == 0)
            inv += i+1;
        for(j = 0; j < i; j++)
            if(board[ j/SIZE ][ j%SIZE ] > board[ i/SIZE ][ i%SIZE ])
                inv++;
    }
    return (inv%2 ? 0 : 1);
}
 int HaveSolution2( void )
{
    int i, j;
    int inv = 0;
    for(i = 0; i < NUMBS; i++)
    {
        if(board[ i/SIZE ][ i%SIZE ] == 0)
            inv += i+1;
        for(j = 0; j < i; j++)
            if(board[ j/SIZE ][ j%SIZE ] > board[ i/SIZE ][ i%SIZE ])
                inv++;
    }
    return (inv%2 ? 0 : 1);
}
 
int EndOfGame( void )
{
    int i;
    for(i = 0; i < NUMBS-1; i++)
        if(board[ i/SIZE ][ i%SIZE ] != i+1)
            return 0;
    return 1;
}
 void PrintBoard2( void )
{
    system("cls");
    system("color 0F");
    HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);//Äåñêðèïòîð óñòðîéñòâà ñòàíäàðòíîãî âûâîäà. Âíà÷àëå, ýòî - äåñêðèïòîð àêòèâíîãî ýêðàííîãî áóôåðà êîíñîëè
    COORD cPos;
    unsigned char BL = 219;
    SetConsoleTextAttribute(hCon, BACKGROUND_RED | BACKGROUND_RED | BACKGROUND_INTENSITY);//ÖÂÅÒ ÂÅÐÕÍÅÉ ÏÎËÎÑÊÈ
    printf("PYATNASHKI 15");
    SetConsoleTextAttribute(hCon, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_RED| BACKGROUND_BLUE);//ÖÈÔÐÛ È ÖÂÅÒ ÎÁÎËÎ×ÊÈ
    int i, j;
    for(i = 4; i < SIZE+4; i++)
    {
        for(j = 4; j < SIZE+4; j++)
        {
            cPos.X = j*3;
            cPos.Y = i*2+1;
            //maybe at five or maybe at six
 
            SetConsoleCursorPosition(hCon, cPos);//Óñòàíàâëèâàåò ïîçèöèþ êóðñîðà â çàäàííîì ýêðàííîì áóôåðå êîíñîëè.
            printf("%c%c%c%c", BL, BL, BL, BL);
            cPos.Y = i*2+2;
            cPos.X = j*3;
            SetConsoleCursorPosition(hCon, cPos);
            if(board[i][j])
                printf("%c%2i%c", BL, board[i][j], BL);
            else
                printf("%c  %c", BL, BL);
            cPos.Y = i*2+3;
            cPos.X = j*3;
            SetConsoleCursorPosition(hCon, cPos);
            printf("%c%c%c%c", BL, BL, BL, BL);
        }
    }
    SetConsoleTextAttribute(hCon, BACKGROUND_RED| BACKGROUND_RED| BACKGROUND_INTENSITY);
    printf("\nD  A  S  H  A\n");
}
void PrintBoard( void )
{
    system("cls");
    system("color 0F");
    HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);//Äåñêðèïòîð óñòðîéñòâà ñòàíäàðòíîãî âûâîäà. Âíà÷àëå, ýòî - äåñêðèïòîð àêòèâíîãî ýêðàííîãî áóôåðà êîíñîëè
    COORD cPos;
    unsigned char BL = 219;
    SetConsoleTextAttribute(hCon, BACKGROUND_RED | BACKGROUND_RED | BACKGROUND_INTENSITY);//ÖÂÅÒ ÂÅÐÕÍÅÉ ÏÎËÎÑÊÈ
    printf("PYATNASHKI 15");
    SetConsoleTextAttribute(hCon, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_RED| BACKGROUND_BLUE);//ÖÈÔÐÛ È ÖÂÅÒ ÎÁÎËÎ×ÊÈ
    int i, j;
    for(i = 0; i < SIZE; i++)
    {
        for(j = 0; j < SIZE; j++)
        {
            cPos.X = j*3;
            cPos.Y = i*2+1;
            //maybe at five or maybe at six
 
            SetConsoleCursorPosition(hCon, cPos);//Óñòàíàâëèâàåò ïîçèöèþ êóðñîðà â çàäàííîì ýêðàííîì áóôåðå êîíñîëè.
            printf("%c%c%c%c", BL, BL, BL, BL);
            cPos.Y = i*2+2;
            cPos.X = j*3;
            SetConsoleCursorPosition(hCon, cPos);
            if(board[i][j])
                printf("%c%2i%c", BL, board[i][j], BL);
            else
                printf("%c  %c", BL, BL);
            cPos.Y = i*2+3;
            cPos.X = j*3;
            SetConsoleCursorPosition(hCon, cPos);
            printf("%c%c%c%c", BL, BL, BL, BL);
        }
    }
    SetConsoleTextAttribute(hCon, BACKGROUND_RED| BACKGROUND_RED| BACKGROUND_INTENSITY);
    printf("\nD  A  S  H  A\n");
}
 
void Move( int direction )
{
    int dy[] = {1,-1, 0, 0};
    int dx[] = {0, 0, 1,-1};
    int i, j;
    for(i = 0; i < SIZE; i++)
        for(j = 0; j < SIZE; j++)
            if(board[i][j] == 0)
            {
почему ,если создать такую же функцию для создания и такую же для заполнения,но при этом изменяя координаты cPos.X и cPos.Y,то поле еще одно не рисуется ?в чем проблема?не знает никто?
0
516 / 408 / 188
Регистрация: 08.04.2013
Сообщений: 1,743
13.05.2015, 07:01 3
Пятнашки почти работают правильно
можно доработать и не париться с консолью и не портить зрение
0
2 / 2 / 3
Регистрация: 05.10.2014
Сообщений: 209
14.05.2015, 22:50  [ТС] 4
marat_miaki, все таки может с консолью поможете?как подключить управление другим полем с помощью других клавиш?

Добавлено через 29 минут
marat_miaki,
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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
 
#define SIZE  4
#define NUMBS SIZE*SIZE
#define UP    0
#define DOWN  1
#define LEFT  2
#define RIGHT 3
 
int board[SIZE][SIZE];
 
void FillBoard   ( void );
int  HaveSolution( void );
int  EndOfGame   ( void );
void PrintBoard  ( void );    
void Move        ( int  );
 
 
int main( void )
{
    HANDLE cInput = GetStdHandle(STD_INPUT_HANDLE);
    DWORD dr;
    INPUT_RECORD  rec;
    //init
    system("title 15 P U ZZ L E");
    FillBoard();
    PrintBoard();
    //
    while( !EndOfGame() )
    {
        
        //Sleep(50);
        ReadConsoleInput(cInput, &rec, sizeof(INPUT_RECORD), &dr);
        FlushConsoleInputBuffer(cInput);
        if(rec.EventType == KEY_EVENT && rec.Event.KeyEvent.bKeyDown)
        {
            switch(rec.Event.KeyEvent.wVirtualKeyCode) 
            {
            case VK_LEFT:
                Move(LEFT);
                break;
            case VK_RIGHT:
                Move(RIGHT);
                break;
            case VK_UP:
                Move(UP);
                break;
            case VK_DOWN:
                Move(DOWN);
                break;
            }
            PrintBoard();
        }
        
    }
    return 0;
}
 
void FillBoard( void )
{
    do
    {
        srand( time( NULL ));
        int numbers[NUMBS] = {0};
        int i;
        int nextNum;
        for(i = 0; i < NUMBS-1; i++)
            while(1)
            {
                nextNum = rand()%(NUMBS-1)+1;
                if(numbers[nextNum] == 0)
                {
                    numbers[nextNum] = 1;
                    board[ i/SIZE ][ i%SIZE ] = nextNum;
                    break;
                }
            }
    } while( !HaveSolution() );
}
 
int HaveSolution( void )
{
    int i, j;
    int inv = 0;
    for(i = 0; i < NUMBS; i++)
    {
        if(board[ i/SIZE ][ i%SIZE ] == 0)
            inv += i+1;
        for(j = 0; j < i; j++)
            if(board[ j/SIZE ][ j%SIZE ] > board[ i/SIZE ][ i%SIZE ])
                inv++;
    }
    return (inv%2 ? 0 : 1);
}
 
int EndOfGame( void )
{
    int i;
    for(i = 0; i < NUMBS-1; i++)
        if(board[ i/SIZE ][ i%SIZE ] != i+1)
            return 0;
    return 1;
}
 
void PrintBoard( void )
{
    system("cls");
    system("color 0F");
    HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);//Äåñêðèïòîð óñòðîéñòâà ñòàíäàðòíîãî âûâîäà. Âíà÷àëå, ýòî - äåñêðèïòîð àêòèâíîãî ýêðàííîãî áóôåðà êîíñîëè
    COORD cPos,c2Pos;
    unsigned char BL = 219;
    SetConsoleTextAttribute(hCon, BACKGROUND_RED | BACKGROUND_RED | BACKGROUND_INTENSITY);//ÖÂÅÒ ÂÅÐÕÍÅÉ ÏÎËÎÑÊÈ
    printf("PYATNASHKI 15");printf("PYATNASHKI 15");
    SetConsoleTextAttribute(hCon, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_RED| BACKGROUND_BLUE);//ÖÈÔÐÛ È ÖÂÅÒ ÎÁÎËÎ×ÊÈ
    int i, j;
    for(i = 0; i < SIZE; i++)
    {
        for(j = 0; j < SIZE; j++)
        {
            cPos.X = j*3;
            cPos.Y = i*2+1;
            c2Pos.X=cPos.X+13;
            c2Pos.Y=cPos.Y+1;
            //maybe at five or maybe at six
 
            SetConsoleCursorPosition(hCon, cPos);//Óñòàíàâëèâàåò ïîçèöèþ êóðñîðà â çàäàííîì ýêðàííîì áóôåðå êîíñîëè.
            printf("%c%c%c%c", BL, BL, BL, BL);printf("%c%c%c%c", BL, BL, BL, BL);printf("%c%c%c%c", BL, BL, BL, BL);printf("%c%c%c%c%c", BL, BL, BL, BL, BL);
            cPos.Y = i*2+2;
            cPos.X = j*3;
            SetConsoleCursorPosition(hCon, cPos);
            if(board[i][j])
                {printf("%c%2i%c", BL, board[i][j], BL);SetConsoleCursorPosition(hCon, c2Pos);printf("%c%2i%c", BL, board[i][j], BL);}
            else
                {printf("%c  %c", BL, BL);SetConsoleCursorPosition(hCon, c2Pos);printf("%c  %c", BL, BL);}
            cPos.Y = i*2+3;
            cPos.X = j*3;
            SetConsoleCursorPosition(hCon, cPos);
            printf("%c%c%c%c", BL, BL, BL, BL);printf("%c%c%c%c", BL, BL, BL, BL);printf("%c%c%c%c", BL, BL, BL, BL);printf("%c%c%c%c%c", BL, BL, BL, BL, BL);
        }
    }
    SetConsoleTextAttribute(hCon, BACKGROUND_RED| BACKGROUND_RED| BACKGROUND_INTENSITY);
    printf("\nI G R O K   1");printf("I G R O K   2");
}
 
void Move( int direction )
{
    int dy[] = {1,-1, 0, 0};
    int dx[] = {0, 0, 1,-1};
    int i, j;
    for(i = 0; i < SIZE; i++)
        for(j = 0; j < SIZE; j++)
            if(board[i][j] == 0)
            {
                int newy = i + dy[direction];
                int newx = j + dx[direction];
                if( newy >= 0 && newy < SIZE &&
                    newx >= 0 && newx < SIZE)
                    {
                        board[i][j] = board[newy][newx];
                        board[newy][newx] = 0;
                    }
                return;
            }
}
вот сделала два поля,не знаю как подключить другие клавиши для управления вторым окном,чтобы одно управлялось стрелками,а другое любыми другими 4 клавишами

Добавлено через 1 час 39 минут
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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
 
#define SIZE  4
#define NUMBS SIZE*SIZE
#define UP    0
#define DOWN  1
#define LEFT  2
#define RIGHT 3
 #define w   0
#define s 1
#define a 2
#define d 3
int board[SIZE][SIZE];
 
void FillBoard   ( void );
int  HaveSolution( void );
int  EndOfGame   ( void );
void PrintBoard  ( void );    
void Move        ( int  );
 
 
int main( void )
{
    HANDLE cInput = GetStdHandle(STD_INPUT_HANDLE);
    DWORD dr;
    INPUT_RECORD  rec;
    //init
    system("title 15 P U ZZ L E");
    FillBoard();
    PrintBoard();
    //
    while( !EndOfGame() )
    {
        
        //Sleep(50);
        ReadConsoleInput(cInput, &rec, sizeof(INPUT_RECORD), &dr);
        FlushConsoleInputBuffer(cInput);
        if(rec.EventType == KEY_EVENT && rec.Event.KeyEvent.bKeyDown)
        {
            switch(rec.Event.KeyEvent.wVirtualKeyCode) 
            {
            case VK_LEFT:
                Move(LEFT);
                break;
            case VK_RIGHT:
                Move(RIGHT);
                break;
            case VK_UP:
                Move(UP);
                break;
            case VK_DOWN:
                Move(DOWN);
                break;
                
                case VK_NUMPAD4:
                Move(LEFT);
                break;
            case VK_NUMPAD6:
                Move(RIGHT);
                break;
            case VK_NUMPAD8:
                Move(UP);
                break;
            case VK_NUMPAD2:
                Move(DOWN);
                break;
            }
            PrintBoard();
        }
        
    }
    return 0;
}
 
void FillBoard( void )
{
    do
    {
        srand( time( NULL ));
        int numbers[NUMBS] = {0};
        int i;
        int nextNum;
        for(i = 0; i < NUMBS-1; i++)
            while(1)
            {
                nextNum = rand()%(NUMBS-1)+1;
                if(numbers[nextNum] == 0)
                {
                    numbers[nextNum] = 1;
                    board[ i/SIZE ][ i%SIZE ] = nextNum;
                    break;
                }
            }
    } while( !HaveSolution() );
}
 
int HaveSolution( void )
{
    int i, j;
    int inv = 0;
    for(i = 0; i < NUMBS; i++)
    {
        if(board[ i/SIZE ][ i%SIZE ] == 0)
            inv += i+1;
        for(j = 0; j < i; j++)
            if(board[ j/SIZE ][ j%SIZE ] > board[ i/SIZE ][ i%SIZE ])
                inv++;
    }
    return (inv%2 ? 0 : 1);
}
 
int EndOfGame( void )
{
    int i;
    for(i = 0; i < NUMBS-1; i++)
        if(board[ i/SIZE ][ i%SIZE ] != i+1)
            return 0;
    return 1;
}
 
void PrintBoard( void )
{
    system("cls");
    system("color 0F");
    HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);//Äåñêðèïòîð óñòðîéñòâà ñòàíäàðòíîãî âûâîäà. Âíà÷àëå, ýòî - äåñêðèïòîð àêòèâíîãî ýêðàííîãî áóôåðà êîíñîëè
    COORD cPos,c2Pos;
    unsigned char BL = 219;
    SetConsoleTextAttribute(hCon, BACKGROUND_RED | BACKGROUND_RED | BACKGROUND_INTENSITY);//ÖÂÅÒ ÂÅÐÕÍÅÉ ÏÎËÎÑÊÈ
    printf("PYATNASHKI 15");printf("PYATNASHKI 15");
    SetConsoleTextAttribute(hCon, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_RED| BACKGROUND_BLUE);//ÖÈÔÐÛ È ÖÂÅÒ ÎÁÎËÎ×ÊÈ
    int i, j;
    for(i = 0; i < SIZE; i++)
    {
        for(j = 0; j < SIZE; j++)
        {
            cPos.X = j*3;
            cPos.Y = i*2+1;
            c2Pos.X=cPos.X+13;
            c2Pos.Y=cPos.Y+1;
            //maybe at five or maybe at six
 
            SetConsoleCursorPosition(hCon, cPos);//Óñòàíàâëèâàåò ïîçèöèþ êóðñîðà â çàäàííîì ýêðàííîì áóôåðå êîíñîëè.
            printf("%c%c%c%c", BL, BL, BL, BL);printf("%c%c%c%c", BL, BL, BL, BL);printf("%c%c%c%c", BL, BL, BL, BL);printf("%c%c%c%c%c", BL, BL, BL, BL, BL);
            cPos.Y = i*2+2;
            cPos.X = j*3;
            SetConsoleCursorPosition(hCon, cPos);
            if(board[i][j])
                {printf("%c%2i%c", BL, board[i][j], BL);SetConsoleCursorPosition(hCon, c2Pos);printf("%c%2i%c", BL, board[i][j], BL);}
            else
                {printf("%c  %c", BL, BL);SetConsoleCursorPosition(hCon, c2Pos);printf("%c  %c", BL, BL);}
            cPos.Y = i*2+3;
            cPos.X = j*3;
            SetConsoleCursorPosition(hCon, cPos);
            printf("%c%c%c%c", BL, BL, BL, BL);printf("%c%c%c%c", BL, BL, BL, BL);printf("%c%c%c%c", BL, BL, BL, BL);printf("%c%c%c%c%c", BL, BL, BL, BL, BL);
        }
    }
    SetConsoleTextAttribute(hCon, BACKGROUND_RED| BACKGROUND_RED| BACKGROUND_INTENSITY);
    printf("\nI G R O K   1");printf("I G R O K   2");
}
 
void Move( int direction )
{
    int dy[] = {1,-1, 0, 0};
    int dx[] = {0, 0, 1,-1};
    int i, j;
    for(i = 0; i < SIZE; i++)
        for(j = 0; j < SIZE; j++)
            if(board[i][j] == 0)
            {
                int newy = i + dy[direction];
                int newx = j + dx[direction];
                if( newy >= 0 && newy < SIZE &&
                    newx >= 0 && newx < SIZE)
                    {
                        board[i][j] = board[newy][newx];
                        board[newy][newx] = 0;
                    }
                return;
            }
}
подключила еще клавиши 4,6,2,8
но как теперь сделать ,чтобы правое поле изменялось только тогда,когда нажимаешь 6,4,2,8, а левое управлялось стрелками?
помогите пожалуйта
0
2 / 2 / 3
Регистрация: 05.10.2014
Сообщений: 209
15.05.2015, 01:43  [ТС] 5
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
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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
 
#define SIZE  4
#define NUMBS SIZE*SIZE
#define UP    0
#define DOWN  1
#define LEFT  2
#define RIGHT 3
 
int board[SIZE][SIZE];
int board2[SIZE][SIZE];
void FillBoard   ( void );
int  HaveSolution( void );
int  EndOfGame   ( void );
void PrintBoard  ( void );    
void Move        ( int  );
void PrintBoard2  ( void );
 void Move2        ( int  );
int main( void )
{
    HANDLE cInput = GetStdHandle(STD_INPUT_HANDLE);
    DWORD dr;
    INPUT_RECORD  rec;
    //init
  //  system("title 15 P U ZZ L E");
    FillBoard();
    PrintBoard();
    PrintBoard2();
    //
    while( !EndOfGame() )
    {
        
        //Sleep(50);
        ReadConsoleInput(cInput, &rec, sizeof(INPUT_RECORD), &dr);
        FlushConsoleInputBuffer(cInput);
        if(rec.EventType == KEY_EVENT && rec.Event.KeyEvent.bKeyDown)
        {
            switch(rec.Event.KeyEvent.wVirtualKeyCode) 
            {
            case VK_LEFT:
                Move(LEFT);
                break;
            case VK_RIGHT:
                Move(RIGHT);
                break;
            case VK_UP:
                Move(UP);
                break;
            case VK_DOWN:
                Move(DOWN);
                break;
            }
            PrintBoard();
        }
    }
   if(rec.EventType == KEY_EVENT && rec.Event.KeyEvent.bKeyDown)
   
    while( !EndOfGame() )
    {
        
        //Sleep(50);
        ReadConsoleInput(cInput, &rec, sizeof(INPUT_RECORD), &dr);
        FlushConsoleInputBuffer(cInput);
        if(rec.EventType == KEY_EVENT && rec.Event.KeyEvent.bKeyDown)
        {
            switch(rec.Event.KeyEvent.wVirtualKeyCode) 
            {
            case VK_NUMPAD4:
                Move2(LEFT);
                break;
            case VK_NUMPAD6:
                Move2(RIGHT);
                break;
            case VK_NUMPAD8:
                Move2(UP);
                break;
            case VK_NUMPAD2:
                Move2(DOWN);
                break;
            }
            PrintBoard2();
        }
    }
    return 0;
}
 
void FillBoard( void )
{
    do
    {
        srand( time( NULL ));
        int numbers[NUMBS] = {0};
        int i;
        int nextNum;
        for(i = 0; i < NUMBS-1; i++)
            while(1)
            {
                nextNum = rand()%(NUMBS-1)+1;
                if(numbers[nextNum] == 0)
                {
                    numbers[nextNum] = 1;
                    board[ i/SIZE ][ i%SIZE ] = nextNum;
                    break;
                }
            }
    } while( !HaveSolution() );
    for (int i=0;i<SIZE;i++)
    for(int j=0;j<SIZE;j++)
    board2[i][j]=board[i][j];
}
 
int HaveSolution( void )
{
    int i, j;
    int inv = 0;
    for(i = 0; i < NUMBS; i++)
    {
        if(board[ i/SIZE ][ i%SIZE ] == 0)
            inv += i+1;
        for(j = 0; j < i; j++)
            if(board[ j/SIZE ][ j%SIZE ] > board[ i/SIZE ][ i%SIZE ])
                inv++;
    }
    return (inv%2 ? 0 : 1);
}
 
int EndOfGame( void )
{
    int i;
    for(i = 0; i < NUMBS-1; i++)
        if((board[ i/SIZE ][ i%SIZE ] != i+1)||(board2[ i/SIZE ][ i%SIZE ] != i+1))
            return 0;
    return 1;
}
 
void PrintBoard( void )
{
    system("cls");
    system("color 0F");
    HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);//Äåñêðèïòîð óñòðîéñòâÃ* ñòÃ*Ã*äÃ*ðòÃ*îãî âûâîäÃ*. ÂÃ*Ã*÷Ã*ëå, ýòî - äåñêðèïòîð Ã*êòèâÃ*îãî ýêðÃ*Ã*Ã*îãî áóôåðÃ* êîÃ*ñîëè
    COORD cPos;
    unsigned char BL = 219;
     cPos.X = 3;
    cPos.Y = 3;
    SetConsoleCursorPosition(hCon, cPos);
    SetConsoleTextAttribute(hCon, BACKGROUND_RED | BACKGROUND_RED | BACKGROUND_INTENSITY);//ÖÂÅÒ ÂÅÃ&#144;ÕÃ&#141;ÅÉ Ã&#143;ÎËÎÑÊÈ
    printf("PYATNASHKI 15");
   
    SetConsoleTextAttribute(hCon, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_RED| BACKGROUND_BLUE);//ÖÈÔÃ&#144;Û È ÖÂÅÒ ÃŽÃ&#129;ÎËÎ×ÊÈ
    int i, j;
    for(i = 0; i < SIZE; i++)
    {
        for(j = 0; j < SIZE; j++)
        {
            cPos.X = j*3+3;
            cPos.Y = i*2+4;
            //maybe at five or maybe at six
 
            SetConsoleCursorPosition(hCon, cPos);//ÓñòÃ*Ã*Ã*âëèâÃ*åò ïîçèöèþ êóðñîðÃ* â çÃ*äÃ*Ã*Ã*îì ýêðÃ*Ã*Ã*îì áóôåðå êîÃ*ñîëè.
            printf("%c%c%c%c", BL, BL, BL, BL);
            cPos.Y = i*2+5;
            cPos.X = j*3+3;
            SetConsoleCursorPosition(hCon, cPos);
            if(board[i][j])
                printf("%c%2i%c", BL, board[i][j], BL);
            else
                printf("%c  %c", BL, BL);
            cPos.Y = i*2+6;
            cPos.X = j*3+3;
            SetConsoleCursorPosition(hCon, cPos);
            printf("%c%c%c%c", BL, BL, BL, BL);
        }
    }
    SetConsoleTextAttribute(hCon, BACKGROUND_RED| BACKGROUND_RED| BACKGROUND_INTENSITY);
    cPos.X = 3;
    cPos.Y =13;
    SetConsoleCursorPosition(hCon, cPos);
    printf(" I G R O K  1");
}
 
 
 void PrintBoard2( void )
{
    system("cls");
    system("color 0F");
    HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);//Äåñêðèïòîð óñòðîéñòâÃ* ñòÃ*Ã*äÃ*ðòÃ*îãî âûâîäÃ*. ÂÃ*Ã*÷Ã*ëå, ýòî - äåñêðèïòîð Ã*êòèâÃ*îãî ýêðÃ*Ã*Ã*îãî áóôåðÃ* êîÃ*ñîëè
    COORD cPos;
    unsigned char BL = 219;
     cPos.X = 30;
    cPos.Y = 3;
    SetConsoleCursorPosition(hCon, cPos);
    SetConsoleTextAttribute(hCon, BACKGROUND_RED | BACKGROUND_RED | BACKGROUND_INTENSITY);//ÖÂÅÒ ÂÅÃ&#144;ÕÃ&#141;ÅÉ Ã&#143;ÎËÎÑÊÈ
    printf("PYATNASHKI 15");
   
    SetConsoleTextAttribute(hCon, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_RED| BACKGROUND_BLUE);//ÖÈÔÃ&#144;Û È ÖÂÅÒ ÃŽÃ&#129;ÎËÎ×ÊÈ
    int i, j;
    for(i = 0; i < SIZE; i++)
    {
        for(j = 0; j < SIZE; j++)
        {
            cPos.X = j*3+30;
            cPos.Y = i*2+4;
            //maybe at five or maybe at six
 
            SetConsoleCursorPosition(hCon, cPos);//ÓñòÃ*Ã*Ã*âëèâÃ*åò ïîçèöèþ êóðñîðÃ* â çÃ*äÃ*Ã*Ã*îì ýêðÃ*Ã*Ã*îì áóôåðå êîÃ*ñîëè.
            printf("%c%c%c%c", BL, BL, BL, BL);
            cPos.Y = i*2+5;
            cPos.X = j*3+30;
            SetConsoleCursorPosition(hCon, cPos);
            if(board2[i][j])
                printf("%c%2i%c", BL, board2[i][j], BL);
            else
                printf("%c  %c", BL, BL);
            cPos.Y = i*2+6;
            cPos.X = j*3+30;
            SetConsoleCursorPosition(hCon, cPos);
            printf("%c%c%c%c", BL, BL, BL, BL);
        }
    }
    SetConsoleTextAttribute(hCon, BACKGROUND_RED| BACKGROUND_RED| BACKGROUND_INTENSITY);
    cPos.X = 30;
    cPos.Y =13;
    SetConsoleCursorPosition(hCon, cPos);
    printf(" I G R O K  2");
}
 
 
void Move( int direction )
{
    int dy[] = {1,-1, 0, 0};
    int dx[] = {0, 0, 1,-1};
    int i, j;
    for(i = 0; i < SIZE; i++)
        for(j = 0; j < SIZE; j++)
            if(board[i][j] == 0)
            {
                int newy = i + dy[direction];
                int newx = j + dx[direction];
                if( newy >= 0 && newy < SIZE &&
                    newx >= 0 && newx < SIZE)
                    {
                        board[i][j] = board[newy][newx];
                        board[newy][newx] = 0;
                    }
                return;
            }
}
void Move2( int direction )
{
    int dy[] = {1,-1, 0, 0};
    int dx[] = {0, 0, 1,-1};
    int i, j;
    for(i = 0; i < SIZE; i++)
        for(j = 0; j < SIZE; j++)
            if(board2[i][j] == 0)
            {
                int newy = i + dy[direction];
                int newx = j + dx[direction];
                if( newy >= 0 && newy < SIZE &&
                    newx >= 0 && newx < SIZE)
                    {
                        board2[i][j] = board2[newy][newx];
                        board2[newy][newx] = 0;
                    }
                return;
            }
}
итак,сделала два поля board,board2,но теперь не пойму,почему в mainе печатаю два поля Printboard(),Printboard2(),а выскакивает одно,затем,при нажатии любой из стрелок или клавиш 2,4,6,8 перепечатывается только поле1,в чем проблема,помогите пожалуйста
0
516 / 408 / 188
Регистрация: 08.04.2013
Сообщений: 1,743
15.05.2015, 08:11 6
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
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
302
303
304
305
306
307
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
 
#define SIZE  4
#define NUMBS SIZE*SIZE
#define UP    0
#define DOWN  1
#define LEFT  2
#define RIGHT 3
 
int board[SIZE][SIZE];
int board2[SIZE][SIZE];
void FillBoard   ( void );
int  HaveSolution( void );
int  EndOfGame   ( void );
int  EndOfGame2   ( void );
void PrintBoard  ( void );    
void Move        ( int  );
void PrintBoard2  ( void );
 void Move2        ( int  );
int main( void )
{
  system("cls");
  system("color 0F");
    
    HANDLE cInput = GetStdHandle(STD_INPUT_HANDLE);
    DWORD dr;
    INPUT_RECORD  rec;
    //init
  //  system("title 15 P U ZZ L E");
    FillBoard();
    PrintBoard();
    PrintBoard2();
    //
    while( !EndOfGame() )
    {
        
        //Sleep(50);
        ReadConsoleInput(cInput, &rec, sizeof(INPUT_RECORD), &dr);
        FlushConsoleInputBuffer(cInput);
        if(rec.EventType == KEY_EVENT && rec.Event.KeyEvent.bKeyDown)
        {
            switch(rec.Event.KeyEvent.wVirtualKeyCode) 
            {
            case VK_LEFT:
                Move(LEFT);
                PrintBoard();
                break;
            case VK_RIGHT:
                Move(RIGHT);
                PrintBoard();
                break;
            case VK_UP:
                Move(UP);
                PrintBoard();
                break;
            case VK_DOWN:
                Move(DOWN);
                PrintBoard();
                break;
            case VK_NUMPAD4:
                Move2(LEFT);
                PrintBoard2();
                break;
            case VK_NUMPAD6:
                Move2(RIGHT);
                PrintBoard2();
                break;
            case VK_NUMPAD8:
                Move2(UP);
                PrintBoard2();
                break;
            case VK_NUMPAD2:
                Move2(DOWN);
                PrintBoard2();
                break;    
            }
           // PrintBoard();
        }
    }
 //  if(rec.EventType == KEY_EVENT && rec.Event.KeyEvent.bKeyDown)
   
 /*   while( !EndOfGame2() )
    {
        
        //Sleep(50);
        ReadConsoleInput(cInput, &rec, sizeof(INPUT_RECORD), &dr);
        FlushConsoleInputBuffer(cInput);
        if(rec.EventType == KEY_EVENT && rec.Event.KeyEvent.bKeyDown)
        {
            switch(rec.Event.KeyEvent.wVirtualKeyCode) 
            {
            case VK_NUMPAD4:
                Move2(LEFT);
                PrintBoard2();
                break;
            case VK_NUMPAD6:
                Move2(RIGHT);
                PrintBoard2();
                break;
            case VK_NUMPAD8:
                Move2(UP);
                PrintBoard2();
                break;
            case VK_NUMPAD2:
                Move2(DOWN);
                PrintBoard2();
                break;
            }
           // PrintBoard2();
        }
    }
    return 0;
    */
}
 
void FillBoard( void )
{
    do
    {
        srand( time( NULL ));
        int numbers[NUMBS] = {0};
        int i;
        int nextNum;
        for(i = 0; i < NUMBS-1; i++)
            while(1)
            {
                nextNum = rand()%(NUMBS-1)+1;
                if(numbers[nextNum] == 0)
                {
                    numbers[nextNum] = 1;
                    board[ i/SIZE ][ i%SIZE ] = nextNum;
                    break;
                }
            }
    } while( !HaveSolution() );
    for (int i=0;i<SIZE;i++)
    for(int j=0;j<SIZE;j++)
    board2[i][j]=board[i][j];
}
 
int HaveSolution( void )
{
    int i, j;
    int inv = 0;
    for(i = 0; i < NUMBS; i++)
    {
        if(board[ i/SIZE ][ i%SIZE ] == 0)
            inv += i+1;
        for(j = 0; j < i; j++)
            if(board[ j/SIZE ][ j%SIZE ] > board[ i/SIZE ][ i%SIZE ])
                inv++;
    }
    return (inv%2 ? 0 : 1);
}
 
int EndOfGame( void )
{
    int i;
    for(i = 0; i < NUMBS-1; i++)
        if((board[ i/SIZE ][ i%SIZE ] != i+1)||(board2[ i/SIZE ][ i%SIZE ] != i+1))
            return 0;
    return 1;
}
 int EndOfGame2( void )
{
    int j;
    for(j = 0; j < NUMBS-1; j++)
        if((board[ j/SIZE ][ j%SIZE ] != j+1)||(board2[ j/SIZE ][ j%SIZE ] != j+1))
            return 0;
    return 1;
}
 
void PrintBoard( void )
{
  //  system("cls");
   // system("color 0F");
    HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);//Гѓ„ГѓВҐГѓ±ГѓВЄГѓ°ГѓВЁГѓВЇГѓВІГѓ®Гѓ° ГѓВіГѓ±ГѓВІГѓ°Гѓ®Гѓ©Гѓ±ГѓВІГѓВўГѓ* Гѓ±ГѓВІГѓ*Гѓ*Гѓ¤Гѓ*Гѓ°ГѓВІГѓ*Гѓ®ГѓВЈГѓ® ГѓВўГѓ»ГѓВўГѓ®Гѓ¤Гѓ*. Гѓ‚Гѓ*Гѓ*Гѓ·Гѓ*Гѓ«ГѓВҐ, ГѓВЅГѓВІГѓ® - Гѓ¤ГѓВҐГѓ±ГѓВЄГѓ°ГѓВЁГѓВЇГѓВІГѓ®Гѓ° Гѓ*ГѓВЄГѓВІГѓВЁГѓВўГѓ*Гѓ®ГѓВЈГѓ® ГѓВЅГѓВЄГѓ°Гѓ*Гѓ*Гѓ*Гѓ®ГѓВЈГѓ® ГѓВЎГѓВіГѓВґГѓВҐГѓ°Гѓ* ГѓВЄГѓ®Гѓ*Гѓ±Гѓ®Гѓ«ГѓВЁ
    COORD cPos;
    unsigned char BL = 219;
     cPos.X = 3;
    cPos.Y = 3;
    SetConsoleCursorPosition(hCon, cPos);
    SetConsoleTextAttribute(hCon, BACKGROUND_RED | BACKGROUND_RED | BACKGROUND_INTENSITY);//Гѓ–Гѓ‚Гѓ…Гѓ’ Гѓ‚Гѓ…Гѓ&#144;Гѓ•Гѓ&#141;Гѓ…Гѓ‰ Гѓ&#143;ГѓЕЅГѓ‹ГѓЕЅГѓ‘ГѓЕ*ГѓЛ†
    printf("PYATNASHKI 15");
   
    SetConsoleTextAttribute(hCon, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_RED| BACKGROUND_BLUE);//Гѓ–ГѓЛ†Гѓ”Гѓ&#144;Гѓ› ГѓЛ† Гѓ–Гѓ‚Гѓ…Гѓ’ ГѓЕЅГѓ&#129;ГѓЕЅГѓ‹ГѓЕЅГѓ—ГѓЕ*ГѓЛ†
    int i, j;
    for(i = 0; i < SIZE; i++)
    {
        for(j = 0; j < SIZE; j++)
        {
            cPos.X = j*3+3;
            cPos.Y = i*2+4;
            //maybe at five or maybe at six
 
            SetConsoleCursorPosition(hCon, cPos);//Гѓ“Гѓ±ГѓВІГѓ*Гѓ*Гѓ*ГѓВўГѓ«ГѓВЁГѓВўГѓ*ГѓВҐГѓВІ ГѓВЇГѓ®Гѓ§ГѓВЁГѓ¶ГѓВЁГѓВѕ ГѓВЄГѓВіГѓ°Гѓ±Гѓ®Гѓ°Гѓ* ГѓВў Гѓ§Гѓ*Гѓ¤Гѓ*Гѓ*Гѓ*Гѓ®Гѓ¬ ГѓВЅГѓВЄГѓ°Гѓ*Гѓ*Гѓ*Гѓ®Гѓ¬ ГѓВЎГѓВіГѓВґГѓВҐГѓ°ГѓВҐ ГѓВЄГѓ®Гѓ*Гѓ±Гѓ®Гѓ«ГѓВЁ.
            printf("%c%c%c%c", BL, BL, BL, BL);
            cPos.Y = i*2+5;
            cPos.X = j*3+3;
            SetConsoleCursorPosition(hCon, cPos);
            if(board[i][j])
                printf("%c%2i%c", BL, board[i][j], BL);
            else
                printf("%c  %c", BL, BL);
            cPos.Y = i*2+6;
            cPos.X = j*3+3;
            SetConsoleCursorPosition(hCon, cPos);
            printf("%c%c%c%c", BL, BL, BL, BL);
        }
    }
    SetConsoleTextAttribute(hCon, BACKGROUND_RED| BACKGROUND_RED| BACKGROUND_INTENSITY);
    cPos.X = 3;
    cPos.Y =13;
    SetConsoleCursorPosition(hCon, cPos);
    printf(" I G R O K  1");
}
 
 
 void PrintBoard2( void )
{
   // system("cls");
   // system("color 0F");
   HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);//Гѓ„ГѓВҐГѓ±ГѓВЄГѓ°ГѓВЁГѓВЇГѓВІГѓ®Гѓ° ГѓВіГѓ±ГѓВІГѓ°Гѓ®Гѓ©Гѓ±ГѓВІГѓВўГѓ* Гѓ±ГѓВІГѓ*Гѓ*Гѓ¤Гѓ*Гѓ°ГѓВІГѓ*Гѓ®ГѓВЈГѓ® ГѓВўГѓ»ГѓВўГѓ®Гѓ¤Гѓ*. Гѓ‚Гѓ*Гѓ*Гѓ·Гѓ*Гѓ«ГѓВҐ, ГѓВЅГѓВІГѓ® - Гѓ¤ГѓВҐГѓ±ГѓВЄГѓ°ГѓВЁГѓВЇГѓВІГѓ®Гѓ° Гѓ*ГѓВЄГѓВІГѓВЁГѓВўГѓ*Гѓ®ГѓВЈГѓ® ГѓВЅГѓВЄГѓ°Гѓ*Гѓ*Гѓ*Гѓ®ГѓВЈГѓ® ГѓВЎГѓВіГѓВґГѓВҐГѓ°Гѓ* ГѓВЄГѓ®Гѓ*Гѓ±Гѓ®Гѓ«ГѓВЁ
    COORD cPos;
    unsigned char BL = 219;
     cPos.X = 30;
    cPos.Y = 3;
    SetConsoleCursorPosition(hCon, cPos);
    SetConsoleTextAttribute(hCon, BACKGROUND_RED | BACKGROUND_RED | BACKGROUND_INTENSITY);//Гѓ–Гѓ‚Гѓ…Гѓ’ Гѓ‚Гѓ…Гѓ&#144;Гѓ•Гѓ&#141;Гѓ…Гѓ‰ Гѓ&#143;ГѓЕЅГѓ‹ГѓЕЅГѓ‘ГѓЕ*ГѓЛ†
    printf("PYATNASHKI 15");
   
    SetConsoleTextAttribute(hCon, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_RED| BACKGROUND_BLUE);//Гѓ–ГѓЛ†Гѓ”Гѓ&#144;Гѓ› ГѓЛ† Гѓ–Гѓ‚Гѓ…Гѓ’ ГѓЕЅГѓ&#129;ГѓЕЅГѓ‹ГѓЕЅГѓ—ГѓЕ*ГѓЛ†
    int i, j;
    for(i = 0; i < SIZE; i++)
    {
        for(j = 0; j < SIZE; j++)
        {
            cPos.X = j*3+30;
            cPos.Y = i*2+4;
            //maybe at five or maybe at six
 
            SetConsoleCursorPosition(hCon, cPos);//Гѓ“Гѓ±ГѓВІГѓ*Гѓ*Гѓ*ГѓВўГѓ«ГѓВЁГѓВўГѓ*ГѓВҐГѓВІ ГѓВЇГѓ®Гѓ§ГѓВЁГѓ¶ГѓВЁГѓВѕ ГѓВЄГѓВіГѓ°Гѓ±Гѓ®Гѓ°Гѓ* ГѓВў Гѓ§Гѓ*Гѓ¤Гѓ*Гѓ*Гѓ*Гѓ®Гѓ¬ ГѓВЅГѓВЄГѓ°Гѓ*Гѓ*Гѓ*Гѓ®Гѓ¬ ГѓВЎГѓВіГѓВґГѓВҐГѓ°ГѓВҐ ГѓВЄГѓ®Гѓ*Гѓ±Гѓ®Гѓ«ГѓВЁ.
            printf("%c%c%c%c", BL, BL, BL, BL);
            cPos.Y = i*2+5;
            cPos.X = j*3+30;
            SetConsoleCursorPosition(hCon, cPos);
            if(board2[i][j])
                printf("%c%2i%c", BL, board2[i][j], BL);
            else
                printf("%c  %c", BL, BL);
            cPos.Y = i*2+6;
            cPos.X = j*3+30;
            SetConsoleCursorPosition(hCon, cPos);
            printf("%c%c%c%c", BL, BL, BL, BL);
        }
    }
    SetConsoleTextAttribute(hCon, BACKGROUND_RED| BACKGROUND_RED| BACKGROUND_INTENSITY);
    cPos.X = 30;
    cPos.Y =13;
    SetConsoleCursorPosition(hCon, cPos);
    printf(" I G R O K  2");
}
 
 
void Move( int direction )
{
    int dy[] = {1,-1, 0, 0};
    int dx[] = {0, 0, 1,-1};
    int i, j;
    for(i = 0; i < SIZE; i++)
        for(j = 0; j < SIZE; j++)
            if(board[i][j] == 0)
            {
                int newy = i + dy[direction];
                int newx = j + dx[direction];
                if( newy >= 0 && newy < SIZE &&
                    newx >= 0 && newx < SIZE)
                    {
                        board[i][j] = board[newy][newx];
                        board[newy][newx] = 0;
                    }
                return;
            }
}
void Move2( int direction )
{
    int dy[] = {1,-1, 0, 0};
    int dx[] = {0, 0, 1,-1};
    int i, j;
    for(i = 0; i < SIZE; i++)
        for(j = 0; j < SIZE; j++)
            if(board2[i][j] == 0)
            {
                int newy = i + dy[direction];
                int newx = j + dx[direction];
                if( newy >= 0 && newy < SIZE &&
                    newx >= 0 && newx < SIZE)
                    {
                        board2[i][j] = board2[newy][newx];
                        board2[newy][newx] = 0;
                    }
                return;
            }
}
Добавлено через 6 минут
37 надо подправить while( !EndOfGame() || !EndOfGame2());
1
2 / 2 / 3
Регистрация: 05.10.2014
Сообщений: 209
15.05.2015, 12:56  [ТС] 7
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
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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
 
#define SIZE  4
#define NUMBS SIZE*SIZE
#define UP    0
#define DOWN  1
#define LEFT  2
#define RIGHT 3
 
int board[SIZE][SIZE];
int board2[SIZE][SIZE];
void FillBoard   ( void );
int  HaveSolution( void );
int  EndOfGame   ( void );
int  EndOfGame2   ( void );
void PrintBoard  ( void );    
void Move        ( int  );
void PrintBoard2  ( void );
 void Move2        ( int  );
int main( void )
{
  system("cls");
  system("color 0F");
    
    HANDLE cInput = GetStdHandle(STD_INPUT_HANDLE);
    DWORD dr;
    INPUT_RECORD  rec;
    //init
  //  system("title 15 P U ZZ L E");
    FillBoard();
    PrintBoard();
    PrintBoard2();
    //
    while( !EndOfGame() || !EndOfGame2() )
    {
        
        //Sleep(50);
        ReadConsoleInput(cInput, &rec, sizeof(INPUT_RECORD), &dr);
        FlushConsoleInputBuffer(cInput);
        if(rec.EventType == KEY_EVENT && rec.Event.KeyEvent.bKeyDown)
        {
            switch(rec.Event.KeyEvent.wVirtualKeyCode) 
            {
            case VK_LEFT:
                Move(LEFT);
                PrintBoard();
                break;
            case VK_RIGHT:
                Move(RIGHT);
                PrintBoard();
                break;
            case VK_UP:
                Move(UP);
                PrintBoard();
                break;
            case VK_DOWN:
                Move(DOWN);
                PrintBoard();
                break;
            case VK_NUMPAD4:
                Move2(LEFT);
                PrintBoard2();
                break;
            case VK_NUMPAD6:
                Move2(RIGHT);
                PrintBoard2();
                break;
            case VK_NUMPAD8:
                Move2(UP);
                PrintBoard2();
                break;
            case VK_NUMPAD2:
                Move2(DOWN);
                PrintBoard2();
                break;    
            }
        }
    }
}
 
void FillBoard( void )
{
    do
    {
        srand( time( NULL ));
        int numbers[NUMBS] = {0};
        int i;
        int nextNum;
        for(i = 0; i < NUMBS-1; i++)
            while(1)
            {
                nextNum = rand()%(NUMBS-1)+1;
                if(numbers[nextNum] == 0)
                {
                    numbers[nextNum] = 1;
                    board[ i/SIZE ][ i%SIZE ] = nextNum;
                    break;
                }
            }
    } while( !HaveSolution() );
    for (int i=0;i<SIZE;i++)
    for(int j=0;j<SIZE;j++)
    board2[i][j]=board[i][j];
}
 
int HaveSolution( void )
{
    int i, j;
    int inv = 0;
    for(i = 0; i < NUMBS; i++)
    {
        if(board[ i/SIZE ][ i%SIZE ] == 0)
            inv += i+1;
        for(j = 0; j < i; j++)
            if(board[ j/SIZE ][ j%SIZE ] > board[ i/SIZE ][ i%SIZE ])
                inv++;
    }
    return (inv%2 ? 0 : 1);
}
 
int EndOfGame( void )
{
    int i;
    for(i = 0; i < NUMBS-1; i++)
        if(board2[ i/SIZE ][ i%SIZE ] != i+1)
            return 0;
    return 1;
}
 int EndOfGame2( void )
{
    int j;
    for(j = 0; j < NUMBS-1; j++)
        if(board2[ j/SIZE ][ j%SIZE ] != j+1)
            return 0;
    return 1;
}
 
void PrintBoard( void )
{
  //  system("cls");
   // system("color 0F");
    HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);//Äåñêðèïòîð óñòðîéñòâÃ* ñòÃ*Ã*äÃ*ðòÃ*îãî âûâîäÃ*. ÂÃ*Ã*÷Ã*ëÃ¥, ýòî - äåñêðèïòîð Ã*êòèâÃ*îãî ýêðÃ*Ã*Ã*îãî áóôåðÃ* êîÃ*ñîëè
    COORD cPos;
    unsigned char BL = 219;
     cPos.X = 3;
    cPos.Y = 3;
    SetConsoleCursorPosition(hCon, cPos);
    SetConsoleTextAttribute(hCon, BACKGROUND_RED | BACKGROUND_RED | BACKGROUND_INTENSITY);//ÖÂÅÒ ÂÅÃ&#144;ÕÃ&#141;ÅÉ Ã&#143;ÎËÎÑÃÅ*È
    printf("PYATNASHKI 15");
   
    SetConsoleTextAttribute(hCon, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_RED| BACKGROUND_BLUE);//ÖÈÔÃ&#144;Û È Ã–Ã‚Ã…Ã’ ÃŽÃ&#129;ÎËÎ×ÃÅ*È
    int i, j;
    for(i = 0; i < SIZE; i++)
    {
        for(j = 0; j < SIZE; j++)
        {
            cPos.X = j*3+3;
            cPos.Y = i*2+4;
            //maybe at five or maybe at six
 
            SetConsoleCursorPosition(hCon, cPos);//ÓñòÃ*Ã*Ã*âëèâÃ*åò ïîçèöèþ êóðñîðÃ* â çÃ*äÃ*Ã*Ã*îì ýêðÃ*Ã*Ã*îì áóôåðÃ¥ êîÃ*ñîëè.
            printf("%c%c%c%c", BL, BL, BL, BL);
            cPos.Y = i*2+5;
            cPos.X = j*3+3;
            SetConsoleCursorPosition(hCon, cPos);
            if(board[i][j])
                printf("%c%2i%c", BL, board[i][j], BL);
            else
                printf("%c  %c", BL, BL);
            cPos.Y = i*2+6;
            cPos.X = j*3+3;
            SetConsoleCursorPosition(hCon, cPos);
            printf("%c%c%c%c", BL, BL, BL, BL);
        }
    }
    SetConsoleTextAttribute(hCon, BACKGROUND_RED| BACKGROUND_RED| BACKGROUND_INTENSITY);
    cPos.X = 3;
    cPos.Y =13;
    SetConsoleCursorPosition(hCon, cPos);
    printf(" I G R O K  1");
}
 
 
 void PrintBoard2( void )
{
   // system("cls");
   // system("color 0F");
   HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);//Äåñêðèïòîð óñòðîéñòâÃ* ñòÃ*Ã*äÃ*ðòÃ*îãî âûâîäÃ*. ÂÃ*Ã*÷Ã*ëÃ¥, ýòî - äåñêðèïòîð Ã*êòèâÃ*îãî ýêðÃ*Ã*Ã*îãî áóôåðÃ* êîÃ*ñîëè
    COORD cPos;
    unsigned char BL = 219;
     cPos.X = 30;
    cPos.Y = 3;
    SetConsoleCursorPosition(hCon, cPos);
    SetConsoleTextAttribute(hCon, BACKGROUND_RED | BACKGROUND_RED | BACKGROUND_INTENSITY);//ÖÂÅÒ ÂÅÃ&#144;ÕÃ&#141;ÅÉ Ã&#143;ÎËÎÑÃÅ*È
    printf("PYATNASHKI 15");
   
    SetConsoleTextAttribute(hCon, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_RED| BACKGROUND_BLUE);//ÖÈÔÃ&#144;Û È Ã–Ã‚Ã…Ã’ ÃŽÃ&#129;ÎËÎ×ÃÅ*È
    int i, j;
    for(i = 0; i < SIZE; i++)
    {
        for(j = 0; j < SIZE; j++)
        {
            cPos.X = j*3+30;
            cPos.Y = i*2+4;
            //maybe at five or maybe at six
 
            SetConsoleCursorPosition(hCon, cPos);//ÓñòÃ*Ã*Ã*âëèâÃ*åò ïîçèöèþ êóðñîðÃ* â çÃ*äÃ*Ã*Ã*îì ýêðÃ*Ã*Ã*îì áóôåðÃ¥ êîÃ*ñîëè.
            printf("%c%c%c%c", BL, BL, BL, BL);
            cPos.Y = i*2+5;
            cPos.X = j*3+30;
            SetConsoleCursorPosition(hCon, cPos);
            if(board2[i][j])
                printf("%c%2i%c", BL, board2[i][j], BL);
            else
                printf("%c  %c", BL, BL);
            cPos.Y = i*2+6;
            cPos.X = j*3+30;
            SetConsoleCursorPosition(hCon, cPos);
            printf("%c%c%c%c", BL, BL, BL, BL);
        }
    }
    SetConsoleTextAttribute(hCon, BACKGROUND_RED| BACKGROUND_RED| BACKGROUND_INTENSITY);
    cPos.X = 30;
    cPos.Y =13;
    SetConsoleCursorPosition(hCon, cPos);
    printf(" I G R O K  2");
}
 
 
void Move( int direction )
{
    int dy[] = {1,-1, 0, 0};
    int dx[] = {0, 0, 1,-1};
    int i, j;
    for(i = 0; i < SIZE; i++)
        for(j = 0; j < SIZE; j++)
            if(board[i][j] == 0)
            {
                int newy = i + dy[direction];
                int newx = j + dx[direction];
                if( newy >= 0 && newy < SIZE &&
                    newx >= 0 && newx < SIZE)
                    {
                        board[i][j] = board[newy][newx];
                        board[newy][newx] = 0;
                    }
                return;
            }
}
void Move2( int direction )
{
    int dy[] = {1,-1, 0, 0};
    int dx[] = {0, 0, 1,-1};
    int i, j;
    for(i = 0; i < SIZE; i++)
        for(j = 0; j < SIZE; j++)
            if(board2[i][j] == 0)
            {
                int newy = i + dy[direction];
                int newx = j + dx[direction];
                if( newy >= 0 && newy < SIZE &&
                    newx >= 0 && newx < SIZE)
                    {
                        board2[i][j] = board2[newy][newx];
                        board2[newy][newx] = 0;
                    }
                return;
            }
}
Вот исправила,но все равно управление первым полем идет и с помощью стрелок,и с помощью 2,4,6,8,при том,что второе поле при нажатии 2,4,6,8 не изменяется,уже все ошибки переискала,не могу понять,что не так
0
516 / 408 / 188
Регистрация: 08.04.2013
Сообщений: 1,743
15.05.2015, 15:25 8
Работает на правых цифрах , не под функциональными, нум лок включен?
У меня на клаве стрелки отдельные есть, есть дополнительная цифровая со стрелками.
Код работает, иногда только отказывается начать, после перекомпиляции вроде начинает работать
1
2 / 2 / 3
Регистрация: 05.10.2014
Сообщений: 209
15.05.2015, 15:30  [ТС] 9
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
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
302
303
304
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
 
#define SIZE  4
#define NUMBS SIZE*SIZE
#define UP    0
#define DOWN  1
#define LEFT  2
#define RIGHT 3
 
int board[SIZE][SIZE];
int board2[SIZE][SIZE];
void FillBoard   ( void );
int  HaveSolution( void );
int  EndOfGame   ( void );
int  EndOfGame2   ( void );
void PrintBoard  ( void );    
void Move        ( int  );
void PrintBoard2  ( void );
 void Move2        ( int  );
int main( void )
{
    int punkt; 
    //setlocale(LC_ALL,"Russian"); 
 
      printf("IGRA PYATNASHKI\n");
      printf("1-REZHIM 2 IGROKA\n");
      printf("2-REZHIM IGROK-COMPUTER\n");
      printf("3- EXIT\n");
      fflush(stdin);
      scanf("%d",&punkt);
      
      switch(punkt)
      {
                   case 1:
                        {
                                         
                  // case 2:
  system("cls");
  system("color 0F");
    COORD cPos;
    HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
    HANDLE cInput = GetStdHandle(STD_INPUT_HANDLE);
    DWORD dr;
    INPUT_RECORD  rec;
    //init
  //  system("title 15 P U ZZ L E");
    FillBoard();
    PrintBoard();
    PrintBoard2();
    //
    while( !EndOfGame() || !EndOfGame2() )
    {
        
        //Sleep(50);
        ReadConsoleInput(cInput, &rec, sizeof(INPUT_RECORD), &dr);
        FlushConsoleInputBuffer(cInput);
        if(rec.EventType == KEY_EVENT && rec.Event.KeyEvent.bKeyDown)
        {
            switch(rec.Event.KeyEvent.wVirtualKeyCode) 
            {
            case VK_LEFT:
                Move(LEFT);
                PrintBoard();
                break;
            case VK_RIGHT:
                Move(RIGHT);
                PrintBoard();
                break;
            case VK_UP:
                Move(UP);
                PrintBoard();
                break;
            case VK_DOWN:
                Move(DOWN);
                PrintBoard();
                break;
            case VK_NUMPAD4:
                 cPos.X = 30;
    cPos.Y =13;
    SetConsoleCursorPosition(hCon, cPos);
                Move2(LEFT);
                PrintBoard2();
                break;
            case VK_NUMPAD6:
                 cPos.X = 30;
    cPos.Y =13;
    SetConsoleCursorPosition(hCon, cPos);
                Move2(RIGHT);
                PrintBoard2();
                break;
            case VK_NUMPAD8:
                 cPos.X = 30;
    cPos.Y =13;
    SetConsoleCursorPosition(hCon, cPos);
                Move2(UP);
                PrintBoard2();
                break;
            case VK_NUMPAD2:
                 cPos.X = 30;
    cPos.Y =13;
    SetConsoleCursorPosition(hCon, cPos);
                Move2(DOWN);
                PrintBoard2();
                break;    
            }
            }
        }
        
    }
}
}
 
void FillBoard( void )
{
    do
    {
        srand( time( NULL ));
        int numbers[NUMBS] = {0};
        int i;
        int nextNum;
        for(i = 0; i < NUMBS-1; i++)
            while(1)
            {
                nextNum = rand()%(NUMBS-1)+1;
                if(numbers[nextNum] == 0)
                {
                    numbers[nextNum] = 1;
                    board[ i/SIZE ][ i%SIZE ] = nextNum;
                    break;
                }
            }
    } while( !HaveSolution() );
    for (int i=0;i<SIZE;i++)
    for(int j=0;j<SIZE;j++)
    board2[i][j]=board[i][j];
}
 
int HaveSolution( void )
{
    int i, j;
    int inv = 0;
    for(i = 0; i < NUMBS; i++)
    {
        if(board[ i/SIZE ][ i%SIZE ] == 0)
            inv += i+1;
        for(j = 0; j < i; j++)
            if(board[ j/SIZE ][ j%SIZE ] > board[ i/SIZE ][ i%SIZE ])
                inv++;
    }
    return (inv%2 ? 0 : 1);
}
 
int EndOfGame( void )
{
    int i;
    for(i = 0; i < NUMBS-1; i++)
        if(board2[ i/SIZE ][ i%SIZE ] != i+1)
            return 0;
    return 1;
}
 int EndOfGame2( void )
{
    int j;
    for(j = 0; j < NUMBS-1; j++)
        if(board2[ j/SIZE ][ j%SIZE ] != j+1)
            return 0;
    return 1;
}
 
void PrintBoard( void )
{
  //  system("cls");
   // system("color 0F");
    HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);//Äåñêðèïòîð óñòðîéñòâÃ* ñòÃ*Ã*äÃ*ðòÃ*îãî âûâîäÃ*. ÂÃ*Ã*÷Ã*ëÃ¥, ýòî - äåñêðèïòîð Ã*êòèâÃ*îãî ýêðÃ*Ã*Ã*îãî áóôåðÃ* êîÃ*ñîëè
    COORD cPos;
    unsigned char BL = 219;
     cPos.X = 3;
    cPos.Y = 3;
    SetConsoleCursorPosition(hCon, cPos);
    SetConsoleTextAttribute(hCon, BACKGROUND_RED | BACKGROUND_RED | BACKGROUND_INTENSITY);//ÖÂÅÒ ÂÅÃ&#144;ÕÃ&#141;ÅÉ Ã&#143;ÎËÎÑÃÅ*È
    printf("PYATNASHKI 15");
   
    SetConsoleTextAttribute(hCon, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_RED| BACKGROUND_BLUE);//ÖÈÔÃ&#144;Û È Ã–Ã‚Ã…Ã’ ÃŽÃ&#129;ÎËÎ×ÃÅ*È
    int i, j;
    for(i = 0; i < SIZE; i++)
    {
        for(j = 0; j < SIZE; j++)
        {
            cPos.X = j*3+3;
            cPos.Y = i*2+4;
            //maybe at five or maybe at six
 
            SetConsoleCursorPosition(hCon, cPos);//ÓñòÃ*Ã*Ã*âëèâÃ*åò ïîçèöèþ êóðñîðÃ* â çÃ*äÃ*Ã*Ã*îì ýêðÃ*Ã*Ã*îì áóôåðÃ¥ êîÃ*ñîëè.
            printf("%c%c%c%c", BL, BL, BL, BL);
            cPos.Y = i*2+5;
            cPos.X = j*3+3;
            SetConsoleCursorPosition(hCon, cPos);
            if(board[i][j])
                printf("%c%2i%c", BL, board[i][j], BL);
            else
                printf("%c  %c", BL, BL);
            cPos.Y = i*2+6;
            cPos.X = j*3+3;
            SetConsoleCursorPosition(hCon, cPos);
            printf("%c%c%c%c", BL, BL, BL, BL);
        }
    }
    SetConsoleTextAttribute(hCon, BACKGROUND_RED| BACKGROUND_RED| BACKGROUND_INTENSITY);
    cPos.X = 3;
    cPos.Y =13;
    SetConsoleCursorPosition(hCon, cPos);
    printf(" I G R O K  1");
}
 
 
 void PrintBoard2( void )
{
   // system("cls");
   // system("color 0F");
   HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);//Äåñêðèïòîð óñòðîéñòâÃ* ñòÃ*Ã*äÃ*ðòÃ*îãî âûâîäÃ*. ÂÃ*Ã*÷Ã*ëÃ¥, ýòî - äåñêðèïòîð Ã*êòèâÃ*îãî ýêðÃ*Ã*Ã*îãî áóôåðÃ* êîÃ*ñîëè
    COORD cPos;
    unsigned char BL = 219;
     cPos.X = 30;
    cPos.Y = 3;
    SetConsoleCursorPosition(hCon, cPos);
    SetConsoleTextAttribute(hCon, BACKGROUND_RED | BACKGROUND_RED | BACKGROUND_INTENSITY);//ÖÂÅÒ ÂÅÃ&#144;ÕÃ&#141;ÅÉ Ã&#143;ÎËÎÑÃÅ*È
    printf("PYATNASHKI 15");
   
    SetConsoleTextAttribute(hCon, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_RED| BACKGROUND_BLUE);//ÖÈÔÃ&#144;Û È Ã–Ã‚Ã…Ã’ ÃŽÃ&#129;ÎËÎ×ÃÅ*È
    int i, j;
    for(i = 0; i < SIZE; i++)
    {
        for(j = 0; j < SIZE; j++)
        {
            cPos.X = j*3+30;
            cPos.Y = i*2+4;
            //maybe at five or maybe at six
 
            SetConsoleCursorPosition(hCon, cPos);//ÓñòÃ*Ã*Ã*âëèâÃ*åò ïîçèöèþ êóðñîðÃ* â çÃ*äÃ*Ã*Ã*îì ýêðÃ*Ã*Ã*îì áóôåðÃ¥ êîÃ*ñîëè.
            printf("%c%c%c%c", BL, BL, BL, BL);
            cPos.Y = i*2+5;
            cPos.X = j*3+30;
            SetConsoleCursorPosition(hCon, cPos);
            if(board2[i][j])
                printf("%c%2i%c", BL, board2[i][j], BL);
            else
                printf("%c  %c", BL, BL);
            cPos.Y = i*2+6;
            cPos.X = j*3+30;
            SetConsoleCursorPosition(hCon, cPos);
            printf("%c%c%c%c", BL, BL, BL, BL);
        }
    }
    SetConsoleTextAttribute(hCon, BACKGROUND_RED| BACKGROUND_RED| BACKGROUND_INTENSITY);
    cPos.X = 30;
    cPos.Y =13;
    SetConsoleCursorPosition(hCon, cPos);
    printf(" I G R O K  2");
}
 
 
void Move( int direction )
{
    int dy[] = {1,-1, 0, 0};
    int dx[] = {0, 0, 1,-1};
    int i, j;
    for(i = 0; i < SIZE; i++)
        for(j = 0; j < SIZE; j++)
            if(board[i][j] == 0)
            {
                int newy = i + dy[direction];
                int newx = j + dx[direction];
                if( newy >= 0 && newy < SIZE &&
                    newx >= 0 && newx < SIZE)
                    {
                        board[i][j] = board[newy][newx];
                        board[newy][newx] = 0;
                    }
                return;
            }
}
void Move2( int direction )
{
    int dy[] = {1,-1, 0, 0};
    int dx[] = {0, 0, 1,-1};
    int i, j;
    for(i = 0; i < SIZE; i++)
        for(j = 0; j < SIZE; j++)
            if(board2[i][j] == 0)
            {
                int newy = i + dy[direction];
                int newx = j + dx[direction];
                if( newy >= 0 && newy < SIZE &&
                    newx >= 0 && newx < SIZE)
                    {
                        board2[i][j] = board2[newy][newx];
                        board2[newy][newx] = 0;
                    }
                return;
            }
}
marat_miaki,
вот доделала,там курсор перескакивал просто

вы не поможете теперь сделать режим,чтобы с компьютером играть можно было?т.е. тоже два поля,но в ответ на мой ход,на другом поле компьютер ходит.Спасибо
0
516 / 408 / 188
Регистрация: 08.04.2013
Сообщений: 1,743
15.05.2015, 15:48 10
Увы, помочь могу иногда что то подправит, и то если вызовет какой то интерес.
А толку без разработки (не простого) алгоритма для компьютера.
Карты вам в руки, и вперед.
1
2 / 2 / 3
Регистрация: 05.10.2014
Сообщений: 209
15.05.2015, 15:52  [ТС] 11
marat_miaki, спасибо,если будут вопросы,то можно к вам обращаться?
0
516 / 408 / 188
Регистрация: 08.04.2013
Сообщений: 1,743
15.05.2015, 18:07 12
вроде здесь я не единственный помощник.
0
15.05.2015, 18:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2015, 18:07
Помогаю со студенческими работами здесь

Игра с фишками
Создать динамический массив, представляющий поле (n x n), где n - нечетное число. Расположить на...

Как создать в WPF точно такое же окно?
Нужно создать окно вот такой формы. Нужен XAML код, с Arcsegment-ом слишком круглая...

Как создать такое всегда неактивное окно Windows с цветовым преобразователем ?
Изначально, задача состояла в этом, ...

Игра с фишками. Что не так в моем коде?
Важной частью игры является проверка того, что можно ли соединить две фишки путем, удовлетворяющим...

Игра пятнашки на C#: как обеспечить перемешивание кнопок
Добрый день, уважаемые господа. Наткнулся я на один интересный код, авторство которого увы не...

Игра Пятнашки 3x3: как реализовать интерфейс программы
Привет всем, посоветуйте пожалуйста как реализовать интерфейс программы. Что вывести на форму,...


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

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