Chacho
02-24-2011, 13:39
Опитвам се да направя бикове и крави на С++, така че да се играе срещу компютъра и той да е достоен противник. Успях да направя частта с въвеждането на число на играча, генерирането на число на компютъра и познаването на числото на компютъра. След това се захванах да пиша алгоритъма на бота, но сигурно нещо не съм написал като хората и сега ми гърми почти цялата програма. Ако на някой му се занимава да погледне кода, ще му го пратя. (дългичък е и, макар че има коментари, е малко труден за следене)
Ще напиша алгоритъма, ако някой се навие да го реализира. Струва ми се, че е верен. Ето го:
Алгоритъм на бота:
1. Проверява дали в 1234 има бикове или крави. Ако има, отива на стъпка 2, иначе на стъпка 10.
2. Докато броят на биковете е различен от броят на биковете и кравите (бикове != бикове + крави) пермутира 1234 и запаметява последната пермутация числото.
3. Проверява дали в 5678 има бикове и крави. Ако има, отива на стъпка 4, иначе отива на стъпка 9.
4. Докато броят на биковете е различен от броят на биковете и кравите (бикове != бикове + крави) пермутира 5678 и запаметява последната пермутация на числото.
5. Ако сборът от биковете и кравите в пермутираните 1234 и 5678 е по-малък от 4 (с други думи 9-ката е крава), то отива на стъпка 6, иначе на стъпка 8.
6. В запаметеното 1234 разменя цифрите с 9-ката и:
-Ако при сменянето на цифрата намалеят биковете, тогава ги разменя отново, за да върне старото
-Ако при сменянето на цифрата се запазят биковете (с други думи 9-ката не е бик, нито е върху друг бик), то запазва индексът на дадената цифра и отново разменя цифрата и 9-ката за да върне старата.
-Ако при сменянето нарастнат биковете, запаметява числото.
Стъпката се изпълнява, докато 9-ката не се размени със всички 4 цифри, по този начин сме намерили мястото й и местата, където трябва да се поставят биковете от 5678.
7. Разменя цифрите от запаметеното 5678 с индекси запазените от 6 на с цифрите със същите индекси от запаметеното 1234 (вече със сложена 9-ка). Полученото число има 4 бика.
8. 9-ката не е бик, затова правим сходна на 6 стъпка, използвайки 9-ката да проверим индексите на цифрите в 1234, на които няма бикове. След това правим стъпка 7.
9. Изпълнява същото като в стъпка 6, но без да пази индекси.
10. Докато (бикове != бикове+крави) пермутира 5678 и после стъпка 9, но за числото 5678.
Първо се въвежда число от опонента и компютърът генерира свое. В един масив се записват всички ходове на компютърът, преди да е започнала самата игра. Като започне играта, на всеки свой ход компютърът извежда поредното число от масива с ходове. Играта свършва, когато някой първи познае числото на опонента си.
Ето и алгоритъм за пермутация на число:
Нека Razm(x,y) e функция, която разменя числата х и у, а а[4] e масивът с цифрите от числото.
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
//kod za zapisvane na a[0] до a[3] в друг масив
Razm(a[3], a[2]);
//kod za zapisvane na a[0] do a[3] в друг масив
Razm(a[2], a[1]);
}
Razm(a[1], a[0]);
}
Очаквам на никого да не му се занимава, но все пак, ако някой се захване, благодаря предварително!
Ще напиша алгоритъма, ако някой се навие да го реализира. Струва ми се, че е верен. Ето го:
Алгоритъм на бота:
1. Проверява дали в 1234 има бикове или крави. Ако има, отива на стъпка 2, иначе на стъпка 10.
2. Докато броят на биковете е различен от броят на биковете и кравите (бикове != бикове + крави) пермутира 1234 и запаметява последната пермутация числото.
3. Проверява дали в 5678 има бикове и крави. Ако има, отива на стъпка 4, иначе отива на стъпка 9.
4. Докато броят на биковете е различен от броят на биковете и кравите (бикове != бикове + крави) пермутира 5678 и запаметява последната пермутация на числото.
5. Ако сборът от биковете и кравите в пермутираните 1234 и 5678 е по-малък от 4 (с други думи 9-ката е крава), то отива на стъпка 6, иначе на стъпка 8.
6. В запаметеното 1234 разменя цифрите с 9-ката и:
-Ако при сменянето на цифрата намалеят биковете, тогава ги разменя отново, за да върне старото
-Ако при сменянето на цифрата се запазят биковете (с други думи 9-ката не е бик, нито е върху друг бик), то запазва индексът на дадената цифра и отново разменя цифрата и 9-ката за да върне старата.
-Ако при сменянето нарастнат биковете, запаметява числото.
Стъпката се изпълнява, докато 9-ката не се размени със всички 4 цифри, по този начин сме намерили мястото й и местата, където трябва да се поставят биковете от 5678.
7. Разменя цифрите от запаметеното 5678 с индекси запазените от 6 на с цифрите със същите индекси от запаметеното 1234 (вече със сложена 9-ка). Полученото число има 4 бика.
8. 9-ката не е бик, затова правим сходна на 6 стъпка, използвайки 9-ката да проверим индексите на цифрите в 1234, на които няма бикове. След това правим стъпка 7.
9. Изпълнява същото като в стъпка 6, но без да пази индекси.
10. Докато (бикове != бикове+крави) пермутира 5678 и после стъпка 9, но за числото 5678.
Първо се въвежда число от опонента и компютърът генерира свое. В един масив се записват всички ходове на компютърът, преди да е започнала самата игра. Като започне играта, на всеки свой ход компютърът извежда поредното число от масива с ходове. Играта свършва, когато някой първи познае числото на опонента си.
Ето и алгоритъм за пермутация на число:
Нека Razm(x,y) e функция, която разменя числата х и у, а а[4] e масивът с цифрите от числото.
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
//kod za zapisvane na a[0] до a[3] в друг масив
Razm(a[3], a[2]);
//kod za zapisvane na a[0] do a[3] в друг масив
Razm(a[2], a[1]);
}
Razm(a[1], a[0]);
}
Очаквам на никого да не му се занимава, но все пак, ако някой се захване, благодаря предварително!