-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path**15shki.c
157 lines (149 loc) · 3.32 KB
/
**15shki.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
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<time.h>
#include<malloc.h>
typedef unsigned short u_short;
typedef unsigned int u_int;
typedef enum Direction {up,down,right,left} Direction;
u_short CurX, CurY;
//Создание игровой площадки
void CreateField(u_short** received ,u_short _size) {
u_short n, i, buf, k = 0,rand_size= ((_size*_size)-1);
u_short* arr = (u_short*)malloc((_size*_size) * sizeof(u_short));
bool flag = false ;
srand(time(NULL));
for (n = 0; n < (_size*_size); ) {
flag = false;
buf = (1 + rand() % (rand_size +1));
for (i = 0; i < n; i++) {
if (arr[i] == buf) {
flag = true;
break;
}
}
if (!flag) {
arr[n] = buf;
n++;
}
}
for (n = 0; n < _size; n++)
for (i = 0; i < _size; i++) {
received[n][i] = arr[k];
k++;
}
received[(_size-1)][(_size-1)] = 0;
CurX = (_size-1); CurY = (_size-1);
free(arr);
return;
}
// Организация перемещений
void Move(Direction dir, u_short** received, u_short _size) {
switch(dir) {
case up:
if (CurY > 0)
{
received[CurY][CurX] = received[CurY - 1][CurX];
received[CurY - 1][CurX] = 0;
CurY--;
}
else
printf("ERROR OUT FROM BEYOND THE PLAYING FIELD \n\n");
break;
case down:
if (CurY < (_size-1))
{
received[CurY][CurX] = received[CurY + 1][CurX];
received[CurY + 1][CurX] = 0;
CurY++;
}
else
printf("ERROR OUT FROM BEYOND THE PLAYING FIELD \n\n");
break;
case right:
if (CurX < (_size-1))
{
received[CurY][CurX] = received[CurY][CurX + 1];
received[CurY][CurX + 1] = 0;
CurX++;
}
else
printf("ERROR OUT FROM BEYOND THE PLAYING FIELD \n\n");
break;
case left:
if (CurX > 0)
{
received[CurY][CurX] = received[CurY][CurX - 1];
received[CurY][CurX - 1] = 0;
CurX--;
}
else
printf("ERROR OUT FROM BEYOND THE PLAYING FIELD \n\n");
break;
}
}
//ВЫВОД ПОЛЯ
void coutArr(u_short** received, u_short _size){
system("clear");
for (u_int i = 0; i < _size; i++) {
for (u_int j = 0; j < _size; j++) {
printf("\t%d ",received[i][j]);
}
printf("\n\n");
}
return;
}
//Проверка на выигрыш
bool total(u_short** received, u_short _size) {
u_short k=1;
bool flag = true;
for (u_short i = 0; i < _size; i++) {
for (u_short j = 0; j < _size; j++) {
if (received[i][j] != k % (_size*_size)) {
flag = false;
break;
}
k++;
}
}
return flag;
}
int main(){
u_short _size;
printf("Enter Field Size: ");
scanf("%hu", &_size);
u_short** Field= (u_short**)malloc(_size * sizeof(u_short*));
for ( u_short i = 0; i < _size; i++)
Field[i] = (u_short*)malloc(_size * sizeof(u_short));
CreateField(Field, _size);
coutArr(Field, _size);
while(!total(Field, _size)) {
printf("Choose a direction 'w,a,s,d'\n");
char key = getchar();
switch (key)
{
case 119:
Move(up,Field, _size);
break;
case 115:
Move(down,Field, _size);
break;
case 100:
Move(right,Field, _size);
break;
case 97:
Move(left,Field, _size);
break;
case 27:
printf("NICE TRY\n");
return 0;
break;
}
coutArr(Field, _size);
}
printf(" ====Congratulations! Press Esc to exit==== ");
for (u_short i = 0; i < _size; i++)
free(Field[i]);
free(Field);
return 0;
}