Страница 1 из 2

Крестики-нолики в С (без графики)

Добавлено: 19 фев 2010, 01:40
eva.t
Привет !
очень нужна ваша помощь... :confused:
я только начинаю учить С, но никак не могу закрыть сессию - учитель завалил меня на сложной проге - мол ты ее еще не смогла бы написать и дал мне задание на КРЕСТИКИ-НОЛИКИ...

вот часть варианта в с

Код:

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>

int a[3][3];

void print_field()
{
   int i, j;
   system("clear");
   printf("_______\n");
   for(i=0;i<3;i++)
   {
      for(j=0;j<3;j++)
      {
         printf("|");
         if (a[i][j] == 1) printf("X");
         else if (a[i][j] == -1) printf("0");
         else printf(" ");
      }
      printf("|\n_______\n");
   }
}

int test_for_win(int x,int y)
{
   if((a[y][0] == a[y][1]) && (a[y][1] == a[y][2]) && (a[y][0] != 0)) return 1;
   if((a[0][x] == a[1][x]) && (a[1][x] == a[2][x]) && (a[0][x] != 0)) return 1;
   if(((a[0][0] == a[1][1]) && (a[1][1] == a[2][2]) && (a[0][0] != 0) || ((a[0][2] == a[1][1]) && (a[1][1] == a[2][0]) && a[0][2] != 0))) return 1;
   return 0;
}

int main(int argc, char *argv[])
{
   int i, j, val, c;
   for(c =0;c<9;c++)
   {
      printf("Coordinates: ");
      scanf("%d %d", &i, &j);
      if (a[i-1][j-1] != 0) {printf("Already set. Retype.\n"); continue;}
      if(c % 2 == 0) a[i-1][j-1] = -1;
      else a[i-1][j-1] = 1;
      print_field();
      if (test_for_win(j-1, i-1))
      {
         exit(0);
      }
   }
   return 0;
}
но этого мало чтобы закрыть :(
нужно еще чтобы хотя бы вписывать игроков,чей счас ход и выписать победителя...

или счет игор

помогите пожалуйста !!!!!!! очень нужно только попроще если можно...

Re: Крестики-нолики в С (без графики)

Добавлено: 19 фев 2010, 11:31
Romeo
Если пришла на форум, чтобы сделали, значит прав, что не смогла бы написать :)

Давай начнём с простого. Добавить поддержку имён игроков. Считываем 2 имени в 2 глобальные переменные. Затем вводим флажок, указывающий первый игрок сейчас ходит или второй. На каждой итерации цикла флажок инвертируем и в зависимости от его значения выводим либо имя первого, либо второго игрока. Ещё есть рекомендация, делать clrscr перед каждой прорисовкой поля, так будет красивее.

Если возникнут проблемы при написании кода, обращайся - поможем.

Re: Крестики-нолики в С (без графики)

Добавлено: 19 фев 2010, 23:04
eva.t
ну да, я с этим согласна... но я приблизительно знаю что должно быть...но много ошибок... помощь очень нужна или совет

