LINUX.ORG.RU

Игра Ним (С++)


0

0

здравствуйте, все обыскал, нет нигде коды игры на С++ под линукс. вобщем задание такое. Дано n кучек, в которых находится отличное от 0 количество элементов. За один ход разрешается забрать любое не равное 0 кол-во элементов из любой кучки. Выйгрывает тот, кто заберет содержимое последней кучки. В сети полно кодов этой программы для ТурбоПаскаля и делфи, но нету вообще для с++(во всяком случае часы поисков не дали результатов) Если кто может просьба помочь!


Забанили в поисковиках?

http://www.dreamincode.net/forums/showtopic36839.htm

#include <iostream>
#include <string>
#include <time.h>

using namespace std;

int compChoose(int stones);
int userChoose(int stones);
int random()
{
    int random;
    random=(rand()%(3-1+1)+1);
    return random;
}
void Intructions()
{
                cout << "\t\tThis Program plays the game of Nim with the user \n\n";
                cout << "\t\tThe user starts first by entering the number of stones\n";
                cout << "\t\tthey wish to takes away (Between 1 and 3)\n";   //Instructions
                cout << "\t\tThen the computer will take away another amount between 1 and 3\n";
                cout << "\t\tWho ever is the last player to take the last stone loses\n";
                cout << "\t\t\t\t\tENJOY!\n\n\n";
}
int compChoose(int stones)
  //Returns a random number between 1 and 3 representing the computer's choice
{
  int choice; //Represents computer's choice
  do {
    choice = (random() % 3) + 1;
  } while (stones - choice < 1);
  return choice;
}    
int main ()
{
     srand((unsigned)time(NULL));
    //Game of nim.

    cout << "\t\t*****************************************\n\n";
    cout << "\t\t\t\tN I M ! ! ! !\n";                //Title      
    cout << "\t\t*****************************************\n\n";
   
 Intructions();

 bool winner = false;  //Variable indicates when we have a winner
  int computeChoose; //Variable represents the computer's choice
  int stones = (rand()%(30-15+1)+15);  //Varriable represents the number of stones left
  //Welcome player to game
  cout << "\t\tWelcome to the game of Nim.  There are " << stones <<" stones."<< endl;;

  while (!winner)
  {

    cout <<"\t\tEnter how many you would like to take away: "<< endl;
    //User makes a choice
    stones -= userChoose(stones);
    cout <<"\t\tThe number of stones left is " << stones << ".\n\n" << endl;
    if (stones == 1)
    {
      winner = true;
      cout << "\t\t\t\tYou win!" << endl;
    }
    else
    {
      //Computer's turn
      computeChoose = compChoose(stones);
      stones -= computeChoose;
      cout << "\t\tComputer chooses " << computeChoose << endl;
      cout << "\t\tThe number of stones left is " << stones << ".\n\n" << endl;
      if (stones == 1)
      {
    winner = true;
        cout << "\t\t\tComputer wins" << endl;
      }
    }
  }
}
int userChoose(int stones)
{
  //Interacts with the user, allowing a choice for the game of Nim
  int choice;
  cout << "\t\t\t\t\t";
  cin >> choice;
  //Loop until a proper choice is made
  while (choice <1 || choice > 3 || stones - choice <= 0)
  {
    if (choice < 1 || choice > 3) //Can only choose between 1 and 3
    {
      cout << "\t\aYour choice must be between 1 and 3" << endl;
      cout << "\t\tEnter another choice: " << endl;
      cout << "\t\t\t\t\t";
      cin >> choice;
    }
    else if (stones - choice <= 1) //User has taken too many markers
      {
    cout << "\tYou must leave at least one stone" << endl;
        cout << "\t\tEnter another choice: " << endl;
        cout << "\t\t\t\t\t";
        cin >>  choice;
      }
    return choice;
  }
    return choice;
}

anonymous
()
Ответ на: комментарий от anonymous

А вот не дал бы ты ему ссылку, глядишь он может чему-то и научился бы. Ну или не научился. Одним было-программером стало бы меньше в любом случае.

eugene2k
()
Ответ на: комментарий от jtootf

