Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2010, 00:29   #1
LuckyStarKsu
Новичок
Джуниор
 
Регистрация: 15.12.2010
Сообщений: 2
Восклицание Игра Баше. Что-то уже написано. Нужно разобраться

На столе выложены n предметов. Играют двое. Они поочередно забирают несколько предметов, причем заранее договарено, что число забранных предметов не превышает k (0<k<=n). Проигрывает тот, кто своим ходом вынужден забрать последний предмет.
имеется выйгрышная тактика для игрока берущего предметы вторым.
Чтобы найти ее, определяю, какие ситуации являются пройгрышными для игрока, делающего очередной ход. Такая ситуация является положение когда на столе остается й предмет, если число забираемых предметов не превышает k, то второй такой ситуацией является начие на столе 1+(k+1) предметов. сколько бы не взял предметов тот кто делает ход его соперник его соперник может свести ситуацию к одному оставшемуся предмету, поэтому пройгрышная ситуации характеризуются свойством: остаток от деления числа имеющихся предметов на (k+1), следовательно
выйгрышная стратегия такая брать столько предметов, чтобы оставлять сопернику пройгрышную ситуацию.
количество предметов в пройгрышной ситуации равно ближайшему меньшему чем m числу предмето кратному (k+1) увеличенному на 1.
Это количество определяется
(m div(k+1))*(k+1)+1
упрощенное правило - надо оставлять сопернику (m-1)div(k+1)*(k+1)+1 предметов
div - целочисленное деление
n - начальное количество предметов
b - кол-во предметов, которое берет делающий очередной ход
p - величина принимающая случайное значение 1 и 2 и опредающее участника игры делающего первый ход
z - кол-во предметов, которое надо оставить, чтобы создать для соперника пройгрышную ситуацию
*********************************** ******************************
Код:
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <time.h>
void main()
{
	setlocate(LC_ALL,"rus");
	printf("Игра Баше");
int n,k,m,p,b,z;
srand(time(NULL));
n=rand()%20+1;
printf("Исходное количество предметов %d",n);
k=rand()%2+1;
printf("Можно выбрать от 1 до %d",k);
p=rand()%2+1;
 if (p=1) printf("Начинает компьютер");
 else printf("Начинаете вы");

m=n;

 do {
  

    if (p=1) {
     	  
          if ((m%k++)!=1) {z=((m-1)\(k+1))*((k++)+1);
          b=m-z;
          else b=1+rand()%20+1;
          }

    printf("Компьютер взял %d",b);
    else
       
       do {
       printf("Сколько вы берете?");
       scanf("%d",&b);
        
             if (b<=0 || b>0 || b>m);
             printf("Неправильно значение");
     
       }while (b>0 && b>=k && b<=m);
    }

m=m-b;

    if (m==0){
           if (p==0) 
           printf("Последний предмет взяли вы, т.е. выйграл компьютер!");
           else
           printf("Последний предмет взял компьютер, т.е. выйграли Вы!");
           }
    else
    printf("Осталось предметов: %d",m);
           
          if(p==1) p=2;
          else
          p=1;
          }

     }}
 while (m=0);

getch();
}

Последний раз редактировалось Stilet; 16.12.2010 в 10:09.
LuckyStarKsu вне форума Ответить с цитированием
Старый 17.12.2010, 17:01   #2
LuckyStarKsu
Новичок
Джуниор
 
Регистрация: 15.12.2010
Сообщений: 2
Радость Вот новый вариант

#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
#include <iostream>
#include <windows.h>
using namespace std;
void main()
{
setlocale(LC_ALL,"rus");
system("color F1");
system("cls");

cout<<"\n\t\tИгра Баше\n";

int n,k,m,p,b;
double z;
b=0;
srand(time(NULL));
n=rand()%10+1;
n=n*3;
cout<<"\n\tИсходное количество предметов "<<n;

k=rand()%2+2;
cout<<"\n\tМожно выбрать от 1 до "<<k;

p=rand()%2+1;
if (p==1) cout<<"\n\tНачинает компьютер ";

else
cout<<"\n\tНачинаете Вы ";


m=n;
do {
if (p==1)
{

{
b=rand()%k+1;
m=m-b;
p=0;
if (m<=0)
{
cout<<"\n\tПоследний предмет взял компьютер, ВЫЙГРАЛИ ВЫ! ";

break;
}
}

cout<<"\n\tКомпьютер взял "<<b;

cout<<"\n\tМожно выбрать от 1 до "<<k;

}
if (p!=1)
{
do
{
cout<<"\n\tСколько Вы берете?";

scanf("%d",&b);
if (b<=0 || b>k || b>m){
cout<<"\n\tНеправильное значение";

b=0;
if (m<=0)
{
cout<<"\n\tПоследний предмет взяли Вы, ВЫЙГРАЛ КОМПЬЮТЕР!";

break;
}
}

}
while (b<0 && b>k && b>m);
}

m=m-b;

if (m<=0)
{
if (p==0)
{
cout<<"\n\tПоследний предмет взяли Вы, ВЫЙГРАЛ КОМПЬЮТЕР!";

}

}else{
cout<<"\n\tОсталось предметов "<<m;


if(p==1){p=2;}
else{
p=1;}
}

}while(m!=0);

getch();
}
LuckyStarKsu вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
игра домино.код уже есть! помогите найти ошибку! kitty_girl Помощь студентам 3 24.09.2014 12:02
Подскажите, что неверно написано?.. katris Помощь студентам 0 25.10.2009 16:11
Помогите разобраться что нужно для создания браузерной игры TYPIST PHP 7 22.06.2009 21:48
Помогите разобраться с задачей, уже в отчаянии (+) Ink_90 Паскаль, Turbo Pascal, PascalABC.NET 3 22.12.2008 16:42