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.

pdf23 trang | Chuyên mục: Pascal | Chia sẻ: dkS00TYs | Lượt xem: 2104 | Lượt tải: 1download
Tóm tắt nội dung 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, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trê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:

  • pdfSá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