Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Мануал Игра "Ним"

Статус
В этой теме нельзя размещать новые ответы.

Mathian

Лев Попов
Пользователь
Регистрация
3 Фев 2013
Сообщения
3,003
Лучшие ответы
6
Репутация
813
Награды
2
Всем Хай!
Время сдачи работ на конкурс подошло к концу и я наконец могу опубликовать своё решение xD​

Суть игры: Два игрока, по очереди, берут спички от 1 до 5. Выигрывает тот, кто возьмёт последнюю спичку. Реализация игры с компьютером.
Выигрышная стратегия: Для того, чтобы выиграть - нужно отнимать остаток от деления на 6.

Команды реализованы на zcmd, следовательно вам нужно добавить эти Include'ы:
PHP:
#include <zcmd>
#include <sscanf2>
Далее, я замакросил ID диалога для более удобной работы:
PHP:
#define DialogID    1
Создаём переменную, в которой будут храниться наши спички:
PHP:
new Matches [MAX_PLAYERS];
Создаём команду для начала игры:
PHP:
CMD:matches(playerid, params[] )
{
    ShowPlayerDialog(playerid, DialogID, DIALOG_STYLE_INPUT, "Ним", "Введите кол-во спичек:", "V", "X");
    return true;
}
И в public OnDialogResponse:
PHP:
    if(dialogid == DialogID)//Юзайте switch, если оно требует. Тут просто 1 диалоги я заюзал так
    {
        new string[64];
     
        if(!response) return true;
        Matches[playerid] = strval(inputtext);//Устанавливаем количество спичек
        SendClientMessage(playerid, 0xFFFFFFAA, "Введите: /take [1-5]");
        format(string, sizeof string, "Количество спичек: %d", strval(inputtext));
        SendClientMessage(playerid, 0xFFFFFFAA, string);
        return true;
    }
И прописываем команду для того, чтобы взять спички:
PHP:
CMD:take(playerid, params[] )
{
    new string[64];

    //Ход Игрока
    if(Matches[playerid] == 0) return false;//Если не начали игру
    if(Matches[playerid] < params[0]) return false;//Если не указали количество спичек
    if(sscanf(params, "d", params[0])) return false;//Если в куче нет столько спичек
    if(params[0] > 5 || params[0] < 1) return SendClientMessage(playerid, 0xFFFFFFAA, "Ошибка: Количество спичек от 1 до 5");

    Matches[playerid] -= params[0];//Отнимаем указанное количество спичек
    if(Matches[playerid] == 0) return SendClientMessage(playerid, 0xFFFFFFAA, "Вы победили!");//Победа Игрока!

    //Ход Льва
    format(string, sizeof string, "Ход Льва | В куче осталось %d спичек", Matches[playerid]);
    SendClientMessage(playerid, 0xFFFFFFAA, string);

    new Lev = Matches[playerid] % 6; //Находим остаток от деления на 6 и забиваем в переменную
    if(Lev == 0) Matches[playerid] -= random(5);//Если остаток от деления на 6 = 0
    else Matches[playerid] -= Lev;//Если иначе, то отнимаем отстаток от деления на 6
    if(Matches[playerid] == 0) return SendClientMessage(playerid, 0xFFFFFFAA, "Победил Лев Попов!");//Победа Льва!

    //Оповещаем Игрока об его ходе
    format(string, sizeof string, "Ваш ход | В куче осталось %d спичек", Matches[playerid]);
    SendClientMessage(playerid, 0xFFFFFFAA, string);
    return true;
}
PHP:
#include <a_samp>
#include <a_samp>
#include <zcmd>
#include <sscanf2>

#define DialogID    1

new Matches[MAX_PLAYERS];

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[] )
{
    if(dialogid == DialogID)//Юзайте switch, если оно требует. Тут просто 1 диалоги я заюзал так
    {
        new string[64];
     
        if(!response) return true;
        Matches[playerid] = strval(inputtext);//Устанавливаем количество спичек
        SendClientMessage(playerid, 0xFFFFFFAA, "Введите: /take [1-5]");
        format(string, sizeof string, "Количество спичек: %d", strval(inputtext));
        SendClientMessage(playerid, 0xFFFFFFAA, string);
        return true;
    }
    return true;
}

CMD:matches(playerid, params[] )
{
    ShowPlayerDialog(playerid, DialogID, DIALOG_STYLE_INPUT, "Ним", "Введите кол-во спичек:", "V", "X");
    return true;
}

