الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

السؤال الأول : هل يمكنك محاكاة تاُثير الــ Matrix ؟

بدأه Snack3r في 13 سبتمبر 2012 · 18 رد · 2,506 مشاهدة · في اختبر قداراتك
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

بينما كنتُ أشاهد فيلم الــ Matrix .. خطرت ببالي فكرة محاكاة تأثير الماتريكس بالسي أو بالسي++ عن طريقة كتابة برنامج صغير في الــ Console.

المحاولة رقم 1 :

#include<stdio.h>
#include<stdbool.h>
#include<windows.h>

int main() {
    char arrayMatrix[] = "_0123456789abcdefghijklmnopqrstuvwxyz"
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ#!,?;*$";

    system("title The Matrix !");
    system("color 0A");

    while (true) {
        Sleep(30);
        for (int i = 0; i < 20; i++)
            printf(" %c ", arrayMatrix[rand() % 70]);
        puts("");
    }

    return 0;
}

المطلوب هو أن تكون المُخرجات كهذه :

post-219439-007341100 1347555854_thumb.p

بانتظار إبداعاتكم :)

المرفقات
Matrix.png

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 19 سبتمبر 2012 في 11:06 — السبب: تحديث المشاركة.

4
#2

انا اعرض: الفكرة هي طباعة المصفوفة بشكل رأسي وليس بشكل أفقي؟

تم تعديل هذه المشاركة بواسطة محمد عودة في 13 سبتمبر 2012 في 21:35

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#3

نعم, هذا صحيح.

المحاولة الأولى كانت مجرد مثال بسيط جدا لتوضيح أساسيات الفكرة.

خطرت لي فكرة أخرى أود أن أسمع آرائكم فيها, الفكرة كالآتي :

نُلون (باستخدام الدالة SetConsoleTextAttribute) بعض عناصر المصفوفة باللون الأسود ثم نظهر عناصر أخرى بالأخضر القاتم ثم الأخضر الفاتح فالأبيض ثم الأسود ثم ننتقل إلى موضع آخر من الشاشة (باستخدام SetConsoleCursorPosition) و نكرر نفس الخطوات السابقة ..

ما رأيكم ؟

#4

جرب هذا

#include<stdio.h>
#include<windows.h>
#include<conio.h>

int main() {
    char arrayMatrix[] = "_0123456789abcdefghijklmnopqrstuvwxyz"
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ#!,?;*$";
    system("title The Matrix !");
    system("color 0A");
	for(int j=0;j<24;j++){
	for (int i = 0; i < 35; i++)
            printf("%c ", arrayMatrix[rand() % 70]);
	printf("\n");
	}
	unsigned char x, y;
	HANDLE stdh = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD p;
    while (true) {
		p.X = rand() % 69;
		p.Y = rand() % 24;
		p.X += p.X%2?1:0;
		SetConsoleCursorPosition(stdh, p);
        printf("%c ", arrayMatrix[rand() % 70]);
    }
    return 0;
}

[سبحان الله و بحمده, سبحان الله العظيم]

#5

وعليكم السلام أخي أحمد

هذه محاولتي

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>


int main() {
  unsigned short i,j;
  int N_char = 0,N_num=0,N_esp=0;
  const int MAX_num = 60, MIN_num = 5,MAX_char=0,MIN_char=255,MAX_esp=1,MIN_esp=4 ;

srand(time(NULL));

    	system("title The Matrix !");
    	system("color 0A");

while(1)
{
N_num=(rand() % (MAX_num - MIN_num + 1)) + MIN_num;
for(i=0;i<N_num;i++)
{
  N_char=(rand() % (MAX_char - MIN_char + 1)) + MIN_char;
  N_esp=(rand() % (MAX_esp - MIN_esp + 1)) + MIN_esp;
  putchar(N_char);
  for(j=0;j<N_esp;j++)
  putchar(' ');
}
putchar('\n');
}
    	return 0;
}

1347563319441.jpg

تم تعديل هذه المشاركة بواسطة مومو (momo) في 13 سبتمبر 2012 في 22:33

i love you mama

#6

المحاولة رقم 2 :

