Sáng tạo trong thuật toán và lập trình với ngôn ngữ Pascal và C# - Tập 1 - Chương 3_Bàn phím và màn hình
ASCII (đọc là a-ski) là bộ mã chuẩn dùng trong trao đổi thông tin của Mĩ và đầu tiên
được cài đặt trong các máy tính sử dụng hệ điều hành MS-DOS. Trong bảng mã này, mỗi
kí tự có một mã số riêng biệt chiếm 1 byte. Trong TP Ta viết 65 là để biểu thị mã số 65,
viết #65 là để biểu thị kí tự có mã số 65, tức là chữ 'A'. Các kí tự mang mã số từ 0 đến
31 là các kí tự điều khiển, thí dụ, kí tự #13 điều khiển con trỏ văn bản xuống dòng mới,
kí tự #10 điều khiển con trỏ văn bản về đầu dòng. Như vậy, xâu kí tự #13#10 sẽ điều
khiển con trỏ về đầu dòng mới và do đó lệnh write(#13#10) sẽ tương đương với lệnh
writeln. Lệnh writeln(#13#10) sẽ tương đương với hai lệnh writeln;
writeln.
Chương trình dưới đây ghi vào tệp văn bản có tên ASCII.DAT các kí tự và mã của
chúng. Tất cả có 256 kí tự chia làm hai phần. 128 kí tự đầu tiên mã số từ 0 đến 127 là
các kí tự cơ sở, 128 kí tự còn lại, mã số từ 128 đến 255 là các kí tự mở rộng.
Sau khi thực hiện chương trình, bạn có thể mở tệp ASCII.DAT để xem từng kí tự
và mã của chúng. Lưu ý rằng có kí tự hiển thị được và có kí tự không hiển thị được trên
màn hình, chẳng hạn như các kí tự điều khiển.
d = 6; {chieu dai cua moi so} ML = 12; {so luong tren mot dong} LIM = d*ML; BL = #32; W = 500; {kich thuoc toi da cua bang nhay} var a: array [0..MN] of integer; {vung dem} {toa do con tro man hinh} x, y: array [0..MN] of byte; {------------------------------- Viet n so tren bang nhay bac k buoc b ---------------------------------} procedure BangNhay(b,k,n: integer); var i, j, z, t: integer; xx, yy: byte; {vi tri con tro} begin textattr := 7; clrscr; writeln('Bang nhay bac ',k,' buoc ',b); writeln(' gom ',n,' so'); writeln('Bat dau nap day ',n,' so.'); writeln('Sau moi so bam ENTER'); xx:= wherex; yy:= wherey; for i := 0 to n-1 do begin gotoxy(xx,yy); readln(z); {nap 1 so} if i < b then t := i else begin t:= i MOD b; for j:= 1 to 5 do begin {sua lai so truoc do b buoc} gotoxy(x[t],y[t]); write(BL:d); gotoxy(x[t],y[t]); write(a[t]); delay(W); gotoxy(x[t],y[t]); write(BL:d); gotoxy(x[t],y[t]); write(a[t]+k); delay(W); end; end; x[t] := xx; y[t]:= yy; a[t] := z; xx:= xx + d; if xx > LIM then Sáng tạo trong Thuật toán và Lập trình Tập I 82 begin xx:= 1; if yy < 24 then inc(yy) else begin gotoxy(1,25); writeln; for j := 0 to b do dec(y[j]); end; end; end; gotoxy(xx,yy); write(' KET '); readln; end; BEGIN BangNhay(3,6,10); (* Loi giai: -5 -4 -3 -2 -1 0 1 8 9 10 *) END. // C# Các bài 3.3, 3.4 và 3.5 là đơn giản. Trong C# có hàm ReadKey() cho ra giá trị kiểu ConsoleKeyInfor. Dựa theo giá trị này ta có thể xác định phím nào đã được bấm. Đoạn trình dưới đây minh họa khá chi tiết việc nhận biết các phím. // Minh hoa ham Console.ReadKey() using System; using System.Text; class Sample { public static void Main() { Test(); } public static void Test() { ConsoleKeyInfo k; do { Console.Write("\n Bam phim ESC de thoat: "); k = Console.ReadKey(true); char c = k.KeyChar; Console.Write(c); if (char.IsLetter(c)) Console.Write(" Chu cai"); else if (char.IsNumber(c)) Console.Write(" Chu so"); else if (char.IsControl(c)) { Console.Write(" Phim dieu khien "); switch (k.Key) { case ConsoleKey.F1: Console.Write(" F1"); break; Sáng tạo trong Thuật toán và Lập trình Tập I 83 case ConsoleKey.F2: Console.Write(" F2"); break; case ConsoleKey.F3: Console.Write(" F3"); break; case ConsoleKey.F4: Console.Write(" F4"); break; case ConsoleKey.F5: Console.Write(" F5"); break; case ConsoleKey.F6: Console.Write(" F6"); break; case ConsoleKey.F7: Console.Write(" F7"); break; case ConsoleKey.F8: Console.Write(" F8"); break; case ConsoleKey.F9: Console.Write(" F9"); break; case ConsoleKey.F10: Console.Write(" F10"); break; case ConsoleKey.F11: Console.Write(" F11"); break; case ConsoleKey.F12: Console.Write(" F12"); break; case ConsoleKey.Enter: Console.Write(" ENTER"); break; case ConsoleKey.Backspace: Console.Write(" Lui (Backspace)"); break; case ConsoleKey.Home: Console.Write(" Home"); break; case ConsoleKey.Insert: Console.Write(" Ins"); break; case ConsoleKey.Delete: Console.Write(" Del"); break; case ConsoleKey.PageDown: Console.Write(" PgDn"); break; case ConsoleKey.PageUp: Console.Write(" PgUp"); break; case ConsoleKey.Pause: Console.Write(" Pause - Break"); break; case ConsoleKey.RightArrow: Console.Write(" Mui ten phai"); break; case ConsoleKey.LeftArrow: Console.Write(" Mui ten trai"); break; case ConsoleKey.DownArrow: Sáng tạo trong Thuật toán và Lập trình Tập I 84 Console.Write(" Mui ten xuong"); break; case ConsoleKey.UpArrow: Console.Write(" Mui ten len"); break; case ConsoleKey.End: Console.Write(" End"); break; case ConsoleKey.Escape: Console.Write(" ESC"); Console.ReadKey(true); break; } } } while (k.Key != ConsoleKey.Escape); } }// Sample Chương trình C# dưới đây thể hiện trò chơi Gam15 nhằm minh họa một số tính năng quản lý bàn phím và màn hình trong môi trường DOT.NET. Hàm GetKey() nhận một phím và cuyển các giá trị điều khiển sang nội mã, tức là mã do chúng ta tự đặt, thí dụ, ta có thể gán mã cho phím mũi tên trái là 4. Để khởi tạo cấu hình ban đầu ta sẽ lặp ngẫu nhiên maxk lần với giá trị maxk do người chơi tự chọn. Các ô trong bàn cờ được thể hiện dưới dạng [xx], trong đó xx là trị số của quân cờ. Ô trống được thể hiện là [ ] với màu xanh. Thí dụ, cấu hình ban đầu (a) và cấu hình (b) nhận được sau khi đảo ngẫu nhiên một số lần có thể như sau: [ 1] [ 2] [ 3] [ 4] [ 1] [ 6] [ 2] [ 4] [ 5] [ 6] [ 7] [ 8] [ 5] [10] [ 3] [ 8] [ 9] [10] [11] [12] [ ] [14] [ 7] [11] [13] [14] [15] [ ] [ 9] [13] [15] [12] (a) Cấu hình ban đầu (b) Cấu hình sau khi đảo // C# using System; using System.IO; namespace SangTao1 { /*------------------------------------------- * Game15 * ------------------------------------------*/ class Game15 { const int scot = 20; // Toa do cot goc const int sdong = 8; // Toa do dong goc const int dcot = 5; // Kh cach giua 2 o tren dong const int ddong = 2; // Khoang cach dong Sáng tạo trong Thuật toán và Lập trình Tập I 85 const int dd = 4; // ban co kich thuoc 4 X 4 const int dd1 = dd - 1; const int LEN = 1; const int XUONG = 2; const int PHAI = 3; const int TRAI = 4; const int END = 5; const int ESC = 6; const string BL = " ";// dau cach static public int [,] a = new int [dd, dd]; static public int [,] b = new int[dd, dd]; static public int cot = dd1; // toa do o trong static public int dong = dd1; static void Main() { Init(); Play(); } static public void Play() { int k = 0; int d = 0; if (Console.CursorVisible) Console.CursorVisible = !Console.CursorVisible; Console.SetCursorPosition(1, 1); Console.Write("So buoc: "); int coty = Console.CursorTop; int dongx = Console.CursorLeft; Console.SetCursorPosition(dongx, coty); Console.Write(d); do { VeO(dong, cot); if (Sanhab()) { Console.SetCursorPosition(dongx+2, coty); Console.Write(" Chuc mung “ + "Thanh Cong !!!"); Console.ReadLine(); return; } k = GetKey(); ++d; Console.SetCursorPosition(dongx, coty); Console.Write(" "); Console.SetCursorPosition(dongx, coty); Console.Write(d); switch (k) { case LEN: // Day quan duoi o trong LEN if (dong < dd1) { a[dong,cot]=a[dong+1,cot]; Sáng tạo trong Thuật toán và Lập trình Tập I 86 VeO(dong, cot); ++dong; a[dong, cot] = 0; VeO(dong, cot); } break; case XUONG://Day quan tren o trong XUONG if (dong > 0) { a[dong,cot]=a[dong-1,cot]; VeO(dong, cot); --dong; a[dong, cot] = 0; VeO(dong, cot); } break; case PHAI: // Day quan TRAI o trong sang if (cot > 0) { a[dong, cot]=a[dong,cot-1]; VeO(dong, cot); --cot; a[dong, cot] = 0; VeO(dong, cot); } break; case TRAI: // Day quan PHAI o trong sang if (cot < dd1) { a[dong,cot]=a[dong,cot+1]; VeO(dong, cot); ++cot; a[dong, cot] = 0; VeO(dong, cot); } break; } } while (k != ESC); } static public void Gotoij(int i,int j) { Console.SetCursorPosition(scot+dcot*j, sdong+ddong*i); } static public void VeO(int i, int j) { int dong = sdong + ddong*i; int cot = scot + dcot * j; Console.SetCursorPosition(cot,dong); Console.Write(" "); Console.SetCursorPosition(cot, dong); if (a[i,j] == 0) { Console.BackgroundColor = ConsoleColor.Blue; Console.Write("["+BL+BL+"]"); Console.BackgroundColor = Sáng tạo trong Thuật toán và Lập trình Tập I 87 ConsoleColor.Black; } else if (a[i,j] < 10) Console.Write("[" + BL + a[i,j] + "]"); else Console.Write("[" + a[i,j] + "]"); } // so sanh hai cau hinh a va b static public bool Sanhab() { for (int i = 0; i < dd; ++i) for (int j = 0; j < dd; ++j) if (a[i,j] != b[i,j]) return false; return true; } // Dao ngau nhien maxk lan static public void DaoNgauNhien(int maxk) { Random r = new Random(); for (; Sanhab(); ) // Dao den khi a != b { for (int k = 0; k < maxk; ++k) { switch (r.Next(4) + 1) { case LEN: // Day quan duoi o trong LEN if (dong < dd1) { a[dong,cot]=a[dong+1,cot]; ++dong; a[dong, cot] = 0; } break; case XUONG: // Day quan tren o trong XUONG if (dong > 0) { a[dong,cot]=a[dong-1,cot]; --dong; a[dong, cot] = 0; } break; case PHAI: // Day quan TRAI o trong sang if (cot > 0) { a[dong,cot]=a[dong,cot-1]; --cot; a[dong, cot] = 0; } break; case TRAI: // Day quan PHAI o trong sang if (cot < dd1) { a[dong, cot] = a[dong, cot + 1]; ++cot; a[dong, cot] = 0; Sáng tạo trong Thuật toán và Lập trình Tập I 88 } break; } // switch } // for k } // for sanh } static public void VeBanCo() { for (int i = 0; i < dd; ++i) for (int j = 0; j < dd; ++j) VeO(i,j); } static public void Init() { // Khoi tri ban co a. // Ban co b dung de doi sanh. int k = 1; for (int i = 0; i < dd; ++i) for (int j = 0; j < dd; ++j) b[i,j] = a[i, j] = k++; b[dd1,dd1] = a[dd1, dd1] = 0; dong = dd1; cot = dd1; DaoNgauNhien(200); VeBanCo(); } static public int GetKey() { ConsoleKeyInfo k; k = Console.ReadKey(true); char c = k.KeyChar; if (char.IsControl(c)) { switch (k.Key) { case ConsoleKey.RightArrow: return PHAI; case ConsoleKey.LeftArrow: return TRAI; case ConsoleKey.DownArrow: return XUONG; case ConsoleKey.UpArrow: return LEN; case ConsoleKey.End: return END; case ConsoleKey.Escape: return ESC; } } return 0; } } // Game15 } // space
File đính kèm:
- Sáng tạo trong thuật toán và lập trình với ngôn ngữ Pascal và C# - Tập 1 - Chương 3_Bàn phím và màn hình.pdf