1. Trang chủ
  2. » Tất cả

Bai 7.2

9 1 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 9
Dung lượng 114,79 KB

Nội dung

Trang MƠN : LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Bài thực hành số 7.2 : Xây dựng chương trình giải ô số Sudoku I Mục tiêu : ƒ Giúp SV làm quen với qui trình thiết kế trực quan ứng dụng Dialog Based ƒ Giúp SV làm quen với việc dùng lại linh kiện phần mềm ƒ Giúp SV thấy cụ thể cấu trúc ứng dụng cấu thành từ ₫ối tượng ƒ Giúp SV thấy tương tác ₫ối tượng II Nội dung : ƒ Xây dựng chương trình nhỏ chạy chế ₫ộ ₫ồ họa cho phép user nhập giá trị vào số ô Sudoku giải Cửa sổ ứng dụng có dạng sau : III Chuẩn ₫ầu : ƒ Thành thạo việc xây dựng ứng dụng theo qui trình thiết kế trực quan ƒ Thành thạo việc dùng lại linh kiện phần mềm có sẵn, thấy rõ cấu trúc phầm mềm tương tác ₫ối tượng phần mềm ƒ Thành thạo việc viết code thay ₫ổi kích thước vị trí ₫ối tượng giao diện cửa sổ chứa chúng bị thay ₫ổi IV Phân tích : Chương trình chứa ₫ối tượng Form, Form chứa ₫ối tượng bên : - ₫ối tượng Button - ₫ối tượng Label - ₫ối tượng ma trận Sudoku Ta thiết kế trực quan Form với ₫ối tượng co sẵn Button, Label cho dễ Riêng ma trận Sudoku ₫ược lập trình ₫ộng theo trạng thái thời ₫iểm V Qui trình : Chạy VS Net, chọn menu File.New.Project ₫ể hiển thị cửa sổ New Project Trang 2 Mở rộng mục Visual C# TreeView "Project Types", chọn mục Window, chọn icon "Windows Application" listbox "Templates" bên phải, thiết lập thư mục chứa Project listbox "Location", nhập tên Project vào textbox "Name:" (thí dụ Form_Sudoku), click button OK ₫ể tạo Project theo thông số ₫ã khai báo Form ₫ầu tiên ứng dụng ₫ã hiển thị cửa sổ thiết kế, việc thiết kế form trình lặp thao tác tạo mới/xóa/hiệu chỉnh thuộc tính/tạo hàm xử lý kiện cho ₫ối tượng cần dùng form Nếu cửa sổ ToolBox chưa hiển thị chi tiết, chọn menu View.Toolbox ₫ể hiển thị (thường nằm bên trái hình) Click chuột vào button (Auto Hide) nằm góc phải cửa sổ ToolBox ₫ể chuyển chế ₫ộ hiển thị thường trực Duyệt tìm phần tử Button (trong nhóm Common Controls), chọn nó, dời chuột góc trái form vẽ với kích thước mong muốn Xem cửa sổ thuộc tính Button vừa vẽ (thường góc phải hình), duyệt tìm hiệu chỉnh thuộc tính Text = "Giải", duyệt tìm thay ₫ổi thuộc tính (Name) = btnGiai Lặp lại bước hai lần ₫ể vẽ button ("Giải tiếp", btnGiaitiep) ("Xóa", btnXoa) Duyệt tìm phần tử Label (trong nhóm Common Controls), chọn nó, dời chuột vị trí button vẽ với kích thước mong muốn Hiệu chỉnh thuộc tính (Name) = lblMesg Dời chuột button btnGiai, ấn kép chuột vào ₫ể tạo hàm xử lý kiện Click chuột cho button, cửa sổ mã nguồn hiển thị ₫ể ta bắt ₫ầu viết code cho hàm Cách tổng quát ₫ể tạo hàm xử lý kiện chọn ₫ối tượng btnGiai, cửa sổ thuộc tính hiển thị, click icon ₫ể hiển thị danh sách kiện ₫ối tượng, duyệt tìm kiện quan tâm (Click), ấn kép chuột vào comboBox bên phải kiện Click ₫ể máy tạo tự ₫ộng hàm xử lý cho kiện Cửa sổ mã nguồn hiển thị khung sườn hàm vừa ₫ược tạo với thân rỗng, ta viết thân cho hàm sau Dời chuột cửa sổ “Solution Explorer” (thường nằm phía phải hình), duyệt tìm phần tử Form1.cs, ấn phải chuột ₫ể hiển thị menu lệnh, chọn lệnh “View Designer” ₫ể hiển thị lại cửa số thiết kế Form Thực lại bước button btnGiaitiep ₫ể tạo hàm xử lý kiện Click chuột cho button 10 Tiếp tục tạo hàm xử lý kiện Click chuột cho button btnXoa 11 Dời chuột cửa sổ “Solution Explorer”, duyệt tìm phần tử Form1.cs, ấn phải chuột ₫ể hiển thị menu lệnh, chọn lệnh “View Designer” ₫ể hiển thị lại cửa số thiết kế Form Chọn Form tạo hàm xử lý kiện KeyDown, MouseDown, Paint cho Form 12 Dời chuột ₫ầu class Form1 viết tiếp ₫oạn code sau phục vụ việc giải ô số Sudoku : //================================================= // phần code ₫ộc lập với giao diện //================================================= //₫ịnh nghĩa kiểu miêu tả thông tin ô số struct Cell { public bool fix; //fix = true : giá trị ô cố ₫ịnh public sbyte value; }; //₫ịnh nghĩa thuộc tính liệu const int LEN = 9; Cell[,] matran = new Cell[LEN, LEN]; int h, c; //tọa ₫ộ ô ₫ang xử lý Trang int cachso; //hàm kiểm tra ô (h,c) chứa giá trị val khơng ? bool Testvitri(int h, int c, sbyte val) { int h1, c1; int i, j; matran[h, c].value = 0; if (val > 9) return false; // xem có trùng với cell hàng h ? for (c1 = 0; c1 < LEN; c1++) if (matran[h, c1].value == val) return false; // xem có trùng với cell cot c ? for (h1 = 0; h1 < LEN; h1++) if (matran[h1, c].value == val) return false; // xem có trùng với cell vùng 3x3 ? h1 = h / * 3; c1 = c / * 3; for (i = h1; i < h1 + 3; i++) for (j = c1; j < c1 + 3; j++) if (matran[i, j].value == val) return false; //chứa kết vào cell tương ứng matran[h, c].value = val; return true; } //hàm tìm trị phù hợp cho h,c ? //trả TRUE ₫ược, FALSE không bool timtri(int h, int c) { sbyte val; sbyte d; if (matran[h,c].fix) return true; val = matran[h, c].value; val++; matran[h,c].value = 0; for (d = val; d 0) c ; else { c = LEN - 1; h ; } if (h < 0) return false; //hết cách if (matran[h, c].fix == false) return true; Trang } } //================================================= // phần code phục vụ giao diện với người dùng //================================================= //Định nghĩa cần dùng int yStart = 70; //top bảng Sukodu int xStart = 10; //left bảng Sukodu int wSeparator = 4; //khoảng hở vùng const int WCELL = 40; //₫ộ rộng ô const int HCELL = 40; //₫ộ cao tửng ô //tạo pen với màu Blue, nét vẽ pixel Pen pen = new Pen(Color.FromArgb(255, 0, 255), 1); //tạo brush với màu ₫ỏ, tô ₫ặc Brush brush = new SolidBrush(Color.FromArgb(255, 0, 255)); Graphics g; int xcur, ycur; //ô nhập liệu //hàm hiển thị nội dung ô row,col private void OutXY(int row, int col) { //tạo ₫ối tượng font chữ cần dùng Font myFont = new Font("Helvetica", 11); //tạo biến miêu tả chế ₫ộ canh xuất chuỗi StringFormat format1 = new StringFormat(StringFormatFlags.NoClip); format1.Alignment = StringAlignment.Center; //tính tọa ₫ộ x,y form row,col int x, y; x = xStart + col * WCELL + (col / + 1) * wSeparator; y = yStart + row * HCELL + (row / + 1) * wSeparator; //thiết lập màu màu chữ cho ô Color bColor, fColor; if (matran[row,col].fix) { bColor = Color.FromArgb(0, 0, 255); fColor = Color.FromArgb(255, 255, 255); } else { bColor = Color.FromArgb(230, 230, 230); fColor = Color.FromArgb(0, 0, 0); } pen.Color = fColor; brush = new SolidBrush(bColor); //tô cho ô g.FillRectangle(brush, x + 2, y + 2, WCELL - 4, HCELL - 4); if (matran[row,col].value > 0) // hiển thị ô hợp lệ g.DrawString(matran[row,col].value.ToString(), myFont, new SolidBrush(fColor), x + WCELL / 2, y + 8, format1); if (matran[row,col].value == -1) //hiển thị ô không hợp lệ Trang { g.DrawString("?", myFont, System.Drawing.Brushes.Red,x + WCELL / 2, y + 8, format1); } if (row == ycur && col == xcur) { //vẽ cursor nhập liệu ô hành pen.Color = Color.DarkBlue; g.DrawRectangle(pen,x + 3, y + 3, WCELL - 6, HCELL - 6); } } private void Giai() { //bắt ₫ầu tìm trị cho trái cachso = 0; h = 0; c = 0; //cố gắng tìm cách xếp số Tim1cach(); btnGiai.Enabled = false; btnGiaitiep.Enabled = true; } //hàm cố gắng tìm cách xếp ô số void Tim1cach() { while (h dừng chương trình lblMesg.Text = "Hết cách rồi"; return; } // tìm ₫ược cách tồn số cachso++; lblMesg.Text = "Cách thứ " + cachso + ":"; this.Invalidate(); return; } //hàm tìm cách giải private void Giaitiep() { if (!Back(ref h, ref c)) //hết cách lblMesg.Text = "Khơng cịn cách khác nữa."; Trang else { Tim1cach(); } } //hàm reset ma trận Sudoku trạng thái ban ₫ầu private void XoaSudoku() { int h, c; //lặp reset cell for (h = 0; h < LEN; h++) for (c = 0; c < LEN; c++) { matran[h, c].fix = false; matran[h, c].value = 0; } lblMesg.Text = "Hãy nhập số vào ô :"; btnGiaitiep.Enabled = false; btnGiai.Enabled = true; Invalidate(); } 13 Viết code cho hàm xử lý kiện vừa tạo bước trước sau (lưu ý copy thân hàm dán vào khung sườn hàm ₫ã ₫ược máy tạo sẵn) : //hàm khởi tạo Form public Form1() { InitializeComponent(); int h, c; //phân phối vùng nhớ cho ma trận Sukodu for (h = 0; h < LEN; h++) for (c = 0; c < LEN; c++) matran[h, c] = new Cell(); //hiệu chỉnh lại kích thước Form ₫ể chứa vừa ma trận TextBox this.Size = new Size(9 * WCELL + xStart * + 14 + * wSeparator, * HCELL + yStart + 10 + 40 + * wSeparator); //thiết lập ô chứa cursor nhập liệu xcur = ycur = LEN / 2; //cho phép Form xử lý kiện phím this.KeyPreview = true; XoaSudoku(); } //hàm xử lý Click chuột button Giai private void btnGiai_Click(object sender, EventArgs e) { Giai(); } //hàm xử lý Click button Giaitiep private void btnGiaitiep_Click(object sender, EventArgs e) { Giaitiep(); Trang } //hàm xử lý Click button Xoa private void btnXoa_Click(object sender, EventArgs e) { XoaSudoku(); } //hàm xử lý Click chuột Form private void Form1_MouseDown(object sender, MouseEventArgs e) { //xác ₫ịnh tọa ₫ộ chuột int x = e.X, y =e.Y; //kiểm tra chuột có nằm ma trận Sudoku ? if (xStart > x || x >xStart + LEN * WCELL + 4*wSeparator || yStart > y || y > yStart+ LEN * HCELL + 4*wSeparator) { //nếu nằm ma trận khơng làm return; } //xác ₫ịnh ô ₫ược focus xcur = (x - xStart) /WCELL; if (xcur == LEN) xcur ; ycur = (y - yStart) /HCELL; if (ycur == LEN) ycur ; //vẽ lại Form this.Invalidate(); return; } //hàm xử lý ấn phím Form private void Form1_KeyDown(object sender, KeyEventArgs e) { if (Keys.D0

Ngày đăng: 11/04/2022, 23:26

w