#include <iostream>
#include<windows.h>
using namespace std;

int x;
unsigned long int y = 0;
int z;

void color(int nb) {
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), nb);
}

void CursorPosition(short x, short y) {
    COORD coordScreen = {x, y};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coordScreen);
}

void The_Matrix(int time) {
    while (1) {
        color(2);
        x = rand() % 80;
        y += rand() % 2;
        z = y;
        while (z != y + 10) {
            char c = rand();
            CursorPosition(x, z);
            if (c < 32)
                continue;
            if (z == y + 9)
                color(10);
            cout << c << endl;
            z++;
            Sleep(2);
        }
        if (y == time)
            break;
    }
}

int main() {
    system("title The Matrix !");
    system("color 0A");
    The_Matrix(300);
}

المُخرجات :

post-219439-044071800 1347565360_thumb.p

لكن يوجد خطأ في نهاية الإظهار, سأتغلب عليه في المحاولة القادمة إن شاء الله.

المرفقات
testMatrix.png
#7

أعتقد أنني لم أفهم السؤال بشكله المطلوب

ما تقصده أخي أحمد على ما أظن؟؟ أليس كذلك؟؟؟

1347565749291.jpg

i love you mama

#8

@مومو

النسخة الأولى من الكود كانت مجرد بث تجريبي :D

تأثير الــ Matrix يتمثل في إظهار خطوط عمودية متغيرة الطول تحتوي على حروف عشوائية, ظهور الحروف يبدأ باللون الأبيض ثم الأخضر القاتم ثم الأخضر الفاتح.

تمام ؟ :)

#9

أفضل طريقة لكي هي استخدام Threads

#10

المحاولة رقم 3 : (للخروج من البرنامج, اضغط على أي زر من لوحة المفاتيح)

#include <iostream>
#include<windows.h>
#include <conio.h>
using namespace std;

void color(int nb) {
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), nb);
}

void CursorPosition(short x, short y) {
    COORD coordScreen = {x, y};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coordScreen);
}

int main(int argc, char *argv[]) {
    unsigned int y[79];
    unsigned int ymin[79];
    unsigned int a, b;

    char i[36] = {48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69,
    70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87,
    88, 89, 90};

    system("title The Matrix !");
    color(10);

    for (a = 0; a < 79; a++) {
        y[a] = 0;
        ymin[a] = 1;
    }

    do {
        for (unsigned int x = 0; x < 79; x++) {
            for (unsigned int j = 0; j < 5; j++) {
                a = rand() % 79;
                if (y[a] != 0) {
                    b = rand() % y[a] + ymin[a];
                    if (b < 26) {
                        if (b < ymin[a] + 2 & b > 2) color(2);
                        CursorPosition(a + 1, b);
                        cout << i[rand() % 36];
                        color(10);
                    }
                }
            }
            if (y[x] != 0 || (rand() % 50) == 0) {
                if ((rand() % (y[x] + 1)) < 20 & ymin[x] == 1) {
                    y[x]++;
                } else {
                    CursorPosition(x + 1, ymin[x]);
                    cout << " ";
                    ymin[x]++;
                    if (ymin[x] < 25) {
                        color(2);
                        CursorPosition(x + 1, ymin[x] + 1);
                        cout << i[rand() % 36];
                        color(10);
                    }
                }
                if ((y[x] + ymin[x]) < 26) {
                    CursorPosition(x + 1, y[x] + ymin[x]);
                    color(15);
                    cout << i[rand() % 36];
                    color(10);
                }
                if ((y[x] + ymin[x]) < 27) {
                    CursorPosition(x + 1, y[x] + ymin[x] - 1);
                    cout << i[rand() % 36];
                }
            }
            if (ymin[x] > 25) {
                ymin[x] = 1;
                y[x] = 0;
            }
        }
        Sleep(35);
    } while (!kbhit());

    return 0;
}

المُخرجات :

post-219439-080030200 1347573410_thumb.p
المرفقات
testMatrix.png
3
#11

لا أسمح بالتعدي على مجال خبرتي laugh.giflaugh.giflaugh.gif...إنها رسوميات الكونسول يا شباب ...cool.gifcool.gif

