Другие языки программирования и технологии

Нужна помощь по программированию. Язык с++

Я пытаюсь сделать игру "пятнашки" и мне надо эти числа при каждом заходе в игру расставить их рандомно (то есть перемешать).
int a[4][4]{
{'01','02','03','04'},
{'05','06','07','08'},
{'09','10','11','12'},
{'13','14','15',' '}
};

Какой коммандой я могу это сделать?
Например, так:

#include < iostream>
#include < windows.h>
#include < time.h>
#include < conio.h>
using namespace std;
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
void sw(int k,int &r,int* &p)
{
switch(k)
{ case 72: if(r > 3) p[r]^=p[r-4],p[r-4]^=p[r],p[r]^=p[r-4],r-=4; break;
case 80: if(r < 12) p[r]^=p[r+4],p[r+4]^=p[r],p[r]^=p[r+4],r+=4; break;
case 77: if(r % 4!=3) p[r]^=p[r+1],p[r+1]^=p[r],p[r]^=p[r+1],r++; break;
case 75: if(r % 4) p[r]^=p[r-1],p[r-1]^=p[r],p[r]^=p[r-1],r--; break;
}
}

int main()
{ system("cls");
COORD cor;
int r,j,k;
int* p=new int[16]();
int** m=new int*[4]();
srand(time(0));
for(j=0;j < 4;) m[j++]=p+j*4;
for(j=16;--j;p[j-1]=j);
for(r=15,j=0;j < 1000;j++) sw((k=rand() % 4,k=72+!!k+2*k+((1<<!(k-3))-1)),r,p);
for(;;)
{
for(j=0;j < 4;j++, cout << endl)
for(k=0;k < 4;k++) cor.X=j*4,cor.Y=k*2,SetConsoleCursorPosition(h,cor),cout.width(2),(m[k][j]?cout<< m[k][j] << " ":cout<< " ");
switch(getch())
{ case 224: if(!kbhit()) break;
case 0: sw(getch(),r,p); break;
case 27: exit(0);
}
}
delete [] p;
delete [] m;
return 0;
}
Александр Ключко
Александр Ключко
76 473
Лучший ответ
#include <iostream>
#include <array>
#include <string>
#include <random>
using namespace std;
class Fifteen {
public:
using line_t = array<string, 4U>;
Fifteen() {
fill();
}
void start() {
const uniform_int_distribution<> uid(0, 3);
random_device rd;
mt19937 gen(rd());
for (auto i = 0U; i < 13247U; ++i)
swap(matrix_[uid(gen)][uid(gen)], matrix_[uid(gen)][uid(gen)]);
}
void show()const {
for (const auto &line : matrix_) {
for (const auto &value : line) cout << " " << value;
cout.put('\n');
}
}
private:
array<line_t, 4U > matrix_;
void fill() {
auto n = 0;
for (auto &line : matrix_)
for (auto &value : line) {
if (++n < 10) value += " "s;
value += to_string(n);
}
matrix_[3U][3U] = " "s;
}
};
int main() {
Fifteen game;
game.start();
game.show();
system("pause");
}
Олег Аладов
Олег Аладов
56 173
Ты учти, что половину "перемешиваний" нельзя возвратить в нужную расстановку. Вот, если в исходной позиции поменять местами {14} и {15} (вытаскивая фишки), то никак потом не восстановить исходную позицию "по правилам"!
Zahidjon Sodikov А каким образом это определить уже после перестановки?
если честно можно просто
одномерный массив на 16 элментов создать
заполнить числами 1, по -16 = сделать = '' пустым
потом перемещать данный массив через индексы
и заполнить ваш массив 4 на 4 заначениям массива созданного выше
Игорь Ковалев
Игорь Ковалев
16 208
x = rand() % 4; // теперь x содержит случайное число от 0 до 3, включительно

Чтобы переставить два элемента используя std:swap соответственно :
#include
...
std::swap(x,y);

Теперь чтобы поменять местами:

Делаем в цикле чтобы помешать достаточно хорошо:
for(i=0; i<количество_итераций_чтобы_хорошо_перемешалось) std::swap(a[rand() % 4][rand() % 4], a[rand() % 4][rand() % 4]);
Павел Ковалев
Павел Ковалев
15 224
Денис Морарь В пятнашках два состояния, которые друг в друга не переводятся.
То есть, если мешать, как описано, с вероятностью 50% получим неразрешимый вариант