/*Странно но этой ссылки в яндексе не было на ближайших 5-ти страницах.*/ jtootf Возможно ты и прав. Но есть одно «маленекое» НО: Наш препод на лекциях ниче не делает, кроме как на доске строчит свои программы(в 90% случаях с большим >5 количеством ошибок) При этом обьясняя например, что в наследовании классов родительский не может использовать методы порожденного, а рожденные классы могут использовать все, что есть в родительском. Вот и так уже почти полтора года, тупо тексты программ и микро-описание. Так с самого начала, на нашем курсе только 3 человека понимают С++ Это те люди, которые не ходят не его лекции. А учат С++ самостоятельно, но он их по-жестокому грузит... Вот такая ситуация.

noob
() автор топика
Ответ на: комментарий от anonymous

А тебе огромное спасибо, буду разбираться теперь как объяснять каждый шаг теоретически.

noob
() автор топика
Ответ на: комментарий от noob

на нашем курсе только 3 человека понимают С++ Это те люди, которые не ходят не его лекции. А учат С++ самостоятельно, но он их по-жестокому грузит

и в чём проблема поступать так же?

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

Так же поступать надо было сразу, а не сейчас када уже опомнился. К сожалению изучить все полтора года С++ за месяц задача проблематичная =(

noob
() автор топика
Ответ на: комментарий от noob

Для С++ для любой архитектуры больше всего подходит книга автора языка «Язык программирования С++».

anonymous
()
Ответ на: комментарий от noob

Ну, скажем честно, я полагаю что при должном рвении за месяц можно изучить довольно много. Вопрос видимо в желании.

Legioner ★★★★★
()

Код на ТурбоПаскале есть в инете, зачем честным людям мозги парил? Пока переносил бы код на С++, язык как раз подучил...

Dikar ★★
()
Ответ на: комментарий от noob

> К сожалению изучить все полтора года С++ за месяц задача проблематичная =(
Если вас учат также как учили нас то тот объем материала можно освоить за неделю.

urxvt ★★★★★
()
(setf str1 "string")
(setf str2 "")
(loop for x from 1 to (str-length str1) do
     (setf str2 (sym-cat str2 (sub-string str1 x x))))
anonymous
()

>За один ход разрешается забрать любое не равное 0 кол-во элементов из любой кучки.

А эта задача вообще приведена в книжке Саттера в качестве примера.

ЗЫ: Уточнил. Нет, там «Быки и коровы».

Absurd ★★★
()
Ответ на: комментарий от noob

>К сожалению изучить все полтора года С++ за месяц задача проблематичная =(

Физру и иностранный язык за полторы недели подтянуть немного сложнее.

Absurd ★★★
()
Ответ на: комментарий от noob

>К сожалению изучить все полтора года С++ за месяц задача тривиальная

Captain Programmer fixing

redgremlin ★★★★★
()
Ответ на: комментарий от Dikar

ТурбоПаскаль не изучали вообще(в школе языков программирования не было)

noob
() автор топика

При произвольном числе куч правильных ход - число камней, которые надо оставить в куче - определяется XOR с остальными кучами.

int nim_ai_inexorable_move(int nheaps, int *heap)
{
	int i, j, wanted;
	for (i = 0; i < nheaps; i++)
	{
		wanted = 0;
		for (j = 0; j < i; j++)
			wanted ^= heap[j];

		for (j = i+1; j < nheaps; j++)
			wanted ^= heap[j];

		if (wanted < heap[i])
		{
			heap[i] = wanted;
			return i;
		}
	}
	return NIM_AI_ERR;
}
ip1981 ☆☆
()
Ответ на: комментарий от noob

>эту часть вставлять после using namespace std; ?

Ох...

anonymous
()
Ответ на: комментарий от dave

математика с дополнительной информатика

noob
() автор топика
Ответ на: комментарий от ip1981
{ 
  int choice; //Represents computer's choice 
  do { 
    choice = (random() % 3) + 1; 
  } while (stones - choice < 1); 
  return choice; 
}     

Вот эту часть заменить на это?

int nim_ai_inexorable_move(int nheaps, int *heap) 
{ 
   int i, j, wanted; 
   for (i = 0; i < nheaps; i++) 
   { 
      wanted = 0; 
      for (j = 0; j < i; j++) 
         wanted ^= heap[j]; 
 
      for (j = i+1; j < nheaps; j++) 
         wanted ^= heap[j]; 
 
      if (wanted < heap[i]) 
      { 
         heap[i] = wanted; 
         return i; 
      } 
   } 
   return NIM_AI_ERR; 
} 

noob
() автор топика

>Игра Ним (С++)

В своё время на калькуляторах программируемых любили эту задачку решать :) ... Там что-то на единицы десятков команд решение, ибо есть простая выигрышная стратегия :)

KRoN73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.