Привет, неизвестный путник!

Добро пожаловать в документацию по языку C#.NStar! Здесь вы найдете пример использования GUI-фреймворка в этом языке - игру "три в ряд".

using System;
using System.Collections;
using System.GUI;
using System.IO;
GUIWindow window = new();
ZoomBorder zb = new();
zb.ZoomSpeed = 1;
zb.HorizontalAlignment = null;
zb.VerticalAlignment = null;
window.Content = zb;
zb.AutoFit();
Grid grid = new();
zb.Child = grid;
grid.Width = grid.Height = 640;
grid.RowDefinitions = new();
for (int i in Chain(1, 20))
    grid.RowDefinitions.Add(new RowDefinition());
grid.ColumnDefinitions = new();
for (int i in Chain(1, 21))
    grid.ColumnDefinitions.Add(new ColumnDefinition(GridLength.Auto));
Bitmap blue = new(new MemoryStream(Convert.FromBase64String("iVBORw0KGgoAAAAN"
    + "SUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IB2cksfwAAAARnQU1BAACxj"
    + "wv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdw"
    + "nLpRPAAAAIdJREFUOMvtlUsOgDAIRBni/a88bmpiQSqCCxfOrqR95ZNOQVICATCRxe"
    + "ZtiWCE9kSYUITwd5mD6ihMUESEpnB1lLwmllYplqXS1WBpIx0Jm91Rctj3nNcy+kEJE"
    + "MljdvWRkfxmj3rVDWPSk+OhTJlKe86aTFKdt6NAuVjPnweDR54w//J3tANPb0YfKIcu"
    + "EgAAAABJRU5ErkJggg==")));
Bitmap gray = new(new MemoryStream(Convert.FromBase64String("iVBORw0KGgoAAAA"
    + "NSUhEUgAAABgAAAAYCAAAAADFHGIkAAAAAXNSR0IB2cksfwAAAARnQU1BAA"
    + "Cxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAA"
    + "BdwnLpRPAAAAGlJREFUKM+9krENwDAIBA8rg3l0NiMFNiIENylC5z89fgFirBIA4nm"
    + "FPDd2JpZlANQCSJI3GW+dKQ6q7mTQ1RRGYwBOjho0Jzs6fgGmbSj78kfXS41BQ9S8"
    + "VSWxqELSakFYw9TnMTTncwPqVSJlN76i9gAAAABJRU5ErkJggg==")));
Bitmap green = new(new MemoryStream(Convert.FromBase64String("iVBORw0KGgoAAAA"
    + "NSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IB2cksfwAAAARnQU1BAAC"
    + "xjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAAB"
    + "dwnLpRPAAAAINJREFUOMvt1TEOgDAIBVAgHpybf6dqQKkUHBxkbPQFaPLLACgoZ"
    + "nYnk4+3GaEhfRXZHUWEL/WWgZj5mQgsKSpEpGaJUlQullCzhiX1dmy1OzpWnLrsxIC"
    + "vdfRDCQhA99aUAHxzR63pRpjImXhaV8xoy1YUbGvWPGr946E3/2fDv/wc7ZGJS5Um"
    + "wiwdAAAAAElFTkSuQmCC")));
Bitmap red = new(new MemoryStream(Convert.FromBase64String("iVBORw0KGgoAAAAN"
    + "SUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IB2cksfwAAAARnQU1BAACxj"
    + "wv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABd"
    + "wnLpRPAAAAINJREFUOMvt1UsOgCAQA1DaeP8r14UJCeWTcWDhwi6JPhmJFZLKJA"
    + "BsZXHxtSA0p3sRtjQj/LbOoikKKM+TbHCaEo9ZzCm9xbKXajG9HQvLoYQOO6Ic29EP"
    + "BSBJ2D4ySd98RzvT1WJibTxsKM1oby0rSVq3I6UMOrtp+OEnHiz/9O/oBmlvRh8Oii5nA"
    + "AAAAElFTkSuQmCC")));
() Bitmap bitmaps = (gray, red, red, red, green, green, green, blue, blue, blue);
() int labels = (0, 1, 2, 3, 1, 2, 3, 1, 2, 3);
[object, int] points = new(10);
for (int i in Chain(1, 10))
    points.Add(i, labels[i]);