CMD:take(playerid, params[] )
{
    new string[64];

    //Ход Игрока
    if(Matches[playerid] == 0) return false;//Если не начали игру
    if(Matches[playerid] < params[0]) return false;//Если не указали количество спичек
    if(sscanf(params, "d", params[0])) return false;//Если в куче нет столько спичек
    if(params[0] > 5 || params[0] < 1) return SendClientMessage(playerid, 0xFFFFFFAA, "Ошибка: Количество спичек от 1 до 5");

    Matches[playerid] -= params[0];//Отнимаем указанное количество спичек
    if(Matches[playerid] == 0) return SendClientMessage(playerid, 0xFFFFFFAA, "Вы победили!");//Победа Игрока!

    //Ход Льва
    format(string, sizeof string, "Ход Льва | В куче осталось %d спичек", Matches[playerid]);
    SendClientMessage(playerid, 0xFFFFFFAA, string);

    new Lev = Matches[playerid] % 6; //Находим остаток от деления на 6 и забиваем в переменную
    if(Lev == 0) Matches[playerid] -= random(5);//Если остаток от деления на 6 = 0
    else Matches[playerid] -= Lev;//Если иначе, то отнимаем отстаток от деления на 6
    if(Matches[playerid] == 0) return SendClientMessage(playerid, 0xFFFFFFAA, "Победил Лев Попов!");//Победа Льва!

    //Оповещаем Игрока об его ходе
    format(string, sizeof string, "Ваш ход | В куче осталось %d спичек", Matches[playerid]);
    SendClientMessage(playerid, 0xFFFFFFAA, string);
    return true;
}

Подобную игру я, около года назад, писал на C#, там совсем немного другая реализация, если желаете глянуть, то:
PHP:
using System;
using System.Windows.Forms;

namespace Matches
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        int player = 0;

        private void button2_Click(object sender, EventArgs e)
        {                               
            Kol.Text = Spi4ki.Text;
            Hod.Text = "Ходит: Игрок";
            player = 1;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            int Conv = Convert.ToInt32(Kol.Text);
            if (player == 1)
            {
                Kol.Text = Convert.ToString(Conv - 1);
                Chel();
            }
        }
        private void button3_Click(object sender, EventArgs e)
        {
            int Conv = Convert.ToInt32(Kol.Text);
            if (player == 1)
            {
                Kol.Text = Convert.ToString(Conv - 2);
                Chel();
            }
        }
        private void button4_Click(object sender, EventArgs e)
        {
            int Conv = Convert.ToInt32(Kol.Text);
            if (player == 1)
            {
                Kol.Text = Convert.ToString(Conv - 3);
                Chel();
            }
        }
        private void button5_Click(object sender, EventArgs e)
        {
            int Conv = Convert.ToInt32(Kol.Text);
            if (player == 1)
            {
                Kol.Text = Convert.ToString(Conv - 4);
                Chel(); 
            }
        }
        private void button6_Click(object sender, EventArgs e)
        {
            int Conv = Convert.ToInt32(Kol.Text);
            if (player == 1)
            {
                Kol.Text = Convert.ToString(Conv - 5);
                Chel(); 
            }
        }
        private void Prog()
        {
            timer1.Stop();
            player = 1;
            if (Convert.ToInt32(Kol.Text) <= 0) MessageBox.Show("Победил Lev_Popov!");
            Hod.Text = "Ходит: Игрок";         
        }
        private void Chel()
        {
            timer1.Start();
            player = 2;
            if (Convert.ToInt32(Kol.Text) == 0) MessageBox.Show("Вы победили!");          
            Hod.Text = "Ходит: Компьютер";       
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            int Conv = Convert.ToInt32(Kol.Text);
            if (player == 2)
            {
                double i = Convert.ToDouble(Kol.Text);
                double h = i % 6;
                if (Convert.ToDouble(h) == 0)
                {
                    Random r = new Random();
                    int a = r.Next(1, 5);
                    Kol.Text = Convert.ToString(Conv - Convert.ToInt32(a.ToString()));
                    Prog();
                }
                else
                {
                    Kol.Text = Convert.ToString(Conv - Convert.ToInt32(h));
                    Prog();
                }              
            }
        }
    }
}

Автор: Лев Попов
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу