Добавить использование шаблонов проектирования в игру "Пятнашки" - C#

Узнай цену своей работы

Формулировка задачи:

Есть реализация игры пятнашки, нужно сделать откат предыдущего хода, выбор уровня сложности (рохмир игрового поля 3х3, 4х4), с использованием паттернов Синглетон, Фабричный метод, Команда, Хранитель, помогите.
using System;
 
//Game.cs
namespace puzzle15
{
    class Points
    {
        public readonly int x, y;
        public Points(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
    }
    class Game
    {
        public int Length=0;
        const int nw = 4, height = 4;
        int[,] field = new int[nw, height];
        Points[] FieldValue = new Points[16];

        public Game(int[] point)
        { 
 
            int r = 0;
            string[] file = new string[4];
            Length = 16;
          
            mixer(point);
 
            for (int j = 0; j < height; j++)
            {
                for (int i = 0; i < nw; i++)
                {
                    field[j, i] = point[r];
                    FieldValue[point[r]] = new Points(j, i);
                    r++;
 
                }
            }
          
        }
 
        public void mixer(int[] p)
        {
 
            int tmp = 0;
 
            Random rnd = new Random();
 
            for (int i = 0; i < 16; i++)
            {
                bool isExist = false;
                do
                {
                    isExist = false;
                    tmp = rnd.Next(0, 16);
                    for (int j = 0; j < i; j++)
                    {
                        if (tmp == p[j]) { isExist = true; }
                    }
                }
                while (isExist);
                p[i] = tmp;
            }
        }
 
        private Points GetLocation(int value)
        {
 
            return FieldValue[value];
        }

        public void drawField()
        {
 
            Console.WriteLine("----------------------------");
            for (int i = 0; i < nw; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    Console.Write(field[i, j] + "\t");
 
                }
                Console.WriteLine();
 
            }
 
            Console.WriteLine("----------------------------");
 
        }
 
        public bool repeat(double Length,int[] point)
        {
 
            for (int i = 0; i < Length; ++i)
            {
                for (int y = i + 1; y < Length; ++y)
                {
                    if (point[i] == point[y])
                    {
                        Console.WriteLine(point[i] + " ==" + point[y]);
                        throw new ArgumentException("Numbers should not be repeated");
                    }

                }
            }
            return true;
        }
 
        public Boolean finish()
        {
            bool temp = false;
            int value = 1;
            for (int i = 0; i < nw; ++i)
            {
                for (int j = 0; j < height; ++j)
                {
                    if (field[i, j] == value)
                    {
 
                        temp = true;
                        ++value;
                        if (value == Length)
                        {
                            value = 0;
                        }
                    }
                    else
                    {
                        return false;
                    }
 
                }
 
            }      
            return temp;
 
        }
 
        public void Move(int value)
        {
 
            try
            {
            Console.WriteLine(value);
            if (value > 15 || value < 0)
            {
                throw new ArgumentException();
            }
 
            int x = GetLocation(0).x;
            int y = GetLocation(0).y;
 
            int ValueX = GetLocation(value).x;
            int ValueY = GetLocation(value).y;
 
                if ((ValueX == x && (ValueY == y - 1 || ValueY == y + 1))||(ValueY == y && (ValueX == x - 1 || ValueX == x + 1)))
                {
 
                    field[x, y] = value;
                    field[ValueX, ValueY] = 0;
 
                    var vere = FieldValue[0];
                    FieldValue[0] = FieldValue[value];
                    FieldValue[value] = vere;
                }
 
            }
 
            catch (ArgumentException)
            {
                Console.WriteLine("There is no such number, try again: ");
            }
            catch (Exception)
            {
                Console.WriteLine("Next to this number is not 0, try again: ");
            }
            
        }
      
    }

    //--------------------------------------------------------------------------------------------------------------------------------------------------------

    class Points2
    {
       ..............................................................................................
    }
    class Game2
    {
        public int Length = 0;
        const int nw = 3, height = 3;
        int[,] field = new int[nw, height];
        Points[] FieldValue = new Points[9];

        public Game2(int[] point)
        {
 
            int r = 0;
            string[] file = new string[3];
            Length = 9;
 
            mixer(point);
 
            for (int j = 0; j < height; j++)
            {
                for (int i = 0; i < nw; i++)
                {
                    field[j, i] = point[r];
                    FieldValue[point[r]] = new Points(j, i);
                    r++;
 
                }
            }
 
        }
 
       .................................................................................................
 
    }
 
}

//Program.cs
using System;
using System.Collections.Generic;

namespace puzzle15
...............................................................................................
 
//вот код начало хранителя
    class GameHistory
    {
        public Stack<Game> History { get; private set; }
        public GameHistory()
        {
            History = new Stack<Game>();
        }
    }

}

Решение задачи: «Добавить использование шаблонов проектирования в игру "Пятнашки"»

textual
Листинг программы
//Program.cs
using System;
 
