Привет, неизвестный путник!
Добро пожаловать в документацию по языку 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]);
}
Назад к индексу документации