Перейти к содержимому



Игра крестики нолики на большом поле


  • Авторизуйтесь для ответа в теме
В этой теме нет ответов

#1 admin

admin

    Администратор

  • Администраторы
  • 76 сообщений

Отправлено 01 Июнь 2013 - 10:38

Создайте консольное приложение в VC++, замените код шаблона на приведенный ниже
В данном примере играют 2 игрока на поле размером от 5 до 40, выигрышной считается комбинация из 5 крестиков или ноликов.

// xo_big.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
class player {
public:
int xplay;
int oplay;
int win;
char current;
char * name;
player()
{
  name = new char[50];
  memset(name,0,sizeof(char)*50);
  win = 0, xplay = 0, oplay = 0;
}
~player()
{
  delete name;
}
void player_win()
{
  win++;
}
int load(char * filename)
{
  if(!filename) return -1;
  FILE * f;
  errno_t err = fopen_s(&f,filename,"r");
  if(err)
   return err;
  fread(name,50,1,f);
  fread(&current,sizeof(char),1,f);
  fread(&win,sizeof(int),1,f);
  fread(&xplay,sizeof(int),1,f);
  fread(&oplay,sizeof(int),1,f);
  fclose(f);
}
int save(char * filename)
{
  if(!filename) return -1;
  FILE * f;
  errno_t err = fopen_s(&f,filename,"w");
  if(err)
   return err;
  fwrite(name,50,1,f);
  fwrite(&current,sizeof(char),1,f);
  fwrite(&win,sizeof(int),1,f);
  fwrite(&xplay,sizeof(int),1,f);
  fwrite(&oplay,sizeof(int),1,f);
  fclose(f);
}
};
class board {
char * field;
int size;
char get_field(int x, int y)
{
  if(x < 1 || x > size) return 0;
  if(y < 1 || y > size) return 0;
  return field[(y-1)*size+(x-1)];
}
int set_field(int x, int y, char value)
{
  if(x < 1 || x > size) return -1;
  if(y < 1 || y > size) return -1;
  field[(y-1)*size+(x-1)] = value;
  return 0;
}
public:
// constructor
board(int size)
{
  field = new char[size*size];
  this->size = size;
  memset(field,0,sizeof(char)*size*size);
}
// destructor
~board()
{
  delete field;
}
// reinitialize board
void restart()
{
  if( field )
  {
   delete field;
  }
  field = new char[size*size];
  memset(field,0,sizeof(char)*size*size);
}
// make a move
// x, y - the coordinates
// result: 0 - Ok, -1 - field is occupied, -2 out of range
int move(int x, int y, char value)
{
  if(x < 0 || x > size) return -2;
  if(y < 0 || y > size) return -2;
  if( get_field(x,y) == 0 )
   set_field(x,y,value);
  else
   return -1;
  return 0;
}
// check winnings
// result: 1 - win, 2 - board is full, nobody wins, 0 - no results
int checkwin(int x, int y, char value)
{
  int count = 0, vcount = 0, nc=0,sc=0,wc=0,ec=0,nwc=0,nec=0,swc=0,sec=0;
  int ncf=1,scf=1,wcf=1,ecf=1,nwcf=1,necf=1,swcf=1,secf=1;
  char cur_value;
  for( int i = 1; i <= size; i++ )
  { // count non-free cells
   for(int j = 1; j <= size; j++ )
   {
	cur_value = get_field(j,i);
	if( cur_value != 0 ) count++;
   }
  }
  for(int i = 1; i < 5; i++)
  {
   if( ecf && get_field(x+i,y) == value ) ec++; else ecf = 0;
   if( wcf && get_field(x-i,y) == value ) wc++; else wcf = 0;
   if( scf && get_field(x,y+i) == value ) sc++; else scf = 0;
   if( ncf && get_field(x,y-i) == value ) nc++; else ncf = 0;
   if( secf && get_field(x+i,y+i) == value ) sec++; else secf = 0;
   if( necf && get_field(x+i,y-i) == value ) nec++; else necf = 0;
   if( nwcf && get_field(x-i,y+i) == value ) nwc++; else nwcf = 0;
   if( swcf && get_field(x-i,y-i) == value ) swc++; else swcf = 0;
  }
  if( nc + sc == 4 || wc + ec == 4 || sec + nwc == 4 || nec + swc == 4 ) return 1;
  if(count == size*size) return 2;
  return 0;
}
// save game to file
// result: 0 - Ok, else errno
int save(char * filename, char * filename_p1, char * filename_p2, int p_num)
{
  FILE * f;
  errno_t err = fopen_s(&f,filename,"w");
  if(err)
   return err;
  fwrite(filename_p1,50,1,f);
  fwrite(filename_p2,50,1,f);
  fwrite(&size,sizeof(int),1,f);
  fwrite(&p_num,sizeof(int),1,f);
  fwrite(field,sizeof(char)*size*size,1,f);
  fclose(f);
  return 0;
}
// load game from file
// result: 0 - Ok, else errno
int load(char * filename, player *p1, player *p2, int * p_num)
{
  FILE * f;
  char filename_p1[50], filename_p2[50];
  errno_t err = fopen_s(&f,filename,"r");
  if(err)
   return err;
  fread(filename_p1,50,1,f);
  fread(filename_p2,50,1,f);
  fread(&size,sizeof(int),1,f);
  fread(p_num,sizeof(int),1,f);
  fread(field,sizeof(char)*size*size,1,f);
  fclose(f);
  err = p1->load(filename_p1);
  if(err)
   return err;
  err = p2->load(filename_p2);
  if(err)
   return err;
  return 0;
}
// print board
void print()
{
  int value;
  for( int i = 1; i <= size; i++ )
  {
   for( int j = 1; j <= size; j++ )
   {
	value = get_field(i,j);
	if( value != 0 )
	 printf("%c ",value);
	else
	 printf(". ");
   }
   printf("\n");
  }
}
};