Спасибо, я вам буду очень благодарна...
так как подсказать даже что делать некому =((

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>

int a[3][3];

void pole ()
{
   int i, j;
   system (" ");
   printf("_______\n");
   for(i=0;i<3;i++)
   {
      for(j=0;j<3;j++)
      {
         printf("|");
         if (a[i][j] == 1) printf("X");
         else if (a[i][j] == -1) printf("0");
         else printf(" ");
      }
      printf("|\n_______\n");
   }
}

int test(int x,int y)

{
   if((a[y][0] == a[y][1]) && (a[y][1] == a[y][2]) && (a[y][0] != 0)) return 1;
   if((a[0][x] == a[1][x]) && (a[1][x] == a[2][x]) && (a[0][x] != 0)) return 1;
   if((((a[0][0] == a[1][1]) && (a[1][1] == a[2][2]) && (a[0][0] != 0)) || ((a[0][2] == a[1][1]) && (a[1][1] == a[2][0]) && a[0][2] != 0))) return 1;
   return 0;
}

int main(int argc, char *argv[])
{
  int i, j, krok=0;
  while( krok<9 )
   {
      if(krok % 2 == 0)
      printf ( " Pierwszy 0 ");
      else
      printf (" drugi X  ");
      printf("koordynaty: ");
      scanf("%d %d", &i, &j);
      if (a[i-1][j-1] != 0)
        {
            printf("Juz istnieje\n");
            continue;
        }
      if(krok % 2 == 0) a[i-1][j-1] = -1;
      else a[i-1][j-1] = 1;

      pole ();
      if (test(j-1, i-1))


      {
         exit(0);
      }
      krok++;
   }

   return 0;
}


так как мне нужно написать ее сложнее, хотя бы 5на5, а я пока 3на3 не могу исправить =((
подскажите...

например в этой проге есть ошибка - когда ввести координаты 1 4 она считает это как 2 1..как этого избежать?

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

эта прога немного отличаеться от предыдущей -потому что даже если координаты повторялись она считала это как шаг.. ошибка устранена :)


а с флажками я еще кажись не работала :confused: стыдно..даже очень.. возможно я знаю что это,но просто учусь в Польше, а там другой язык и че-то не понимаю... я здесь вообще одна и трудно =(((

я пока только простое написала, но еще не знаю куда и что вставить... возможно это дурацкий вопрос :(

Код: Выделить всё

int  x,o, krestik, nolik;
  printf ("imie pirwsze");
  scanf ("%d", &nolik);
  printf ("imie drugie");
  scanf ("%d", &krestik);
  x= krestik;
  o=nolik;

а потом где-то вставить

      if(krok % 2 == 0)
      printf ( " win ", o);
      else
      printf ("win  ", x);
вот мой ход мыслей - подскажите что не так =( или куда поставить это...

Re: Крестики-нолики в С (без графики)

Добавлено: 20 фев 2010, 00:35
eva.t
"я пока начала с простого без вчитывания, а пока просто чей ход - крестиков или ноликов.. как сделать чтобы выводило чья победа? я не могу понять куда поставить ..." это уже догадалась =))

нужно только с 1 4 и подобными выяснить... и с названиями игроков....

а потом и к 5на5 усложнить постараюсь - хочу хоть эту правильно дописать....

вот тот код,к которому я счас дошла

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>

int a[3][3];

void pole ()
{
   int i, j;
   system (" ");
   printf("_______\n");
   for(i=0;i<3;i++)
   {
      for(j=0;j<3;j++)
      {
         printf("|");
         if (a[i][j] == 1) printf("X");
         else if (a[i][j] == -1) printf("0");
         else printf(" ");
      }
      printf("|\n_______\n");
   }
}

int test(int x,int y)

{
   if((a[y][0] == a[y][1]) && (a[y][1] == a[y][2]) && (a[y][0] != 0)) return 1;
   if((a[0][x] == a[1][x]) && (a[1][x] == a[2][x]) && (a[0][x] != 0)) return 1;
   if((((a[0][0] == a[1][1]) && (a[1][1] == a[2][2]) && (a[0][0] != 0)) || ((a[0][2] == a[1][1]) && (a[1][1] == a[2][0]) && a[0][2] != 0))) return 1;
   return 0;
}

int main(int argc, char *argv[])
{
  int i, j, krok=0;
  while( krok<9 )
   {
      if(krok % 2 == 0)
      printf ( " Pierwszy 0 ");
      else
      printf (" drugi X  ");
      printf("koordynaty: ");
      scanf("%d %d", &i, &j);
      if (a[i-1][j-1] != 0)
        {
            printf("Juz istnieje\n");
            continue;
        }
      if(krok % 2 == 0) a[i-1][j-1] = -1;
      else a[i-1][j-1] = 1;

      pole ();
      if (test(j-1, i-1))
      {
            if(krok % 2 == 0)
            { printf ( "___________________\n");
             printf ("  ||  WIN O !!! ||\n");
             printf ( "___________________");}
            else
                { printf ( "___________________\n");
                 printf ("||  WIN X !!! ||");
                 printf ( "___________________\n");}
          { exit(0);}
      }

      krok++;

   }
   return 0;
}

Re: Крестики-нолики в С (без графики)

Добавлено: 20 фев 2010, 00:50
Romeo
На самом деле тут не обязательно вводить флажок, так как определить чей сейчас ход можно проще, используя конструкцию if (krok %2 == 0).

Для того, чтобы появилась поддержка имён нужно сделать следующее:

Код: Выделить всё

int main(int  argc, char *argv[])
{
  char krestik_name[16];
  char nolik_name[16];
  int i, j, krok = 0;

  printf("wprowadz nazwe gracza krzyze: ");
  scanf("%s", krestik_name);
  
  printf("wprowadz nazwe gry palec: ");
  scanf("%s", nolik_name);

  while (krok < 9)
  {
     printf("teraz przychodzi \"%s\"\n", krok % 2 == 0 ? nolik_name : krestik_name);
     printf("koordynaty: ");
     scanf("%d %d", &i, &j);
     if (a[i-1][j-1] != 0)
     {
         printf("Juz istnieje\n");
         continue;
     }

     if (krok % 2 == 0)
        a[i-1][j-1] = -1;
     else
        a[i-1][j-1] = 1;

     pole();

     if (test(j-1, i-1))
     {
        printf("wygrałem odtwarzacz \"%s\"\n", krok % 2 == 0 ? nolik_name : krestik_name);
        break;
     }

     ++krok;
  }

  return 0;
}
P.S. Прошу не бить за мой польский :)

Re: Крестики-нолики в С (без графики)

Добавлено: 20 фев 2010, 01:30
eva.t
Спасибо большое =)) :)
а ты знаешь польcкий ?

а как удалить эту проблемку, если например вводишь 1 4 (такой координаты нет) то считает как 2 1.. , 1 6 как 2 2 и т.д. ??
или это нельзя сделать ?

Re: Крестики-нолики в С (без графики)

Добавлено: 20 фев 2010, 04:13
eva.t
Я вот решила попробовать написать эту прогу на 10...
но меня кажись ошибка и функцыи "тест"
помоги найти, плиз =(

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>

int a[10][10];

void pole ()
{
   int k, s;
   system (" ");
   printf("_____________________\n");
   for(k=0;k<10;k++)
   {
      for(s=0;s<10;s++)
      {
         printf("|");
         if (a[k][s] == 1) printf("X");
         else if (a[k][s] == -1) printf("0");
         else printf(" ");
      }
      printf("|\n_____________________\n");
   }
}

int test(int x,int y)

{  int i,j;
   if((a[y][j] == a[y][j+1]) && (a[y][j+1] == a[y][j+2]) && (a[y][j+2] == a[y][j+3]) && (a[y][j+3] == a[y][j+4])&&(a[y][j] != 0)) return 1;
   if((a[i][x] == a[i+1][x]) && (a[i+1][x] == a[i+2][x]) &&(a[i+2][x] == a[i+3][x]) && (a[i+3][x] == a[i+4][x]) &&  (a[i][x] != 0)) return 1;
   if((((a[i][j] == a[i+1][j+1])&&(a[i+1][j+1] == a[i+2][j+2])&&(a[i+2][j+2] == a[i+3][j+3])&&(a[i+3][j+3] == a[i+4][j+4])&&(a[i][j] != 0)))||((a[i][j+4] == a[i+1][j+3]) && (a[i+1][j+3] == a[i+2][j+2]) &&(a[i+2][j+2] == a[i+3][j+1]) && (a[i+3][j+1] == a[i][j+4]) && a[i][j+4] != 0)) return 1;
   return 0;
}

int main(int argc, char *argv[])
{
  char krestik_name[16];
  char nolik_name[16];
  int k, s, krok = 0;

  printf("wprowadz nazwe gracza krzyze: ");
  scanf("%s", krestik_name);

  printf("wprowadz nazwe gry kolko: ");
  scanf("%s", nolik_name);

  while( krok<100 )
   {
      if(krok % 2 == 0)
      printf ( "%s\n",nolik_name);
      else
      printf ("%s\n",krestik_name);
      printf("koordynaty: ");
      scanf("%d %d", &k, &s);
      if (a[k-1][s-1] != 0)
        {
            printf("Juz istnieje\n");
            continue;
        }
      if(krok % 2 == 0) a[k-1][s-1] = -1;
      else a[k-1][s-1] = 1;

      pole ();
      if (test(k-1, s-1))
      {
            if(krok % 2 == 0)
              {printf ( "___________________\n");
               printf ( "WIN____%s\n" ,nolik_name);
               printf ( "___________________\n");}
            else
               {printf ( "___________________\n");
                printf ("WIN_____%s\n",krestik_name);
                printf ( "___________________\n");}

          break;
      }

      krok++;

   }
   return 0;
}

Re: Крестики-нолики в С (без графики)

Добавлено: 20 фев 2010, 11:39
Romeo
eva.t писал(а): а как удалить эту проблемку, если например вводишь 1 4 (такой координаты нет) то считает как 2 1.. , 1 6 как 2 2 и т.д. ??
После того, как игрок ввёл координаты, нужно просто проверить, что координаты верные:

Код: Выделить всё

printf("koordynaty: ")]

Функцию test сейчас нет времени посмотреть. Вечером отвечу.

P.S. Нет, польский не знаю. Знаю украинский, который ближе к польскому, чем русский, плюс умею пользоваться переводчиком :)

Re: Крестики-нолики в С (без графики)

Добавлено: 20 фев 2010, 12:40
rrrFer

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
int check(int **a,int n){
	int i,j,g,v,d1,d2;
	for(i=0;i<n;i++){
		g=a[i][0];
		v=a[0][i];
		for(j=0;j<n;j++)
			if(a[i][j]!=g||g==' '){
				g=' ';
				break;
			}
		for(j=0;j<n;j++)
			if(a[j][i]!=v||v==' '){
				v=' ';
				break;
			}
		if(g!=' ')
			return g;
		if(v!=' ')
			return v;
	}
	d1=a[0][0];
	d2=a[n-1][n-1];
	for(i=0;i<n;i++)
		if(a[i][i]!=d1){
			d1=' ';
			break;
		}
	if(d1!=' ')
		return d1;
	for(i=0;i<n;i++)
		if(a[n-i-1][n-1-i]!=d2){
			d2=' ';
			break;
		}
	if(d2!=' ')
		return d2;
	return ' ';
}
void out(int **a,int n){
	int i,j;
	system("cls");
	for(j=0;j<n;j++)
		printf("--");
	printf("-\n");
	for(i=0;i<n;i++){
		for(j=0;j<n;j++)
			printf("|%c",a[i][j]);
		printf("|\n");
		for(j=0;j<n;j++)
			printf("--");
		printf("-\n");
	}
}
int main(){
	int **a,i,j,pl,n;
	printf("size of ground: ");
	scanf("%d",&n);
	a=new int*[n];
	for(i=0;i<n;i++){
		a[i]=new int[n];
		for(j=0;j<=n;j++)
			a[i][j]=' ';
	}
	for(pl=0;;pl=!pl){
		do{
			out(a,n);
			printf("\n%s player:\n",pl?"second":"first");
			printf("X>0,X<=%d: ",n); scanf("%d",&i);
			printf("Y>0,Y<=%d: ",n); scanf("%d",&j);
		}while(i>n||j>n||i<0||j<0||a[i-1][j-1]!=' ');
		a[i-1][j-1]=pl?111:120;
		i=check(a,n);
		if(i!=' '){
			out(a,n);
			printf("\n%s player win:\n",i==111?"second":"first");
			system("pause");
			break;
		}
	}
	return 0;
}
не придумал как првоерку проще сделать

Re: Крестики-нолики в С (без графики)

Добавлено: 21 фев 2010, 13:02
Romeo
Проще не получится.