اقتباس
أفضل طريقة لكي هي استخدام Threads

غير صحيح ..smile.gif...

اقتباس

هل يمكنك محاكاة تاُثير الــ Matrix ؟ أتحداك أن تفعل !! :)

أنا قبلت التحدي ... أمهلني ساعة واحدة فقط ..049.gif(إن لم ينقطع الاتصال )

#12

بانتظارك يا بطل :D

لكن إذا كانت محاولتي أحسن من محاولتك سأعطيك -1 :P

#13

لدي هذا المشرع الذي كنت قد حملته من زمان laugh.gif من موقع catch22 إن بقي حيا

أتمنى أن تستفيدوا منه جيدا يا إخوتي smile.gif ،،،

matrix.zip

rS3eY.png
#14

أعتذر انقطع الاتصال في الوقت الذي انتهيت فيه ...فقمت بتصوير الشاشة كدليل ...post-256536-086281300 1347675161_thumb.p

وهذه محاولتي ...ملاحظة : أسرع , أجمل , يمكن التحكم بالكثافة و السرعة بمتحولين في أول الكود ...أنتظر تقييمك أخي أحمد ... laugh.gif

#include<windows.h>
#include<cstdlib>
#include<ctime>


const unsigned int Density=1;
const unsigned int Speed=1;


struct matrixInfo
{
	int col;
	int timer;
};
int color (int x,matrixInfo &a)
{
	if(a.timer)
			a.timer++;
	{
		int colors[]={0,8,2,2,0xa,0xa,0xf,0xf,0xf,2,2,0xa,0xa};
	if(a.timer>200)a.timer=0;
	if(a.timer>100)
	{
		a.timer++;
		if((13-(a.timer-100))>0)return colors[(13-(a.timer-100))%13];
		return 0;
	}
		if(a.timer>7)
			for(int speed=0;speed<Speed;speed++)
				(*(&a-x)).timer++;
		if(a.timer>14)
			return 2;
		return colors[a.timer%13];
	}
	return 0;
}
  void main()
  {
            	HANDLE H=GetStdHandle(STD_OUTPUT_HANDLE);
            	COORD ConsoleSize=GetLargestConsoleWindowSize(H);
            	SetConsoleScreenBufferSize(H,ConsoleSize);
				ConsoleSize.X/=2;ConsoleSize.Y/=2;
            	SMALL_RECT Window={0,0,ConsoleSize.X,ConsoleSize.Y};
            	SetConsoleWindowInfo(H,1,&Window);
            	CHAR_INFO *Screen=new CHAR_INFO[ConsoleSize.Y   * ConsoleSize.X];
            	COORD BufferCoord={0,0};
				char HeChallengesMe[]="OK123456789000Man:)))____ Its==/*-By!@#$ME!@$Mostafa36a2>>>>.;.,";
#define mod sizeof(HeChallengesMe)/sizeof(char)
			srand(time(0));
			matrixInfo *MScreen=new matrixInfo[ConsoleSize.Y   * ConsoleSize.X];
				for(int y=0;y<ConsoleSize.Y;y++)
                    	for(int x=0;x<ConsoleSize.X;x++)
						{
							Screen[y*ConsoleSize.X+x].Char.AsciiChar=HeChallengesMe[rand()%mod];
							MScreen[y*ConsoleSize.X+x].col=x;
							MScreen[y*ConsoleSize.X+x].timer=0;
						}
				for(int i=0;i<0x36a2;i++)
            	{
				for(int density=0;density<Density;density++)
					MScreen[rand()%(ConsoleSize.Y*ConsoleSize.X)].timer++;
            	for(int y=0;y<ConsoleSize.Y;y++)
                    	for(int x=0;x<ConsoleSize.X;x++)
						{
							Screen[y*ConsoleSize.X+x].Attributes=color(ConsoleSize.X,MScreen[y*ConsoleSize.X+x]);
						}
            	WriteConsoleOutputA(H,Screen,ConsoleSize,BufferCoord,&Window);
            	}
  }

وهذه للمزيد من التشويق :