namespace _15puzzle
{
    class Program
    {
        static void Main(string[] args)
        {
            int i;
            int[] p = new int[100];
 
            for (i = 0; i < 16; i++)
            {
                p[i] = i + 1;
            }
 
            p[15] = 0;
 
 
            Console.WriteLine("15 puzzle");
      
 
         
 
            Game MyGame = new Game(p);
            int score = 0;
          
            MyGame.mixer(p);
 
            for (; ; )
            {
                MyGame.drawField();
               
                Console.WriteLine("Select number: ");
 
                int a=Convert.ToInt32(Console.ReadLine());
 
               MyGame.Move(a);
 
                if (MyGame.finish())
                {
                    MyGame.drawField();
                    Console.WriteLine("Winner!");
                    Console.WriteLine("Game end");
                    break;
                }
                score++;
 
                Console.WriteLine("Count: " + score);
 
             
            }
        }
 
        
    }
}
 
//Game.cs
 
using System;
using System.IO;
 
namespace _15puzzle
{
    class Game
    {
    
        int[] point=new int[100];
        public int Length=0;
 
        public static int[] ArrayText=new int [100];
        const int nw = 4, height = 4;
        int[,] field = new int[nw, height];
        Points[] FieldValue = new Points[100];
         
 
        public Game(int[] point)
        {
            int ruru = 0;
            string[] file = new string[4];
           Length = TextSCV();
          
            mixer(ArrayText);
 
            for (int j = 0; j < height; j++)
            {
                for (int i = 0; i < nw; i++)
                {
                    field[j, i] = ArrayText[ruru];
                    FieldValue[ArrayText[ruru]] = new Points(j, i);
                    ruru++;
 
                }
            }
          
        }
 
        public void mixer(int[] p)
        {
 
            int tmp = 0;
 
            Random rnd = new Random();
 
            for (int i = 0; i < 16; i++)
            {
                bool isExist = false;
                do
                {
                    isExist = false;
                    tmp = rnd.Next(0, 16);
                    for (int j = 0; j < i; j++)
                    {
                        if (tmp == p[j]) { isExist = true; }
                    }
                }
                while (isExist);
                p[i] = tmp;
            }
        }
 
        public int this[int x, int y]
        {      
            get
            {
                return field[x, y];
            }
            set
            {
                field[x, y] = value;
            }
        }
 
 
        private Points GetLocation(int value)
        {
 
            return FieldValue[value];
        }
 
 
        public void drawField()
        {
 
            Console.Write("~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + "\n");
            for (int i = 0; i < nw; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    Console.Write(field[i, j] + "\t");
 
                }
                Console.WriteLine();
 
            }
 
            Console.Write("~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + "\n");
 
        }
 
        public bool repeat(double Length,int[] ArrayText)
        {
 
            for (int i = 0; i < Length; ++i)
            {
                for (int y = i + 1; y < Length; ++y)
                {
                    if (ArrayText[i] == ArrayText[y])
                    {
                        Console.WriteLine(ArrayText[i] + " ==" + ArrayText[y]);
                        throw new ArgumentException("Number not repet! ");
                    }
 
 
                }
            }
            return true;
        }
 
        public Boolean finish()
        {
            bool temp = false;
            int value = 1;
            for (int i = 0; i < nw; ++i)
            {
                for (int j = 0; j < height; ++j)
                {
                    if (field[i, j] == value)
                    {
 
                        temp = true;
                        ++value;
                        if (value == Length)
                        {
                            value = 0;
                        }
                    }
                    else
                    {
                        return false;
                    }
 
                }
 
            }      
            return temp;
 
        }
 
        public void Move(int value)
        {
 
            try
            {
            Console.WriteLine(value);
            if (value > 15 || value < 0)
            {
                throw new ArgumentException();
            }
 
            int x = GetLocation(0).x;
            int y = GetLocation(0).y;
 
            int ValueX = GetLocation(value).x;
            int ValueY = GetLocation(value).y;
 
                if ((ValueX == x && (ValueY == y - 1 || ValueY == y + 1))||(ValueY == y && (ValueX == x - 1 || ValueX == x + 1)))
                {
 
                    field[x, y] = value;
                    field[ValueX, ValueY] = 0;
 
                    var vere = FieldValue[0];
                    FieldValue[0] = FieldValue[value];
                    FieldValue[value] = vere;
                }
 
                else
                {
                    throw new Exception();
                    //Console.WriteLine("Некуда двигать. ");
                }
            }
 
            catch (ArgumentException)
            {
                Console.WriteLine("Numer is not: ");
            }
            catch (Exception)
            {
                Console.WriteLine("Number: ");
            }
            
        }
 
        public static int TextSCV()
        {
            int ruru = 0;
           
                string[] text = File.ReadAllLines(@"text.csv");
                Char place = ' ';
              
                for (int i = 0; i < text.Length; ++i)
                {
                    string[] row = text[i].Split(place);
                    foreach (var substring in row)
                    {
                        ArrayText[ruru] = Convert.ToInt32(substring);
                        //Console.WriteLine(ArrayText[ruru]);
                        ++ruru;
                    }
                }
               
            
            return ruru;
        }
    }
}
 
//Point.cs
namespace _15puzzle
{
    class Points
    {
        public readonly int x, y;
        public Points(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.714 из 5
Похожие ответы