Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Игра 100 спичек


Автор: Ruiz 6.1.2007, 17:43
Версия: Borland C++ v5.02
Вот текст задачи:  «100 спичек». 
Из кучки, первоначально содержащей 100 спичек, двое играющих поочередно берут по несколько спичек: не менее одной и не более десяти. Проигрывает взявший последнюю спичку .
Алгоритм победы такой чтобы выиграть игру надо выбрать чтоб компьютер ходил первый. Компьютер вытянет определенное кол-во спичек (почти всегда это 1) игрок должен вытянуть такое число спичек чтобы в сумме (вытянутых спичек игроком и компьютером) было 11. 
Например: Компьютер вытягивает 1 спичек игрок должен вытянуть 10.
Вот так играем до того как останется 2 спички и как раз выпадет ход игрока. Игрок естественно вытянет 1 спичку и компьютер проиграл. Но вот тут проблема компьютер вытягивает 0 спичек и ход передается опять вам и получается вы проиграли. Короче, помогите сделать так чтобы компьютер не мог вытягивать 0 спичек а то что-то ни как не могу разобраться. Заранее благодарен! 
Вот код:
Код

#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
//Рисуем спички
int Show(int sp[100][4], int all)
{
int i;
//Затираем
setcolor(0);
for(i=0;i<100;i++)
{
line(150+sp[i][0],70+sp[i][1],150+sp[i][2],70+sp[i][3]);
}
//рисуем
setcolor(7);
for(i=0;i<all;i++)
{
line(150+sp[i][0],70+sp[i][1],150+sp[i][2],70+sp[i][3]);
}

return 0;
}

