www.boolean.name

www.boolean.name (http://forum.boolean.name/index.php)
-   MidletPascal (http://forum.boolean.name/forumdisplay.php?f=46)
-   -   Нужна в помощь в написании игры (http://forum.boolean.name/showthread.php?t=18246)

WildHash1 08.06.2013 12:25

Нужна в помощь в написании игры
 
Помогите пожалуйста написать игру "поле чудес" ...Но с минимум визуализацией...Можно чуть чуть графики...
Вопрос и ответ,которые уже заранее написанные в файле...

WildHash1 08.06.2013 18:16

Ответ: Нужна в помощь в написании игры
 
:( :SOS:

jimon 08.06.2013 18:59

Ответ: Нужна в помощь в написании игры
 
и чем же тебе помочь ?

_DARKSIDER_ 23.07.2013 11:33

Ответ: Нужна в помощь в написании игры
 
"Помогите сделать игру! От вас требуется всего лишь написать за меня весь код игры,а я в свою очередь отблагодарю вас обильным урожаем хрена."-вот так я понял смысл первого поста.

Stabilitron 29.07.2013 03:53

Ответ: Нужна в помощь в написании игры
 
билд https://dl.dropboxusercontent.com/u/...ldOfDreams.zip

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

В директории topics создаем xml-нички следующего вида:

Код:

<?xml version="1.0"?>
    <TaskDictionary xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Tasks>
        <Task Quastion="Дворцовый белый хлеб для царского стола в XV—XVII вв." Answer="басман" />
        <Task Quastion="Хлеб из пшеничной муки, обмазанный сметаной и маслом" Answer="шаньга" />
        <Task Quastion="В норвежской кухне так называется суп из пива" Answer="курут" />
  </Tasks>
</TaskDictionary>

Именем файла будем имя темы раунда. То есть можно создать несколько файлов, типа, "Музыка.xml", "Хлеб.xml" и тп. Содержимое можно дополнять, добавив, скажем, подсказки к вопросам по несколько штук илиеще что, типа, вводной фразы ведущего на всю тему.

Игра предложит игроку выбрать тему. После чего из темы будет выдран рандомный вопрос и показан игроку. Игрок крутит барабан энтером и вводит по одному символу, получая очки за открытые буквы. Целиком вводить слово нельзя. Проиграть нельзя. Уменьшить кол-во очков и всякие там банкроты отсутвтсуют так же. Дарить подарки Якубовичу нельзя.

Зато на каждое вращение барабана выводится вопрос, очки игрока и текущее состояние разгаданного слова вида "__р__о_а"

Все сплошным текстом сейчас, лучше разнести в своем проекте по раздельным файлам. В общем ковыряйся, задавай вопросы, переделывай под свое видение. ИИ нет, кстати, никакого.
Комментариев нет ибо на скору руку. Если будет непонятно совсем, на днях закомменчу или даже отрефакторю, но не обещаю ничего.

Инжой в общем.



Код:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml.Serialization;

namespace FieldOfDreams
{
    class Program
    {
        static Dictionary<string, int> _cylinder = new Dictionary<string, int>()
                                                      {
                                                          {"Сто очков", 100},
                                                          {"Пятьдесят очков", 50},
                                                          {"Двести очков", 200},
                                                      };

        static void Main(string[] args)
        {
            Player player = null;

            Console.WriteLine("Здравствуйте! Представьтесь :");

            while (player == null)
            {
                var name = Console.ReadLine();
                if (!string.IsNullOrEmpty(name))
                {
                    player = new Player(name);
                }
            }

            Console.Clear();
            Console.WriteLine("Выберите тему воросов:");
            var topics = new DirectoryInfo(@".\topics").GetFiles("*.xml");
            for (var i = 0; i < topics.Length; i++)
            {
                Console.WriteLine(string.Format("{0}) {1}", i + 1, Path.GetFileNameWithoutExtension(topics[i].FullName)));
            }

            FileInfo choosenTopic = null;

            while (choosenTopic == null)
            {
                string line = Console.ReadLine();
                int value;
                if (int.TryParse(line, out value) && value > 0 && value <= topics.Length)
                {
                    choosenTopic = topics[--value];
                }
                else
                {
                    Console.WriteLine(string.Format("Повторите выбор темы, значение должно быть в диапозоне от 1 до {0}", topics.Length));
                }
            }

            Console.Clear();
            Console.WriteLine(string.Format("Вы выбрали {0}", Path.GetFileNameWithoutExtension(choosenTopic.FullName)));
            var tasks = GetTasks(choosenTopic);

            var rnd = new Random();
            var r = rnd.Next(tasks.Tasks.Length);
           
            var round = new Round(){Task = tasks.Tasks[r]};

            Console.WriteLine(string.Format("Вопрос раунда {0}", round.Task.Quastion));

            while (!round.Result.HasValue)
            {
                Console.WriteLine("Вращайте барабан <Нажмите Enter>");

                Console.ReadKey();

                var keys = new List<string>(_cylinder.Keys);
                int size = _cylinder.Count;
                var rand = new Random();
               
                string randomKey = keys[rand.Next(size)];
                int diffScore = _cylinder[randomKey];


                Console.Clear();
                Console.WriteLine(string.Format("Вопрос: {0}", round.Task.Quastion));
                Console.WriteLine(string.Format("Слово: {0}", round.GetOpenSymbols()));
                Console.WriteLine(string.Format("Очки: {0}", player.Scores));

                Console.WriteLine(string.Format("Сектор \"{0}\" на барабане, назовите букву", randomKey));

                var playerSymbol = Console.ReadLine();
                if (!string.IsNullOrEmpty(playerSymbol) && playerSymbol.Length == 1)
                {
                    var symbol = playerSymbol.ToCharArray()[0];
                    if (!player.CheckSymbol(symbol))
                    {
                        Console.WriteLine("Вы уже называли эту букву.");
                    }
                    else
                    {
                        if (round.CheckSymbol(symbol))
                        {
                            Console.WriteLine("Вы угадали букву!");
                            player.Scores += diffScore;
                        }
                        else
                        {
                            Console.WriteLine("Вы не угадали букву!");
                        }
                    }
                   
                }
            }

            Console.WriteLine(string.Format("Игра окончена. Результат: вы {0}", round.Result.Value ? "победили" : "проиграли"));
            Console.ReadLine();
        }

        public static TaskDic GetTasks(FileInfo topic)
        {
            if (!topic.Exists)
            {
                return default(TaskDic);
            }

            var fs = new FileStream(topic.FullName, FileMode.Open);
            try
            {
                var sr = new XmlSerializer(typeof(TaskDic));
                return (TaskDic)sr.Deserialize(fs);
            }
            finally
            {
                fs.Close();
            }
        }
    }

    public class Player
    {
        public string Name { get; set; }
        private List<char> _usedSymbols= new List<char>();
        public int Scores;
       
        public Player(string name)
        {
            Name = name;
        }

        public bool CheckSymbol(char symbol)
        {
            if (_usedSymbols.Contains(symbol))
            {
                return false;
            }
            _usedSymbols.Add(symbol);
            return true;
        }
    }

    public class Round
    {
        public Task Task { get; set; }
        public List<KeyValuePair<int, char>> OpenSymbols = new List<KeyValuePair<int, char>>();
        public bool? Result;

        public bool CheckSymbol(char a)
        {
            var indexes = GetAllIndexesOf(a);
            foreach (var i in indexes)
            {
                OpenSymbols.Add(new KeyValuePair<int, char>(i, a));
            }

            if (OpenSymbols.Count == Task.Answer.Length)
            {
                Result = true;
            }

            return indexes.Count > 0;
        }

        private List<int> GetAllIndexesOf(char value)
        {
            var indexes = new List<int>();
            for (int index = 0; ; index += 1)
            {
                index = Task.Answer.IndexOf(value, index);
                if (index == -1)
                {
                    return indexes;
                }
                indexes.Add(index);
            }
        }

        public string GetOpenSymbols()
        {
            var strBuilder = new StringBuilder(Task.Answer.Aggregate("", (current, t) => current + "_"));

            foreach (var os in OpenSymbols)
            {
                strBuilder[os.Key] = os.Value;
            }

            return strBuilder.ToString();
        }
    }

    [XmlRootAttribute("TaskDictionary")]
    public class TaskDic
    {
        [XmlArrayAttribute("Tasks")]
        public Task[] Tasks;
    }

    public class Task
    {
        [XmlAttribute]
        public string Quastion { get; set; }
        [XmlAttribute]
        public string Answer { get; set; }

    }
}



Часовой пояс GMT +1, время: 13:41.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot