Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Игра 100 спичек, Borland C++ v5.02 
V
    Опции темы
Ruiz
Дата 6.1.2007, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.1.2007

Репутация: нет
Всего: нет



Версия: 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, 17:47
PM MAIL   Вверх
Ruiz
Дата 6.1.2007, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.1.2007

Репутация: нет
Всего: нет



Я думаю ответ хранится в "ходе компьютера"! Хотя после нескольких раз изучения кода так и не смог понять почему такая ошибка
PM MAIL   Вверх
apook
Дата 7.1.2007, 05:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 10
Всего: 23



Проверку хода компа надо сделать такой
Код

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;



--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Ruiz
Дата 7.1.2007, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.1.2007

Репутация: нет
Всего: нет



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

Код

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

PM MAIL   Вверх
apook
Дата 7.1.2007, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 10
Всего: 23



Это не функции это :
Код

char buffer[5];

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

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

начало цикла

че паришся smile 


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Ruiz
Дата 7.1.2007, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.1.2007

Репутация: нет
Всего: нет



Спасибо большое за твою помощь. Вопросов больше нет.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0446 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.