Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.12.2011, 16:59   #1
Jadik
Новичок
Джуниор
 
Регистрация: 24.12.2011
Сообщений: 1
Вопрос Пятнашки

Всем привет !! ))

Зацените код игры "пятнашки" ! ))

Код:
#include "stdafx.h"
#include <iostream>
#include <stdlib.h> 
#include <conio.h> 
#include <time.h>

using namespace std;

enum Direction {LEFT, UP, RIGHT, DOWN};

int Field[4][4];
int EmptyX, EmptyY;

void CreateField()
 {
 bool NumIsFree[15]; 
 int Nums[15]; 
 for (int i = 0; i < 15; i++) 
  NumIsFree[i] = true;
 srand(15); 
 bool Ok; 
 int RandNum; 
 for (int i = 0; i < 15; i++) 
  {
  Ok = false; 
  while (!Ok) 
   {
   RandNum = rand()%15+1; 
   if (NumIsFree[RandNum - 1]) 
    Ok = true; 
   }
  Nums[i] = RandNum; 
  NumIsFree[RandNum - 1] = false; 
  }
  int Chaos = 0; 
 int CurrNum; 
 for (int i = 0; i < 14; i++) 
  {
  CurrNum = Nums[i];
  for (int j = i + 1; j < 15; j++)
   if (CurrNum > Nums[j])
    Chaos++;
  }
 if (Chaos % 2 == 1) 
  { 
  int temp = Nums[13];
  Nums[13] = Nums[14];
  Nums[14] = temp;
  }
 for (int i = 0; i < 15; i++)
  Field[i % 4][i / 4] = Nums[i]; 
 Field[3][3] = 0;
 EmptyX = 3; EmptyY = 3;
 };

void DrawField() 
 {
 system("cls");
 for (int j = 0; j < 4; j++)
  {
  for (int i = 0; i < 4; i++) 
   {
   if (Field[i][j])
    std::cout << "++++";
   else
    std::cout << " ";
   }
  std::cout << '\n';
  for (int i = 0; i < 4; i++)
   {
   if (Field[i][j])
    {
    std::cout << "+";
    std::cout.width(2);
    std::cout << Field[i][j] << "+";
    }
   else
    std::cout << " ";
   }
  std::cout << '\n';
  for (int i = 0; i < 4; i++)
   {
   if (Field[i][j])
    std::cout << "++++";
   else
    std::cout << " " ;
   }
  std::cout << '\n';
  }
 }

void Move(Direction dir)
 {
 switch (dir)
  {
  case LEFT:
   {
   if (EmptyX < 3)
    {
    Field[EmptyX][EmptyY] = Field[EmptyX + 1][EmptyY];
    Field[EmptyX + 1][EmptyY] = 0;
    EmptyX++;
    }
   } break;
  case UP:
   {
   if (EmptyY < 3)
    {
    Field[EmptyX][EmptyY] = Field[EmptyX][EmptyY + 1];
    Field[EmptyX][EmptyY + 1] = 0;
    EmptyY++;
    }
   } break;
  case RIGHT:
   {
   if (EmptyX > 0)
    {
    Field[EmptyX][EmptyY] = Field[EmptyX - 1][EmptyY];
    Field[EmptyX - 1][EmptyY] = 0;
    EmptyX--;
    }
   } break;
  case DOWN:
   {
   if (EmptyY > 0)
    {
    Field[EmptyX][EmptyY] = Field[EmptyX][EmptyY - 1];
    Field[EmptyX][EmptyY - 1] = 0;
    EmptyY--;
    }
   } break;
  }
 }

bool FieldIsCorrect()
 {
 for (int i = 0; i < 15; i++)
  if (Field[i % 4][i / 4] != i + 1)
   return false;
 return true;
 }

int main()
{
CreateField();
DrawField();
char c;
while (!FieldIsCorrect())
{
c = getch();
switch(c)
{
case 75: Move(LEFT); break;
case 72: Move(UP); break;
case 77: Move(RIGHT); break;
case 80: Move(DOWN); break;
case 27: return 0;
}
DrawField();
}
std::cout << "\n\nCongratulations! Press Enter to exit!";
std::cin.get();
}

Все вроде как работает, но есть проблема. Когда нажимаешь влево или вправо, костяшка с числом передвигается не полностью. Не знаю как объяснить, откомпилируйте и и посмотрите (если не влом). Кто может помочь решить эту проблему ? ))

П.С. писал на Микрософт Визуал 2010
Jadik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
игра Пятнашки Lapo4ka Помощь студентам 0 01.05.2011 23:14
Пятнашки Kom43l_KoT Помощь студентам 0 28.09.2010 09:06
Пятнашки решение arccariy Фриланс 2 06.12.2009 21:10
Игра пятнашки... Мамука Общие вопросы .NET 0 03.11.2009 23:25
Delphi игра пятнашки rumf Помощь студентам 14 31.05.2008 00:56