30/09/2018, 22:09

Bắt sự kiện nhấn phím cho game Tetris (Console)

Chào tất cả mọi người, mình đang loay hoay với bài tập cơ bản C# ( game xếp hình )
Mình dùng VS 2013, console application
Mình có tìm hiểu về bắt sự kiện nhấn phím như sau:

ConsoleKeyInfo info = Console.ReadKey(true);
while ( info.Key != ConsoleKey.B )
if (info.Key != ConsoleKey.B)
{
a += info.KeyChar;
info = Console.ReadKey(true);
}
else
a += info.KeyChar;
Console.Write(a);
Console.ReadLine();

Nhưng code của mình cho khối gạch như này

public void DownBlock(Block block)
        {
            for (int j = block.jBroad; j < 22; j++)
            {
                DeleteBlock(block);
                block.jBroad = j;
                drawBlock(block);
            }
        }

Nếu bắt sự kiện Console.ReadKey() thì phải chờ tới khi khối gạch không rơi nữa. Mình đang khá lúng túng, mong bác nào biết thì chỉ dẫn cho mình.
Cảm ơn mọi người

hdt viết 00:09 ngày 01/10/2018

ý mình muốn khi khối gạch đang rơi, mình ấn phím mũi tên điều hướng cho gạch, nó sẽ thực hiện luôn các bác ạ

hacked viết 00:13 ngày 01/10/2018

Bạn có thể tham khảo code này của mình:

using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
class Program
{
    static void Main(string[] args)
    {
        Console.CancelKeyPress += (sender, e) =>
        {

            Console.WriteLine("Dang thoat...");
            Environment.Exit(0);
        };
        Console.WriteLine("An phim mui ten de di vien gach...");
        Console.WriteLine("An phim ESC de thoat");

        var taskKeys = new Task(ReadKeys);
        var taskProcessFiles = new Task(ProcessFiles);

        taskKeys.Start();
        taskProcessFiles.Start();

        var tasks = new[] { taskKeys };
        Task.WaitAll(tasks);
    }

    private static void ProcessFiles()
    {
        var taskBusy = new Task(BusyIndicator);
        taskBusy.Start();

        for(int i=1;;i++)
        {
            Thread.Sleep(1000);
            Console.WriteLine("Khoi gach dang di chuyen...");
        }
    }

    private static void BusyIndicator()
    {
        var busy = new ConsoleBusyIndicator();
        busy.UpdateProgress();
    }

    private static void ReadKeys()
    {
        ConsoleKeyInfo key = new ConsoleKeyInfo();

        while (!Console.KeyAvailable && key.Key != ConsoleKey.Escape)
        {

            key = Console.ReadKey(true);

            switch (key.Key)
            {
                case ConsoleKey.UpArrow:
                    Console.WriteLine("UpArrow was pressed");
                    break;
                case ConsoleKey.DownArrow:
                    Console.WriteLine("DownArrow was pressed");
                    break;

                case ConsoleKey.RightArrow:
                    Console.WriteLine("RightArrow was pressed");
                    break;

                case ConsoleKey.LeftArrow:
                    Console.WriteLine("LeftArrow was pressed");
                    break;

                case ConsoleKey.Escape:
                    break;

                default:
                    if (Console.CapsLock && Console.NumberLock)
                    {
                        Console.WriteLine(key.KeyChar);
                    }
                    break;
            }
        }
    }
}

internal class ConsoleBusyIndicator
{
    int _currentBusySymbol;

    public char[] BusySymbols { get; set; }

    public ConsoleBusyIndicator()
    {
        BusySymbols = new[] { '|', '/', '-', '\\' };
    }
    public void UpdateProgress()
    {
        while (true)
        {
            Thread.Sleep(100);
            var originalX = Console.CursorLeft;
            var originalY = Console.CursorTop;

            Console.Write(BusySymbols[_currentBusySymbol]);

            _currentBusySymbol++;

            if (_currentBusySymbol == BusySymbols.Length)
            {
                _currentBusySymbol = 0;
            }

            Console.SetCursorPosition(originalX, originalY);
        }
    }
}
hdt viết 00:16 ngày 01/10/2018

bạn ơi, bạn có thể cho mình xin fb để mình xin được bạn chỉ giáo đôi điều được ko?

hdt viết 00:25 ngày 01/10/2018

đây là fb của mình https://www.facebook.com/thichanchalalot
hoặc bạn có thể bày cho mình sử dụng thuật giải hoặc hàm nào khi khối hộp đang rơi trong 1 vòng lặp mà mình vẫn ấn được phím ngay lập tức, chứ ko phải đợi con trỏ của Console.ReadKey() trỏ tới mới ấn được.

hacked viết 00:15 ngày 01/10/2018

như thế là bạn chưa thử code của mình hả?
Trong khi khối gạch đang rơi bạn có thể ấn phím mũi tên mà?

hdt viết 00:15 ngày 01/10/2018

Trước hết, mình vô cùng cảm ơn bạn, đã phản hồi tích cực lại bài viết của mình
Mình mới hoàn thành khoá học cơ bản online, khá lúng túng trong việc này.
Chương trình của mình cho khối gạch rơi tự do bằng vòng lặp, vậy thuật giải như nào thì lúc vòng lặp đang chạy, ta có thể ấn được nút ( console.ReadKey())?
Mình có đọc code của bạn viết nhưng trình độ mình chưa hiểu hết.

hdt viết 00:17 ngày 01/10/2018

rất mong được bạn nhận giúp đỡ trực tiếp qua fb

hdt viết 00:12 ngày 01/10/2018

Mong các bác giúp đỡ, cũng tìm hiểu trên mạng đọc 3-5 hôm nay r, nhưng có ít quá

hdt viết 00:13 ngày 01/10/2018

mới chỉ làm cho khối gạch rơi tự do từ trên xuống, và tự dừng lại khi hết vòng chạy ạ

Văn Dương viết 00:18 ngày 01/10/2018

Cho nó rơi 1 nấc thì kiểm tra phím 1 lần. Có gì khó đâu ?

while(true){
    CheckKeys();
    BlockDrop();
}
hdt viết 00:17 ngày 01/10/2018
while(gạch vẫn rơi được == true)
{
    CheckKeys(); cho phép người dùng được dùng phím phải - trái - lên - xuống, 
sau khoảng thời gian sleep mà ko ấn, thì gạch tiếp tục rơi, và quay lại vòng lặp hả bác?
    BlockDrop();
}
hdt viết 00:14 ngày 01/10/2018

Cảm ơn bác nhiều, em đã thử code của bác, chạy được, em đang ngồi nghiên cứu code của bác đây ạ, nhưng em lên cảm ơn bác 1 câu nữa, cho ai đang có thắc mắc giống em, có thể giải quyết được.

hacked viết 00:24 ngày 01/10/2018

Bạn nhớ đánh dấu vào câu trả lời đúng để mọi người cùng biết.

hdt viết 00:17 ngày 01/10/2018

Em đánh dấu r bác ạ, lại có động lực ngồi làm tiếp r, chân thành cảm ơn bác

Bài liên quan
0