جعلت الأعمدة الزوجية تصعد والفردية تهبط wink.gif

#include<windows.h>
#include<cstdlib>
#include<ctime>


const unsigned int Density=1;
const unsigned int Speed=1;


struct matrixInfo
{
	int col;
	int timer;
};
int color (int x,matrixInfo &a)
{
	if(a.timer)
			a.timer++;
	{
		int colors[]={0,8,2,2,0xa,0xa,0xf,0xf,0xf,2,2,0xa,0xa};
	if(a.timer>200)a.timer=0;
	if(a.timer>100)
	{
		a.timer++;
		if((13-(a.timer-100))>0)return colors[(13-(a.timer-100))%13];
		return 0;
	}
		if(a.timer>7)
			for(int speed=0;speed<Speed;speed++)
				if(a.col%2)(*(&a-x)).timer++;
				else (*(&a+x)).timer++;
		if(a.timer>14)
			return 2;
		return colors[a.timer%13];
	}
	return 0;
}
  void main()
  {
            	HANDLE H=GetStdHandle(STD_OUTPUT_HANDLE);
            	COORD ConsoleSize=GetLargestConsoleWindowSize(H);
            	SetConsoleScreenBufferSize(H,ConsoleSize);
				ConsoleSize.X/=2;ConsoleSize.Y/=2;
            	SMALL_RECT Window={0,0,ConsoleSize.X,ConsoleSize.Y};
            	SetConsoleWindowInfo(H,1,&Window);
            	CHAR_INFO *Screen=new CHAR_INFO[ConsoleSize.Y   * ConsoleSize.X];
            	COORD BufferCoord={0,0};
				char HeChallengesMe[]="OK123456789000Man:)))____ Its==/*-By!@#$ME!@$Mostafa36a2>>>>.;.,";
#define mod sizeof(HeChallengesMe)/sizeof(char)
			srand(time(0));
			matrixInfo *MScreen=new matrixInfo[ConsoleSize.Y   * ConsoleSize.X];
				for(int y=0;y<ConsoleSize.Y;y++)
                    	for(int x=0;x<ConsoleSize.X;x++)
						{
							Screen[y*ConsoleSize.X+x].Char.AsciiChar=HeChallengesMe[rand()%mod];
							MScreen[y*ConsoleSize.X+x].col=x;
							MScreen[y*ConsoleSize.X+x].timer=0;
						}
				for(int i=0;i<0x36a2;i++)
            	{
				for(int density=0;density<Density;density++)
					MScreen[rand()%(ConsoleSize.Y*ConsoleSize.X)].timer++;
            	for(int y=0;y<ConsoleSize.Y;y++)
                    	for(int x=0;x<ConsoleSize.X;x++)
						{
							Screen[y*ConsoleSize.X+x].Attributes=color(ConsoleSize.X,MScreen[y*ConsoleSize.X+x]);
						}
            	WriteConsoleOutputA(H,Screen,ConsoleSize,BufferCoord,&Window);
            	}
  }

اقتباس
لكن إذا كانت محاولتي أحسن من محاولتك سأعطيك -1

محاولاتك أحسن دائماً أخي أحمدhappy.gif ...لكن هذا مجالي cool.gifwink.gif

المرفقات
12345.png
4
#15

وهذه مع المزيد من التحكم ...

#include<windows.h>
#include<cstdlib>
#include<ctime>


unsigned int Density=6;
unsigned int Speed=2;
unsigned int Sp=1;//works if Speed<2 ...more big .. more slow
const Length=100;//max line length before vanish
int floatSpeedCounter=0;