int main(void)
{  //============переменные
   int sp[100][4];//спичек 100
   int Pl,Comp,All=100;//взято спичек
   int A,i,j;
   float a;//угол наклона спичек
   char ch;//vvod
   int Win=0,//победа 1 игрок 2 комп
       Esc=0,//выход
       P;//чей ход 0 комп 1 игрок
   randomize();
   //очищаем спички
   for(i=0;i<100;i++)
   {
    sp[i][0]=0;sp[i][1]=0;sp[i][2]=0;sp[i][3]=0;
   }
   //задаем расположение спичек случайно
    for(i=0;i<100;i++)
   {
    sp[i][0]=random(300);sp[i][1]=random(150);
    A=random(360);
    a=3.14*A/180;
    sp[i][2]=sp[i][0]+50*sin(a); sp[i][3]=sp[i][1]+50*cos(a);
   }

   /* request auto detection */
   int gdriver = DETECT, gmode, errorcode;
   int xmax, ymax;

   /* initialize graphics and local variables */
   initgraph(&gdriver, &gmode, "");

   /* read result of initialization */
   errorcode = graphresult();
   /* an error occurred */
   if (errorcode != grOk)
   {
      printf("Graphics error: %s\n", grapherrormsg(errorcode));
      printf("Press any key to halt:");
      getch();
      exit(1);
   }
//Кто ходит
setcolor(5);
outtextxy(200,20,"KTO hodit pervim 1 - Igrok 2 - Computer");
Xod:
ch=getch();
if(ch=='2')P=0;else
if(ch=='1')P=1;else goto Xod;
setcolor(0);
outtextxy(200,20,"KTO hodit pervim 1 - Igrok 2 - Computer");
setcolor(5);
outtextxy(310,400,"Igra");
Show(sp,All);
//====================================
char buffer[5];
//Игра
while((Win==0)&&(Esc==0))
{
 //=============================================
 //ход игрока 
if(P==1)
 {
setcolor(0);
sprintf(buffer, "%d",All);
outtextxy(200,20,"Spichek ostalos ");outtextxy(350,20,buffer);
setcolor(5);
outtextxy(100,420,"Skolko spichek berem? (1-10 jmem ot 1 do 0, 0 eto 10)");
sprintf(buffer, "%d",All);
outtextxy(200,20,"Spichek ostalos ");outtextxy(350,20,buffer);

Pl_P:
  ch=getch();
setcolor(0);
sprintf(buffer, "%d",All);
outtextxy(200,20,"Spichek ostalos ");outtextxy(350,20,buffer);

   if(ch=='1')Pl=1;else
   if(ch=='2')Pl=2;else
   if(ch=='3')Pl=3;else
   if(ch=='4')Pl=4;else
   if(ch=='5')Pl=5;else
   if(ch=='6')Pl=6;else
   if(ch=='7')Pl=7;else
   if(ch=='8')Pl=8;else
   if(ch=='9')Pl=9;else
   if(ch=='0')Pl=10;else
   if(ch==27){Esc=1;goto end;}//Выход
   else
   {
   goto Pl_P;
   }

//проверка на победу
All=All-Pl;
if(All<=0){Win=2;goto end;}

 P=0;
 }//конец хода игрока
 //=============================================
 //ход компа
 else
 {
setcolor(0);
outtextxy(100,420,"Skolko spichek berem? (1-10 jmem ot 1 do 0, 0 eto 10)");
sprintf(buffer, "%d",All);
outtextxy(200,20,"‘Spichek ostalos ");outtextxy(350,20,buffer);

if(All>12)//если спичек больше 12
 {
 for(i=1;i<10;i++)
 if(i*11+1<All) Comp=All-(i*11+1);
 if(Comp>10)Comp=1;
 }
 else
 if(All>10){Comp=10;}else
 if(All<=10){Comp=All-1;}

//Вывод хода компа
//проверка на победу
All=All-Comp;
setcolor(5);
sprintf(buffer, "%d",Comp);
outtextxy(250,420,"Comp vzial");outtextxy(350,420,buffer);
sprintf(buffer, "%d",All);
outtextxy(200,20,"Spichek ostalos ");outtextxy(350,20,buffer);

if(All<=0){Win=1;goto end;}
P=1;
outtextxy(200,460,"Najmite Space dlia prodoljenia");
getch();
setcolor(0);
sprintf(buffer, "%d",Comp);
outtextxy(250,420,"Comp vzial ");outtextxy(350,420,buffer);
sprintf(buffer, "%d",All);
outtextxy(200,20,"Spichek ostalos ");outtextxy(350,20,buffer);
outtextxy(200,460,"Najmite Space dlia prodoljenia");

 }
 //======================конец хода компа
Show(sp,All);


end:
}//============================================
//Конец игры

setcolor(0);
outtextxy(100,420,"Skolko spichek berem? (1-10 jmem ot 1 do 0, 0 eto 10)");

  if(Win==1)
  {
  setcolor(5);
  outtextxy(290,420,"Pobedil Igrok");
  outtextxy(200,460,"Najmite Space dlia Vihoda");
    }
  if(Win==2)
  {
  setcolor(5);
  outtextxy(280,420,"Pobedil computer");
  outtextxy(200,440,"Najmite Space dlia Vihoda ");
  }
  getch();
   /* vihod */
   closegraph();
   return 0;
}


Автор: Ruiz 6.1.2007, 23:13
Я думаю ответ хранится в "ходе компьютера"! Хотя после нескольких раз изучения кода так и не смог понять почему такая ошибка

Автор: apook 7.1.2007, 05:25
Проверку хода компа надо сделать такой
Код

if( All >12 )//если спичек больше 12
{
    for( i=1; i<10; i++ )
       if( i*11+1 <All ) Comp=All-(i*11+1);
    if( Comp >10 )Comp=1;
    }
else if( All >10 ) Comp=10;
else if( All <=10 && All >1 ) Comp=All-1;
else Comp=All;

Автор: Ruiz 7.1.2007, 12:09
Спасибо большое! Но вот еще вопрос не могу понять что за функция в этой игре

Код

//====================================
char buffer[5];
//Игра
while((Win==0)&&(Esc==0))
{
 //=============================================

Автор: apook 7.1.2007, 12:22
Это не функции это :
Код

char buffer[5];

обьявление переменной (в С++ можно в любом месте кода)
Код

while((Win==0)&&(Esc==0))
{

начало цикла

че паришся smile 

Автор: Ruiz 7.1.2007, 18:40
Спасибо большое за твою помощь. Вопросов больше нет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)