Canvas Function GetCanvas(int i)
{
    Canvas canvas = new();
    Image image = new();
    TextBlock tb = new();
    canvas.Width = image.Width = canvas.Height = image.Height = 24;
    image.Source = bitmaps[i];
    tb.Width = 12;
    tb.Height = 20;
    tb.Foreground = new SolidColorBrush(new Color(255, 255, 255, 255));
    tb.Text = "" + labels[i];
    tb.FontSize = 16;
    canvas.Children.Add(image);
    canvas.Children.Add(tb);
    Canvas.SetLeft(tb, 6);
    Canvas.SetTop(tb, 2);
    return canvas;
}
int score = 0;
int selectedI = -1;
int selectedJ = 0;
TextBlock scoreTB = new();
scoreTB.Width = 192;
scoreTB.Height = 32;
scoreTB.Text = "Score: 0";
scoreTB.FontSize = 16;
grid.Children.Add(scoreTB);
Grid.SetColumn(scoreTB, 21);
TextBlock endTB = new();
endTB.Width = 192;
endTB.Height = 32;
endTB.Text = "";
endTB.FontSize = 16;
grid.Children.Add(endTB);
Grid.SetColumn(endTB, 21);
Grid.SetRow(endTB, 2);
(2) Button buttons = new(20);
(2) int content = new(20);
for (int i in Chain(1, 20))
{
    () Button localButtons = new(20);
    () int localContent = new(20);
    for (int j in Chain(1, 20))
    {
        localButtons.Add(new Button());
        localButtons[j].Width = 32;
        localButtons[j].Height = 32;
        localButtons[j].Resources["ButtonBackgroundPointerOver".ToUnsafeString()]
            = localButtons[j].Background
            = new SolidColorBrush(new Color(255, 223, 223, 223));
        var i2 = i;
        var j2 = j;
        localButtons[j].Click += (s, e) => ButtonClick(i2, j2);
        grid.Children.Add(localButtons[j]);
        Grid.SetColumn(localButtons[j], j);
        Grid.SetRow(localButtons[j], i);
        localContent.Add(0);
        loop
        {
            localContent[j] = IntRandom(10);
        } while (j >= 3 && localContent[j - 1].Equals(localContent[j])
            && localContent[j - 2].Equals(localContent[j])
            || i >= 3 && content[i - 1, j].Equals(localContent[j])
            && content[i - 2, j].Equals(localContent[j]));
        localButtons[j].Content = GetCanvas(localContent[j]);
    }
    buttons.Add(localButtons);
    content.Add(localContent);
}
window.Show();
null Function ButtonClick(int i, int j)
{
    if (selectedI == i && selectedJ == j)
        return null;
    if (selectedI == -1)
        return Colorize();
    if (Abs(selectedI - i) + Abs(selectedJ - j) != 1)
        return Colorize(true);
    () int[2] toDelete = new();
    int power = CalculateMatches(toDelete, i, j, selectedI, selectedJ);
    int power2 = CalculateMatches(toDelete, selectedI, selectedJ, i, j);
    if (power == 0 && power2 == 0)
        return Colorize(true, true);
    var localScore = ((power != 0 ? points[content[selectedI, selectedJ]] << power - 2 : 0)
        + (power2 != 0 ? points[content[i, j]] << power2 - 2 : 0))
        << (power != 0 && power2 != 0 ? 1 : 0);
    var temp = content[selectedI, selectedJ];
    buttons[selectedI, selectedJ].Content = GetCanvas(content[selectedI, selectedJ] = content[i, j]);
    buttons[i, j].Content = GetCanvas(content[i, j] = temp);
    ListHashSet[int[2]] hs = new(toDelete);
    for (int[2] x in hs)
    {
        i = x[1];
        j = x[2];
        loop
        {
            content[i, j] = IntRandom(10);
        } while (IsMatch(i, j - 2, 0, 1) || IsMatch(i - 2, j, 1, 0)
            || IsMatch(i, j - 1, 0, 1) || IsMatch(i - 1, j, 1, 0)
            || IsMatch(i, j, 0, 1) || IsMatch(i, j, 1, 0));
        buttons[i, j].Content = GetCanvas(content[i, j]);
    }
    buttons[selectedI, selectedJ].Resources["ButtonBackgroundPointerOver".ToUnsafeString()]
        = buttons[selectedI, selectedJ].Background
        = new SolidColorBrush(new Color(255, 223, 223, 223));
    selectedI = -1;
    score += localScore;
    scoreTB.Text = "Score: " + score;
    for (int i2 in Chain(1, 19))
    {
        for (int j2 in Chain(1, 19))
        {
            power = CalculateMatches(toDelete, i2, j2, i2, j2 + 1)
                + CalculateMatches(toDelete, i2, j2 + 1, i2, j2)
                + CalculateMatches(toDelete, i2 + 1, j2, i2, j2)
                + CalculateMatches(toDelete, i2, j2, i2 + 1, j2);
            if (power != 0)
                return null;
        }
    }
    endTB.Text = "The end!";
    null Function Colorize(bool loopback = false, bool red = false)
    {
        if (loopback)
            buttons[selectedI, selectedJ].Resources["ButtonBackgroundPointerOver".ToUnsafeString()]
                = buttons[selectedI, selectedJ].Background
                = new SolidColorBrush(new Color(255, 223, 223, 223));
        buttons[selectedI = i, selectedJ = j].Resources["ButtonBackgroundPointerOver".ToUnsafeString()]
            = buttons[i, j].Background = new SolidColorBrush(new Color(255, 255, red ? 0 : 255, 0));
    }
}
int Function CalculateMatches(() int[2] toDelete, int i, int j, int selectedI, int selectedJ)
{
    int power = 0;
    null Function CalculateMatch(int di, int dj)
    {
        if (i >= 1 - di * 2 && j >= 1 - dj * 2 && i <= 20 - di * 2 && j <= 20 - dj * 2
            && (selectedI != i + di || selectedJ != j + dj)
            && content[selectedI, selectedJ].Equals(content[i + di * 2, j + dj * 2])
            && content[selectedI, selectedJ].Equals(content[i + di, j + dj]))
        {
            power += 2;
            toDelete.Add(((i, j), (i + di, j + dj), (i + di * 2, j + dj * 2)));
            if (i >= di + 1 && j >= dj + 1 && i <= di + 20 && j <= dj + 20
                && (selectedI != i - di || selectedJ != j - dj)
                && content[selectedI, selectedJ].Equals(content[i - di, j - dj])
                && !(i >= di * 2 + 1 && j >= dj * 2 + 1 && i <= di * 2 + 20 && j <= dj * 2 + 20
                && content[selectedI, selectedJ].Equals(content[i - di * 2, j - dj * 2])))
            {
                power++;
                toDelete.Add((i - di, j - dj));
            }
        }
    }
    CalculateMatch(1, 0);
    CalculateMatch(-1, 0);
    CalculateMatch(0, 1);
    CalculateMatch(0, -1);
    if (i >= 2 && i <= 19 && selectedI == i
        && content[selectedI, selectedJ].Equals(content[i - 1, j])
        && content[selectedI, selectedJ].Equals(content[i +1, j])
        && !(i >= 3 && content[selectedI, selectedJ].Equals(content[i - 2, j]))
        && !(i <= 18 && content[selectedI, selectedJ].Equals(content[i + 2, j])))
    {
        power += 2;
        toDelete.Add(((i, j), (i - 1, j), (i + 1, j)));
    }
    if (j >= 2 && j <= 19 && selectedJ == j
        && content[selectedI, selectedJ].Equals(content[i, j - 1])
        && content[selectedI, selectedJ].Equals(content[i, j + 1])
        && !(j >= 3 && content[selectedI, selectedJ].Equals(content[i, j - 2]))
        && !(j <= 18 && content[selectedI, selectedJ].Equals(content[i, j + 2])))
    {
        power += 2;
        toDelete.Add(((i, j), (i, j - 1), (i, j + 1)));
    }
    return power;
}
bool Function IsMatch(int i, int j, int di, int dj)
{
    return i >= 1 && j >= 1 && i <= 20 - di * 2 && j <= 20 - dj * 2
        && content[i + di, j + dj].Equals(content[i, j])
        && content[i + di * 2, j + dj * 2].Equals(content[i, j]);
}



Назад к индексу документации