Добавил форму-меню
This commit is contained in:
		
							parent
							
								
									2d28599940
								
							
						
					
					
						commit
						6256105b42
					
				
							
								
								
									
										17
									
								
								Core/Menu.cs
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								Core/Menu.cs
									
									
									
									
									
								
							| @ -10,12 +10,15 @@ namespace laba3.Core | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// TUI menu; |     /// TUI menu; | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     internal class Menu |     public class Menu | ||||||
|     { |     { | ||||||
|         private List<Option> options; |         private List<MenuOption> options; | ||||||
|         private int selected; |         private int selected; | ||||||
|         private string title; |         private string title; | ||||||
| 
 | 
 | ||||||
|  |         public List<MenuOption> GetOptions() { return options; } | ||||||
|  |         public string GetTitle() { return title; } | ||||||
|  |          | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Constructor of menu; |         /// Constructor of menu; | ||||||
|         /// </summary> |         /// </summary> | ||||||
| @ -23,7 +26,7 @@ namespace laba3.Core | |||||||
|         public Menu(string title) |         public Menu(string title) | ||||||
|         { |         { | ||||||
|             this.title = title; |             this.title = title; | ||||||
|             this.options = new List<Option> { }; |             this.options = new List<MenuOption> { }; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
| @ -33,7 +36,7 @@ namespace laba3.Core | |||||||
|         /// <param name="action">Action, runs if option selected</param> |         /// <param name="action">Action, runs if option selected</param> | ||||||
|         public void AddOption(string name, Action action) |         public void AddOption(string name, Action action) | ||||||
|         { |         { | ||||||
|             this.options.Add(new Option(name, action)); |             this.options.Add(new MenuOption(name, action)); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
| @ -77,7 +80,7 @@ namespace laba3.Core | |||||||
|             Console.Clear(); |             Console.Clear(); | ||||||
|             Console.WriteLine(title); |             Console.WriteLine(title); | ||||||
|             int optionIndex = 0; |             int optionIndex = 0; | ||||||
|             foreach (Option option in options) |             foreach (MenuOption option in options) | ||||||
|             { |             { | ||||||
|                 string pointer = optionIndex == selected ? " ->" : "   "; |                 string pointer = optionIndex == selected ? " ->" : "   "; | ||||||
|                 Console.WriteLine($"{pointer}{option.Name}"); |                 Console.WriteLine($"{pointer}{option.Name}"); | ||||||
| @ -85,12 +88,12 @@ namespace laba3.Core | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         private struct Option |         public struct MenuOption | ||||||
|         { |         { | ||||||
|             public string Name { get; } |             public string Name { get; } | ||||||
|             public Action Action { get; } |             public Action Action { get; } | ||||||
| 
 | 
 | ||||||
|             public Option(string name, Action action) |             public MenuOption(string name, Action action) | ||||||
|             { |             { | ||||||
|                 Name = name; |                 Name = name; | ||||||
|                 Action = action; |                 Action = action; | ||||||
|  | |||||||
| @ -1,35 +1,41 @@ | |||||||
| using laba3.Core; | using laba3.Core; | ||||||
| using laba3.Subprograms; | using laba3.Subprograms; | ||||||
|  | using ProgLab1.GUI; | ||||||
| using System; | using System; | ||||||
| 
 | 
 | ||||||
| class Program | class Program | ||||||
| { | { | ||||||
|  |     static MenuForm mainMenuForm; | ||||||
|  |     static MenuForm snakeDiffMenuForm; | ||||||
|  |     static MenuForm snakeSizeMenuForm; | ||||||
|  | 
 | ||||||
|  |     [STAThread] // Требуется для Windows Forms | ||||||
|     static void Main() |     static void Main() | ||||||
|     { |     { | ||||||
|         Menu mainMenu = new Menu("Select option"); |         Application.EnableVisualStyles(); | ||||||
|         mainMenu.AddOption("Guess answer math game", () => GuessAnswerMath.RunGame()); |         Application.SetCompatibleTextRenderingDefault(false); | ||||||
|         mainMenu.AddOption("About me", () => PrintAboutMe()); | 
 | ||||||
|         mainMenu.AddOption("Array sort", () => new ArraySortDemo().Run()); |         int sizex = 20; | ||||||
|         mainMenu.AddOption("Snake game", () => { |         int sizey = 20; | ||||||
|             int sizex = 0; |  | ||||||
|             int sizey = 0; |  | ||||||
|         SnakeGame.Level difficulty = 0; |         SnakeGame.Level difficulty = 0; | ||||||
|  | 
 | ||||||
|         Menu sizeMenu = new Menu("Select world size"); |         Menu sizeMenu = new Menu("Select world size"); | ||||||
|         sizeMenu.AddOption("Small size (10x10)", () => { sizex = 10; sizey = 10; }); |         sizeMenu.AddOption("Small size (10x10)", () => { sizex = 10; sizey = 10; }); | ||||||
|         sizeMenu.AddOption("Medium size (20x20)", () => { sizex = 20; sizey = 20; }); |         sizeMenu.AddOption("Medium size (20x20)", () => { sizex = 20; sizey = 20; }); | ||||||
|         sizeMenu.AddOption("Big size (40x20)", () => { sizex = 40; sizey = 20; }); |         sizeMenu.AddOption("Big size (40x20)", () => { sizex = 40; sizey = 20; }); | ||||||
|             sizeMenu.RunMenu(); |  | ||||||
| 
 | 
 | ||||||
|         Menu difficultyMenu = new Menu("Select difficulty"); |         Menu difficultyMenu = new Menu("Select difficulty"); | ||||||
|         difficultyMenu.AddOption("Easy", () => { difficulty = SnakeGame.Level.Low; }); |         difficultyMenu.AddOption("Easy", () => { difficulty = SnakeGame.Level.Low; }); | ||||||
|         difficultyMenu.AddOption("Medium", () => { difficulty = SnakeGame.Level.Medium; }); |         difficultyMenu.AddOption("Medium", () => { difficulty = SnakeGame.Level.Medium; }); | ||||||
|         difficultyMenu.AddOption("Hard", () => { difficulty = SnakeGame.Level.High; }); |         difficultyMenu.AddOption("Hard", () => { difficulty = SnakeGame.Level.High; }); | ||||||
|             difficultyMenu.RunMenu(); |  | ||||||
| 
 | 
 | ||||||
|  |         Menu mainMenu = new Menu("Select option"); | ||||||
|  |         mainMenu.AddOption("Guess answer math game", () => GuessAnswerMath.RunGame()); | ||||||
|  |         mainMenu.AddOption("About me", () => PrintAboutMe()); | ||||||
|  |         mainMenu.AddOption("Array sort", () => new ArraySortDemo().Run()); | ||||||
|  |         mainMenu.AddOption("Snake game", () => { | ||||||
|             SnakeGame game = new SnakeGame(difficulty, sizex, sizey); |             SnakeGame game = new SnakeGame(difficulty, sizex, sizey); | ||||||
|             game.start(); |             game.start(); | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         }); |         }); | ||||||
|         mainMenu.AddOption("Exit", () => Exit()); |         mainMenu.AddOption("Exit", () => Exit()); | ||||||
| 
 | 
 | ||||||
| @ -37,13 +43,13 @@ class Program | |||||||
|         Utils.Arrays withOneParam = new Utils.Arrays(10); |         Utils.Arrays withOneParam = new Utils.Arrays(10); | ||||||
|         Utils.Arrays withTwoParams = new Utils.Arrays(10, 100); |         Utils.Arrays withTwoParams = new Utils.Arrays(10, 100); | ||||||
| 
 | 
 | ||||||
|         while (true) |         mainMenuForm = new MenuForm(mainMenu); | ||||||
|         { |         snakeDiffMenuForm = new MenuForm(difficultyMenu); | ||||||
|             mainMenu.RunMenu(); |         snakeSizeMenuForm = new MenuForm(sizeMenu); | ||||||
|             Console.WriteLine("Press Enter to continue"); | 
 | ||||||
|             while (Console.ReadKey().Key != ConsoleKey.Enter) { } |         Application.Run(mainMenuForm); | ||||||
|             Console.Clear(); | 
 | ||||||
|         } | 
 | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private static void PrintAboutMe() |     private static void PrintAboutMe() | ||||||
|  | |||||||
							
								
								
									
										39
									
								
								GUI/MenuForm.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								GUI/MenuForm.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | |||||||
|  | namespace ProgLab1.GUI | ||||||
|  | { | ||||||
|  |     partial class MenuForm | ||||||
|  |     { | ||||||
|  |         /// <summary> | ||||||
|  |         /// Required designer variable. | ||||||
|  |         /// </summary> | ||||||
|  |         private System.ComponentModel.IContainer components = null; | ||||||
|  | 
 | ||||||
|  |         /// <summary> | ||||||
|  |         /// Clean up any resources being used. | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> | ||||||
|  |         protected override void Dispose(bool disposing) | ||||||
|  |         { | ||||||
|  |             if (disposing && (components != null)) | ||||||
|  |             { | ||||||
|  |                 components.Dispose(); | ||||||
|  |             } | ||||||
|  |             base.Dispose(disposing); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         #region Windows Form Designer generated code | ||||||
|  | 
 | ||||||
|  |         /// <summary> | ||||||
|  |         /// Required method for Designer support - do not modify | ||||||
|  |         /// the contents of this method with the code editor. | ||||||
|  |         /// </summary> | ||||||
|  |         private void InitializeComponent() | ||||||
|  |         { | ||||||
|  |             this.components = new System.ComponentModel.Container(); | ||||||
|  |             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; | ||||||
|  |             this.ClientSize = new System.Drawing.Size(800, 450); | ||||||
|  |             this.Text = "MenuForm"; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         #endregion | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										70
									
								
								GUI/MenuForm.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								GUI/MenuForm.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,70 @@ | |||||||
|  | using laba3.Core; | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.ComponentModel; | ||||||
|  | using System.Data; | ||||||
|  | using System.Drawing; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Text; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using System.Windows.Forms; | ||||||
|  | 
 | ||||||
|  | using static laba3.Core.Menu; | ||||||
|  | 
 | ||||||
|  | namespace ProgLab1.GUI | ||||||
|  | { | ||||||
|  |     public partial class MenuForm : Form | ||||||
|  |     { | ||||||
|  |         public MenuForm(Menu consoleMenu) | ||||||
|  |         { | ||||||
|  |             InitializeComponent(); | ||||||
|  |             this.Width = 800; | ||||||
|  |             this.Height = 600; | ||||||
|  |             AddMenu(consoleMenu); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// <summary> | ||||||
|  |         /// Adds menu to GUI | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="consoleMenu">TUI menu</param> | ||||||
|  |         private void AddMenu(Menu consoleMenu) | ||||||
|  |         { | ||||||
|  | 
 | ||||||
|  |             FlowLayoutPanel buttonPanel = new FlowLayoutPanel | ||||||
|  |             { | ||||||
|  |                 Dock = DockStyle.Fill, // Растягиваем на всю форму | ||||||
|  |                 FlowDirection = FlowDirection.TopDown, // Кнопки располагаются сверху вниз | ||||||
|  |                 WrapContents = false // Запрет переноса | ||||||
|  |             }; | ||||||
|  | 
 | ||||||
|  |             Label menuLabel = new Label | ||||||
|  |             { | ||||||
|  |                 Text = consoleMenu.GetTitle(), // Текст заголовка | ||||||
|  |                 Font = new System.Drawing.Font("Arial", 16, System.Drawing.FontStyle.Bold), // Стиль шрифта | ||||||
|  |                 TextAlign = System.Drawing.ContentAlignment.MiddleCenter, // Выравнивание текста по центру | ||||||
|  |                 Dock = DockStyle.Top, // Заголовок сверху | ||||||
|  |                 Height = 40 // Высота заголовка | ||||||
|  |             }; | ||||||
|  | 
 | ||||||
|  |             buttonPanel.Controls.Add(menuLabel); | ||||||
|  | 
 | ||||||
|  |             foreach (MenuOption option in consoleMenu.GetOptions()) | ||||||
|  |             { | ||||||
|  |                 Button button = new Button | ||||||
|  |                 { | ||||||
|  |                     Text = option.Name, | ||||||
|  |                     Width = buttonPanel.Width - 10, | ||||||
|  |                     Height = 40, | ||||||
|  |                     Margin = new Padding(5), | ||||||
|  |                 }; | ||||||
|  | 
 | ||||||
|  |                 // Связываем обработчик с OnSelect из консольного меню | ||||||
|  |                 button.Click += (sender, e) => option.Action(); | ||||||
|  | 
 | ||||||
|  |                 buttonPanel.Controls.Add(button); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             this.Controls.Add(buttonPanel); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										120
									
								
								GUI/MenuForm.resx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								GUI/MenuForm.resx
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,120 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <root> | ||||||
|  |   <!--  | ||||||
|  |     Microsoft ResX Schema  | ||||||
|  |      | ||||||
|  |     Version 2.0 | ||||||
|  |      | ||||||
|  |     The primary goals of this format is to allow a simple XML format  | ||||||
|  |     that is mostly human readable. The generation and parsing of the  | ||||||
|  |     various data types are done through the TypeConverter classes  | ||||||
|  |     associated with the data types. | ||||||
|  |      | ||||||
|  |     Example: | ||||||
|  |      | ||||||
|  |     ... ado.net/XML headers & schema ... | ||||||
|  |     <resheader name="resmimetype">text/microsoft-resx</resheader> | ||||||
|  |     <resheader name="version">2.0</resheader> | ||||||
|  |     <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> | ||||||
|  |     <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> | ||||||
|  |     <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> | ||||||
|  |     <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> | ||||||
|  |     <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> | ||||||
|  |         <value>[base64 mime encoded serialized .NET Framework object]</value> | ||||||
|  |     </data> | ||||||
|  |     <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> | ||||||
|  |         <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> | ||||||
|  |         <comment>This is a comment</comment> | ||||||
|  |     </data> | ||||||
|  |                  | ||||||
|  |     There are any number of "resheader" rows that contain simple  | ||||||
|  |     name/value pairs. | ||||||
|  |      | ||||||
|  |     Each data row contains a name, and value. The row also contains a  | ||||||
|  |     type or mimetype. Type corresponds to a .NET class that support  | ||||||
|  |     text/value conversion through the TypeConverter architecture.  | ||||||
|  |     Classes that don't support this are serialized and stored with the  | ||||||
|  |     mimetype set. | ||||||
|  |      | ||||||
|  |     The mimetype is used for serialized objects, and tells the  | ||||||
|  |     ResXResourceReader how to depersist the object. This is currently not  | ||||||
|  |     extensible. For a given mimetype the value must be set accordingly: | ||||||
|  |      | ||||||
|  |     Note - application/x-microsoft.net.object.binary.base64 is the format  | ||||||
|  |     that the ResXResourceWriter will generate, however the reader can  | ||||||
|  |     read any of the formats listed below. | ||||||
|  |      | ||||||
|  |     mimetype: application/x-microsoft.net.object.binary.base64 | ||||||
|  |     value   : The object must be serialized with  | ||||||
|  |             : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter | ||||||
|  |             : and then encoded with base64 encoding. | ||||||
|  |      | ||||||
|  |     mimetype: application/x-microsoft.net.object.soap.base64 | ||||||
|  |     value   : The object must be serialized with  | ||||||
|  |             : System.Runtime.Serialization.Formatters.Soap.SoapFormatter | ||||||
|  |             : and then encoded with base64 encoding. | ||||||
|  | 
 | ||||||
|  |     mimetype: application/x-microsoft.net.object.bytearray.base64 | ||||||
|  |     value   : The object must be serialized into a byte array  | ||||||
|  |             : using a System.ComponentModel.TypeConverter | ||||||
|  |             : and then encoded with base64 encoding. | ||||||
|  |     --> | ||||||
|  |   <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> | ||||||
|  |     <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> | ||||||
|  |     <xsd:element name="root" msdata:IsDataSet="true"> | ||||||
|  |       <xsd:complexType> | ||||||
|  |         <xsd:choice maxOccurs="unbounded"> | ||||||
|  |           <xsd:element name="metadata"> | ||||||
|  |             <xsd:complexType> | ||||||
|  |               <xsd:sequence> | ||||||
|  |                 <xsd:element name="value" type="xsd:string" minOccurs="0" /> | ||||||
|  |               </xsd:sequence> | ||||||
|  |               <xsd:attribute name="name" use="required" type="xsd:string" /> | ||||||
|  |               <xsd:attribute name="type" type="xsd:string" /> | ||||||
|  |               <xsd:attribute name="mimetype" type="xsd:string" /> | ||||||
|  |               <xsd:attribute ref="xml:space" /> | ||||||
|  |             </xsd:complexType> | ||||||
|  |           </xsd:element> | ||||||
|  |           <xsd:element name="assembly"> | ||||||
|  |             <xsd:complexType> | ||||||
|  |               <xsd:attribute name="alias" type="xsd:string" /> | ||||||
|  |               <xsd:attribute name="name" type="xsd:string" /> | ||||||
|  |             </xsd:complexType> | ||||||
|  |           </xsd:element> | ||||||
|  |           <xsd:element name="data"> | ||||||
|  |             <xsd:complexType> | ||||||
|  |               <xsd:sequence> | ||||||
|  |                 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> | ||||||
|  |                 <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> | ||||||
|  |               </xsd:sequence> | ||||||
|  |               <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> | ||||||
|  |               <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> | ||||||
|  |               <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> | ||||||
|  |               <xsd:attribute ref="xml:space" /> | ||||||
|  |             </xsd:complexType> | ||||||
|  |           </xsd:element> | ||||||
|  |           <xsd:element name="resheader"> | ||||||
|  |             <xsd:complexType> | ||||||
|  |               <xsd:sequence> | ||||||
|  |                 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> | ||||||
|  |               </xsd:sequence> | ||||||
|  |               <xsd:attribute name="name" type="xsd:string" use="required" /> | ||||||
|  |             </xsd:complexType> | ||||||
|  |           </xsd:element> | ||||||
|  |         </xsd:choice> | ||||||
|  |       </xsd:complexType> | ||||||
|  |     </xsd:element> | ||||||
|  |   </xsd:schema> | ||||||
|  |   <resheader name="resmimetype"> | ||||||
|  |     <value>text/microsoft-resx</value> | ||||||
|  |   </resheader> | ||||||
|  |   <resheader name="version"> | ||||||
|  |     <value>2.0</value> | ||||||
|  |   </resheader> | ||||||
|  |   <resheader name="reader"> | ||||||
|  |     <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | ||||||
|  |   </resheader> | ||||||
|  |   <resheader name="writer"> | ||||||
|  |     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | ||||||
|  |   </resheader> | ||||||
|  | </root> | ||||||
							
								
								
									
										
											BIN
										
									
								
								GUI/background.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								GUI/background.jpg
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 506 KiB | 
| @ -2,9 +2,16 @@ | |||||||
| 
 | 
 | ||||||
|   <PropertyGroup> |   <PropertyGroup> | ||||||
|     <OutputType>Exe</OutputType> |     <OutputType>Exe</OutputType> | ||||||
|     <TargetFramework>net8.0</TargetFramework> |     <TargetFramework>net8.0-windows10.0.17763.0</TargetFramework> | ||||||
|     <ImplicitUsings>enable</ImplicitUsings> |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|     <Nullable>enable</Nullable> |     <Nullable>enable</Nullable> | ||||||
|  |     <UseWindowsForms>True</UseWindowsForms> | ||||||
|   </PropertyGroup> |   </PropertyGroup> | ||||||
| 
 | 
 | ||||||
|  |   <ItemGroup> | ||||||
|  |     <None Update="GUI\background.jpg"> | ||||||
|  |       <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||||
|  |     </None> | ||||||
|  |   </ItemGroup> | ||||||
|  | 
 | ||||||
| </Project> | </Project> | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user