player *player1 = NULL, *player2 = NULL;
int main(int argc, char ** argv)
{
setlocale(LC_ALL,"Russian");
char select, filename[50], tmp[50];
int stop, bsize, winp;
board *b = NULL;
while(1)
{
  int p_num = 0;
  system("cls");
  printf("1. Выбрать игроков\n");
  printf("2. Начать игру\n");
  printf("3. Загрузить игру\n");
  printf("4. Выход\n");
  select = getch();
  switch( select )
  {
   case '1':
	system("cls");
	cout << "1. Создать игрока №1" << endl;
	cout << "2. Загрузить игрока №1 из файла" << endl;
	cout << "3. Сохранить игрока №1 в файл" << endl;
	cout << "4. Создать игрока №2" << endl;
	cout << "5. Загрузить игрока №2 из файла" << endl;
	cout << "6. Сохранить игрока №2 в файл" << endl;
	cout << "7. Информация об игроках" << endl << endl;
	cout << "8. Вернуться в главное меню" << endl << endl;
	select = getch();
	switch(select)
	{
	 case '1':
	  if(player1 != NULL)
	  {
	   cout << "Игрок уже создан!!!" << endl;
	   cout << "Нажмите любую клавишу для продолжения..." << endl;
	   getch();
	   break;
	  }
	  player1 = new player();
	  printf("Введите имя игрока: ");
	  cin.getline(player1->name,50);
	  //setlocale(LC_ALL,"C");
	  //cout << player1->name;
	  //setlocale(LC_ALL,"Russian");
	  break;
	 case '2':
	  if(player1 == NULL) player1 = new player();
	  printf("Введите имя файла игрока №1: ");
	  cin.getline(filename,50);
	  if(player1->load(filename) != 0)
	  {
	   delete player1;
	   player1 = NULL;
	   cout << "Возникли проблемы при загрузке файла!" << endl;
	   cout << "Нажмите любую клавишу для продолжения..." << endl;
	   getch();
	  }
	  else
	  {
	   cout << "Файл успешно загружен." << endl;
	   cout << "Нажмите любую клавишу для продолжения..." << endl;
	   getch();
	  }
	  break;
	 case '3':
	  if(player1 == NULL)
	  {
	   cout << "Этот игрок еще не создан!!!" << endl;
	   cout << "Нажмите любую клавишу для продолжения..." << endl;
	   getch();
	   break;
	  }
	  printf("Введите имя файла игрока №1: ");
	  fflush(stdin);
	  cin.getline(filename,50);
	  if( player1->save(filename) != 0 )
		cout << "Возникли проблемы при записи файла!" << endl;
	  break;
	 case '6':
	  if(player2 == NULL)
	  {
	   cout << "Этот игрок еще не создан!!!" << endl;
	   cout << "Нажмите любую клавишу для продолжения..." << endl;
	   getch();
	   break;
	  }
	  printf("Введите имя файла игрока №2: ");
	  fflush(stdin);
	  cin.getline(filename,50);
	  if( player2->save(filename) != 0 )
		cout << "Возникли проблемы при записи файла!" << endl;
	  break;
	 case '4':
	  if(player2 != NULL)
	  {
	   cout << "Игрок уже создан!!!" << endl;
	   cout << "Нажмите любую клавишу для продолжения..." << endl;
	   getch();
	   break;
	  }
	  player2 = new player();
	  fflush(stdin);
	  printf("Введите имя игрока: ");
	  cin.getline(player2->name,50);
	  break;
	 case '5':
	  if(player2 == NULL) player2 = new player();
	  fflush(stdin);
	  printf("Введите имя файла игрока №2: ");
	  cin.getline(filename,50);
	  if(player2->load(filename) != 0)
	  {
	   delete player2;
	   player2 = NULL;
	   cout << "Возникли проблемы при загрузке файла!" << endl;
	   cout << "Нажмите любую клавишу для продолжения..." << endl;
	   getch();
	  }
	  else
	  {
	   cout << "Файл успешно загружен." << endl;
	   cout << "Нажмите любую клавишу для продолжения..." << endl;
	   getch();
	  }
	  break;
	 case '7':
	  system("cls");
	  cout << "Игрок 1: ";
	  if (player1 == NULL) cout << "Не задан" << endl;
	  else
	  {
	   setlocale(LC_ALL,"C");
	   cout << "\"" << player1->name << "\""<< endl;
	   setlocale(LC_ALL,"Russian");
	   cout << " Число побед: " << player1->win << endl;
	   cout << " Игр крестиками: " << player1->xplay << endl;
	   cout << " Игр ноликами: " << player1->oplay << endl;
	  }
	  cout << endl << "Игрок 2: ";
	  if (player2 == NULL) cout << "Не задан" << endl;
	  else
	  {
	   setlocale(LC_ALL,"C");
	   cout << "\"" << player2->name << "\""<< endl;
	   setlocale(LC_ALL,"Russian");
	   cout << " Число побед: " << player2->win << endl;
	   cout << " Игр крестиками: " << player2->xplay << endl;
	   cout << " Игр ноликами: " << player2->oplay << endl;
	  }
	  cout << endl << "Нажмите любую клавишу для продолжения..." << endl;
	  getch();
	  break;
	 case '8':
	  break;
	}
	break;
  
   case '3':
	fflush(stdin);
	cout << "Введите имя файла сохраненной игры: ";
	cin >> filename;
	if( b != NULL) delete b;
	b = new board(10);
	if(player1 == NULL) player1 = new player;
	if(player2 == NULL) player2 = new player;
	if( b->load(filename,player1,player2,&p_num) != 0 )
	{
	 cout << "Возникли проблемы при загрузке игры!!!" << endl;
	 cout << "Нажмите любую клавишу для продолжения." << endl;
	 if( player1 != NULL )
	 {
	  delete player1;
	  player1 = NULL;
	 }
	 if( player2 != NULL )
	 {
	  delete player2;
	  player2 = NULL;
	 }
	 if( b != NULL )
	 {
	  delete b;
	  b = NULL;
	 }
	 getch();
	 break;
	}
	cout << "Игра загружена из файла: " << filename << endl;
	cout << "Нажмите любую клавишу для начала игры." << endl;
	getch();
	fflush(stdin);
	// no break to start game
   // gameplay
   case '2':
	system("cls");
	if(player1 == NULL || player2 == NULL)
	{
	 cout << "Не заданы игроки!" << endl;
	 cout << "Нажмите любую клавишу для продолжения..." << endl;
	 getch();
	 break;
	}
	stop = 0;
	while( stop == 0 && p_num == 0 )
	{
	 do
	 {
	  cout << "Выберите размер поля (5 - 40)" << endl;
	  cin >> bsize;
	  if ( bsize < 5 || bsize > 40 )
	   cout << "Неверно задан размер поля" << endl;
	 }
	 while( bsize < 5 || bsize > 40 );

	 cout << "Игрок 1 выберите, чем будете ходить" << endl;
	 cout << " 1 - крестики" << endl;
	 cout << " 2 - нолики" << endl;
	 select = getch();
	 if(select == '1')
	 {
	  player1->current = 'X'; player1->xplay++;
	  player2->current = 'O'; player2->oplay++;
	  break;
	 }
	 if(select == '2')
	 {
	  player2->current = 'X'; player2->xplay++;
	  player1->current = 'O'; player1->oplay++;
	  break;
	 }
	}
	{
	 int x = 0,y = 0;
	 if(p_num == 0 && b != NULL)
	 {
	   delete b;
	   b = new board(bsize);
	 }
	 if( b == NULL) b = new board(bsize);
	 player *p_current = player1;
	 if( p_num == 0 )
	 {
	  p_num = 1;
	  if(p_current->current == 'O')
	  {
	   p_num = 2;
	   p_current = player2;
	  }
	 }
	 int win = 0, xwin, owin;
	 do
	 {
	  do
	  {
	   system("cls");
	   cout << "Игрок 1: ";
	   setlocale(LC_ALL,"C");
	   cout << "\"" << player1->name<< "\"";
	   setlocale(LC_ALL,"Russian");
	   cout << " [" << player1->current << "] Число побед: " << player1->win << endl;
	   cout << "Игрок 2: ";
	   setlocale(LC_ALL,"C");
	   cout << "\"" << player2->name<< "\"";
	   setlocale(LC_ALL,"Russian");
	   cout << " [" << player2->current << "] Число побед: " << player2->win << endl;
	   b->print();
	   cout << "Игрок " << p_num << " делайте ход (координаты клетки каждая в новой строке)" << endl;
	   cout << "q - выход, s - сохранить игру" << endl;
	   fflush(stdin);
	   cin.getline(tmp,50);
	   if(tmp[0] == 'q')
	   {
		stop = 1;
		break;
	   }
	   if( tmp[0] == 's')
	   {
		char f1[50],f2[50];
		cout << "Введите имя файла для сохранения игрока #1: ";
		cin >> f1;
		cout << "Введите имя файла для сохранения игрока #2: ";
		cin >> f2;
		cout << "Введите имя файла для сохранения игры: ";
		cin >> filename;

		b->save(filename,f1,f2,p_num);
		player1->save(f1);
		player2->save(f2);
		cout << "Игра сохранена в файл: " << filename << endl;
		cout << "Нажмите любую клавишу для продолжения игры." << endl;
		getch();
		continue;
	   }
	   y = atoi(tmp);
	   fflush(stdin);
	   cin.getline(tmp,50);
	   x = atoi(tmp);
	  } while(b->move(x,y,p_current->current));
	  if( stop == 0 )
	  {
	   win = b->checkwin(x,y,p_current->current);
	   if(win == 1)
	   {
		winp = p_num;
		p_current->win++;
	   }
	   if(p_num == 1)
	   {
		p_num = 2;
		p_current = player2;
	   }
	   else
	   {
		p_num = 1;
		p_current = player1;
	   }
	  }
	 } while( win == 0 && stop == 0 );
	
	 if( stop == 0 )
	 {
	  system("cls");
	  cout << "Игрок 1: ";
	  setlocale(LC_ALL,"C");
	  cout << "\"" << player1->name<< "\"";
	  setlocale(LC_ALL,"Russian");
	  cout << " [" << player1->current << "] Число побед: " << player1->win << endl;
	  cout << "Игрок 2: ";
	  setlocale(LC_ALL,"C");
	  cout << "\"" << player2->name<< "\"";
	  setlocale(LC_ALL,"Russian");
	  cout << " [" << player2->current << "] Число побед: " << player2->win << endl;
	  b->print();
	  if( win == 1)
	  {
	   cout << "Победил игрок № " << winp << "! Поздравляем!" << endl;
	  }
	  else
	  {
	   cout << "В этот раз получилась ничья. Попробуйте еще раз!" << endl;
	  }
	  cout << "Нажмите любую клавишу для продолжения..." << endl;
	  getch();
	 }
	 delete b;
	 b = NULL;
	}
   
	break;
   case '4':
	return 0;
  }
}

return 0;
}





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 скрытых пользователей

Рейтинг@Mail.ru