struct matrixInfo
{
	int col;
	int timer;
};
int color (int x,matrixInfo &a)
{
	if(a.timer)
			a.timer++;
	{
		int colors[]={0,8,2,2,0xa,0xa,0xf,0xf,0xf,2,2,0xa,0xa};
	if(a.timer>2*Length)a.timer=0;
	if(a.timer>Length)
	{
		a.timer++;
		if((13-(a.timer-100))>0)return colors[(13-(a.timer-100))%13];
		return 0;
	}
		if(a.timer>7)
			if(Speed>2)
			for(int speed=0;speed<Speed;speed++)
				if(a.col%2)(*(&a-x)).timer++;
				else (*(&a+x)).timer++;
			else if(floatSpeedCounter++%Sp==0)
				if(a.col%2)(*(&a-x)).timer++;
				else (*(&a+x)).timer++;
		if(a.timer>14)
			return 2;
		return colors[a.timer%13];
	}
	return 0;
}
  void main()
  {
            	HANDLE H=GetStdHandle(STD_OUTPUT_HANDLE);
            	COORD ConsoleSize=GetLargestConsoleWindowSize(H);
            	SetConsoleScreenBufferSize(H,ConsoleSize);
				ConsoleSize.X/=2;ConsoleSize.Y/=2;
            	SMALL_RECT Window={0,0,ConsoleSize.X,ConsoleSize.Y};
            	SetConsoleWindowInfo(H,1,&Window);
            	CHAR_INFO *Screen=new CHAR_INFO[ConsoleSize.Y   * ConsoleSize.X];
            	COORD BufferCoord={0,0};
				char HeChallengesMe[]="OK123456789000Man:)))____ Its==/*-By!@#$ME!@$Mostafa36a2>>>>.;.,";
#define mod sizeof(HeChallengesMe)/sizeof(char)
			srand(time(0));
			matrixInfo *MScreen=new matrixInfo[ConsoleSize.Y   * ConsoleSize.X];
				for(int y=0;y<ConsoleSize.Y;y++)
                    	for(int x=0;x<ConsoleSize.X;x++)
						{
							Screen[y*ConsoleSize.X+x].Char.AsciiChar=HeChallengesMe[rand()%mod];
							MScreen[y*ConsoleSize.X+x].col=x;
							MScreen[y*ConsoleSize.X+x].timer=0;
						}
				for(int i=0;i<0x36a2;i++)
            	{
				if(i%10*Density==0)
					for(int density=0;density<Density;density++)
					MScreen[rand()%(ConsoleSize.Y*ConsoleSize.X)].timer++;
            	for(int y=0;y<ConsoleSize.Y;y++)
                    	for(int x=0;x<ConsoleSize.X;x++)
						{
							Screen[y*ConsoleSize.X+x].Attributes=color(ConsoleSize.X,MScreen[y*ConsoleSize.X+x]);
						}
            	WriteConsoleOutputA(H,Screen,ConsoleSize,BufferCoord,&Window);
            	}
  }

نلتقي بإذن الله

4
#16

السلام عليكم

جميلة يا أحمد فكرة المحاكاه لمشهد من فلم الماتركس , دائماً مواضعيك مميزه

وجميلة محاولتك يا مصطفى يا ملك التلاعب بالكنسولsmile.gif

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#17

يا مرحباً بالغالي أحمد أبو السعود ... كيفك حالك أخي...

اقتباس
جميلة يا أحمد فكرة المحاكاه لمشهد من فلم الماتركس , دائماً مواضعيك مميزه

بالفعل ... أول ما قرأت العنوان ظننت أننا سنحاكي هذا المشهد ..

matrix-movie.jpg

أو هذا ..\

matrix_1.jpg

لكن الحمد لله .. ربنا لطف فينا ...

اقتباس
وجميلة محاولتك يا مصطفى يا ملك التلاعب بالكنسول

لست كذلك .. ولكن أسعى لأكون أفضل بإذن الله .... (هناك الكثير من الناس بارعين بأمور سخيفة ..لا يغرّكsleep.gif)

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 15 سبتمبر 2012 في 07:12

#18

جميل جداً أخي مصطفى, محاولات رائعة بارك الله فيك :)

+1 لكل محاولة.

#19
اقتباس
جميل جداً أخي مصطفى, محاولات رائعة بارك الله فيك

الحمد لله .. أنا تلميذك ..أستاذي happy.gif...هذا من فضل الله عزوجل ثم بفضل تشجيعك الدائم ومتابعتك ..جزاك الله خيراً ..smile.gif

المرجع

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 15 سبتمبر 2012 في 16:39

مواضيع مشابهة