אפר׳ 15

פרויקט באסמבלי

7 תגובות

היי אני עושה משחק פקמן באסמבלי ויש לי כמה שאלות ואשמח לעזרה:

1. אני רוצה לעשות טיימר מדויק של דקות- שכל פעם תהיה בדיקה אם עברה חצי דקה ואם כן יציאה מהמשחק ואם לא המשך.

השתמשתי בפסיקה 2ch int21h אבל יש לי בעיה של אי דיוק- השעון לא מדויק וכל פעם יש בדיקה שונה

proc startTime

push ax

push bx

push cx

push dx

mov ah, 2ch

int 21h ;ch- our, cl- minutes, dh- seconds, dl- hundreths secs

mov [sec_count], dh

;return

pop dx

pop cx

pop bx

pop ax

ret

endp startTime

 

 

proc checkTime ;check if 20 sec passed

push cx

push dx

mov ah, 2ch

int 21h ;ch- our, cl- minutes, dh- seconds, dl- hundreths secs

cmp [sec_count] ,dh

je return

mov [sec_count], dh

dec [time]

return: ;return

pop dx

pop cx

ret

endp checkTime

זה מה שכתבתי, אם יש טעות אשמח שתגידי לי.

2. אני רוצה להדפיס נקודות לבנות שהפקמן יצטרך לאכול אותן . השאלה אם לעשות נקודות רנדומליות שמופיעות בזמנים שונים או במיקומים שונים או שכאשר אני מדפיסה את המסך ב bmp אז כבר להדפיס עם הנקודות

איזה דרך עדיפה או יעילה יותר לדעתך?

אפר׳ 16

היי :) 1. - באופן כללי, אשמח אם תעלי את הקוד שלך שמגדיר את sec_count ו time. - מה שאני מבין מההקשר של הפונק' שפרסמת: StartTime בעצם מופעלת פעם אחת בתכנית ושומרת רק את השניות שהגיעו בפעם הראשונה שקראו לפונק. כעקרון יש בעיה עם הגישה הזו, שכן אם שמרת את השנייה 59 במחשב, ועברה לה הדקה - אז הריי שבקריאת הפונק' הבאה תקבלי 00\01\02, וכשתבצעי בדיקה זה יכול ליצור דרישה להתייחסות ספציפית במקרי הקצה הללו. בלי קשר לדרישות הקצה הללו (במידה ולא התייחסת אלייהן בקוד שלא העלאת לפה) - אני רואה שבcheckTime את בעצם מבצעת בדיקה להאם מס' השניות שקיבלת הרגע הוא זהה למס' השניות שספרת בפעם הקודמת שהפונק' הופעלה. - ההיגיון הזה אמור להיות תקף לאם את מעוניינת לזהות שעברה לה דקה. - בכדי לזהות שעברו 20 שניות, את בעצם מעוניינת לבצע פעולת SUB בין שני מספרים שמייצגים שניות. - שימי לב שבמידה ועברה דקה (כמו שתיארתי במקרה הקצה בתחילת התשובה) החיסור לא בהכרח יוכל לצאת מס' חיובי, וצריכים להתיייחס לכך בהתאם. - חוץ מיזה, למה את מבצעת dec[time] דווקא כאשר השניות לא שוות מבחנתך? 2. בגלל שהשאלה שלך נוגעת לעניין סיבוכיות, למיטב ידעתי נרצה לעשות שימוש בפעולות שדורשות מינימום משאבים מהמחשב שלנו. כשאת מדפיסה משהו למסך, אני מבין שבעצם את סה''כ תשני את הערך המספרי שאותו פיקסל מציג - כלומר פעולה בודדת שמתבצעת בעבור כל נק' שתרצי לשים ברגע נתון על המסך. מצד שני, אם תדפיסי מסך שלם (בשביל השינוי הבודד בתמונה שמתבטא במס' נקודות מזערי שהשתנו) בעזרת קובץ bmp (אם אני מבין אותך נכון) שאליו שמת את הנקודות - תקבלי ניצול לא אופטימאלי של משאבים. - יש סיכוי שבגלל שאיני מכיר את השאלה שאת אמורה לפתור אז התשובה שלי לא ככ עוזרת. - אני יוצא מנקודת הנחה שאת המסך הראשוני למשחק את מעלה מתוך תמונה קבועה - אז אם את מעוניינת להציג נקודות שיעלמו ממנה, עדיף שהנקודות לא יהיו עלייה מלחתחילה.

היי קודם כל תודה רבה על העזרה והתשובות המפורטות!

1. זה הקוד המלא שכתבתי בהקשר של הבדיקת שעון-טיימר

DATASEG

sec_count db 0

time dw 20

CODESEG

proc startTime

push ax

push bx

push cx

push dx

mov ah, 2ch

int 21h ;ch- our, cl- minutes, dh- seconds, dl- hundreths secs

mov [sec_count], dh

;return

pop dx

pop cx

pop bx

pop ax

ret

endp startTime

 

 

proc checkTime ;check if 20 sec passed

push cx

push dx

mov ah, 2ch

int 21h ;ch- our, cl- minutes, dh- seconds, dl- hundreths secs

cmp [sec_count] ,dh

je return

mov [sec_count], dh

dec [time]

return: ;return

pop dx

pop cx

ret

endp checkTime

start:

call startTime

call checkTime

cmp [time], 1

je stop

jmp goon -קפיצה להמשך לולאה שעושה דברים נוספים

stop:

; Return to text mode

mov ah, 0

mov al, 2

int 10h

לא ממש הבנתי מה אני צריכה לשנות בקוד כדי להפוך אותו למדויק - במיוחד במקרי הקצה שהסברת

2. לגבי הנקודות במשחק - החלטתי להדפיס תמונת מסך קבועה כ bmp ועליה להדפיס נקודות לבנות. המשחק שאני בונה הוא פקמן אם אתה מכיר ורציתי לשאול באיזו דרך אתה ממליץ להדפיס את הנקודות הלבנות במיקומים שונים רנדומליים ואיך לגרום לכך שכאשר הפקמן מגיע לנקודה וכביכול "אוכל" אותה אז שהיא תיעלם. איזה תנאי לעשות?

אשמח שתענה שתוכל

תודה , ליה :)

אפר׳ 18

היי, ובכייף :)

לכל מקרה, הינה מה שאני חושב: 1.

- אפשר לראות ש startTime מעדכן את sec_count בשנייה המסויימת שנקרא ב"start" (פעם אחת בקוד למיטב הבנתי) - לאחר מיכן, את מבצעת בדיקה כזו (ב" checkTime "):

cmp [sec_count],dh je return

- שבעצם בודקת האם את נמצאת עדיין באותה השנייה שנקלטה פעם קודמת בsec_count - אחרת, את מעדכנת את השנייה החדשה שנקלטה ומעדכנת כי עברה שנייה

mov [sec_count], dh dec [time]

- כך שאם אני מבין נכון, מה שאני מצפה שיקרה זה שהקוד הראשי קופץ לפי

cmp [time], 1 je stop .. jmp goon

- אז כנראה שעד דואגת ב "stop" להחזיר את time ל 20 (כדי שבקריאה הבאה ל checkTime הוא יוכל שוב למנות כפי כבר מימשת). - אך איני רואה איפה את קוראת לפונק checkTime, שכן את מצפה שהיא תבצע 20 פעם

dec [time]

לכל מקרה, אני חושב שהבעיה במה שרשמת היא סה''כ תלוייה בשימוש נכון בלוגיקה של החלפת שניות - שאולי טיפה התבלבלה לך. (כעקרון צריכים לחזור מס' פעמים לפונק checkTime ולדעתי זה יעבוד) אם היית מבקשת ממני להציע לך משהו, הייתי חושב על לבצע חיסור של מס' השניות שעברו מרגע שהתחלת startTime ולהשוות ל 20 בכל פעם. בכדי למנות שניות שעברו ניתן לבצע לולאה שבודקת:

*כמובן, ניתן גם פשוט לעדכן בdo_something את time עם dec מתאים. אך תשימי לב שאת קוראת לפרוצדורה בצורה מתאימה. **אפשר גם לבדוק האם החיסור (שזה בעצם הזמן שעבר מאז הקריאה האחרונה) מתחלק ב20 (לאחר שהיה זמן שלא התחלק ב20) ***בלי קשר למקרי הקצה שתיארתי, השיטה של למנות שניות פותרת אותך מהחשיבה של מקרי הקצה הללו, כי בעצם את בודקת סה''כ כמה שניות 'זזות', ולא צריכה להתחשב בהאם השניות שהגיעו התאפסו כי התחלפה שנייה :)

head: MOV AH,2C INT 21 MOV BH,DH // store 'current sec' in BH getsec: // update new second in DH MOV AH,2C INT 21 CMP BH,DH // compares new secs with 'current sec' JNE do_something // like counting to a variable JMP getsec // gets here only if it's the same second do_something: // gets here only if second had passed // JMP head

2. האמת שלא עולה משהו מיוחד בדעתי, אני מניח שאת עובדת עם מסך שמחולק לפי מערך דו ממדי (מטריצה). אם כך, אז הייתי פשוט קובע צבע מיוחד עבור האוכל שהדמות צריכה לאכול. מה שכן, בכדי להחזיר את הצבע לקדמותו ברגע שדמות אוכלת את האוכל, כנראה שתצטרכי לשמור את ערך הצבע הספציפי (אלא אם כן הצבעים קבועים בכל האזור בתמונה - יתרון) לגבי מיקומים רנדומלים של האוכל, הייתי חושב על ליצור אולי מנגנון קבוע שמביא מיקומים עם חוקיות מסויימת למיקום במטריצה(שציינתי קודם). במידה ויש לך רעיון איך ליצור מספרים רנדומליים בתחום כלשהו את מוזמנת לעשות זאת :). - וסלחי לי אם התשובה שלי לא ברורה, אני לא מכיר את השאלה לפרטי פרטים... אז אם תוכלי לפרט טיפה יותר את החלק הזה זה יועיל לי מאוד.

היי ניסיתי למעשה לקרוא לפרוצדורה checkTime בפור של 20 פעמים כדי שכל פעם בבדיקה ירד אחד

הפרוצדורות נשארו כמו שהן (כי לא ידעתי מה לרשום בשיטה של החיסור שנייה סופית פחות שנייה התחלתית)

שיניתי רק בזימון של הפעולה לכך:

 

mov cx,20

loop1:

call checkTime

cmp [time],1

je game_over

jmp count1

loop loop1

אך זה עדיין לא עובד (מה הבעיה?)

 

הבעיה היא שמה עשיתי ומה שהצעת זה בעצם דיליי שכאשר השעון פועל כל המשחק ייעצר, אני למעשה צריכה שהשעון יפעול בזמן שהשחקן נע ויש בדיקת צבעים

מקווה שהבנת את הבעיה פה

אם אני שם לב נכון את מבצעת LOOP בתוך הפרוצדורה. את לא רוצה שהפרוצדורה תעבוד 20 פעם. את רוצה פונק' חיצונית שתקרא לה 20 פעם - במקביל לשאר הקוד שממשיך להזיז את השחקן על הלוח שלך. כלומר - je 20SecPassed במקום je game_over, שכן את לא מסיימת את המשחק, את רוצה סה''כ להתריע (לקוד נוסף שלך) שיידע שעברו 20 שניות. אם הפונק' שאת מציעה לבדיקת 20SecPassed מבצעת LOOP בתוכה - אז ברור שהיא תעשה לך דיליי בקוד, כי היא לא מאפשרת לשום קוד נוסף לעבוד עד שלא עברו 20 שניות. אני מקווה שאני ברור - אם לא, עדיף שתוסיפי פשוט את הקודים הרלוונטים.

היי יש אפשרות שתתן לי את המייל שלך ואשלח לך את המשחק שלי

אני ממש מסתבכת פה ואני עוד מעט צריכה להגיש את הפרויקט

Newest Posts
  • היי, יש לי עבודת בית ואשמח אם תעזרו לי :) והעבודה היא : להביא 2 הבדלים בין מערך לרשימה מקושרת.
  • היי יש לי מבחן במדעי המחשב ואשמח לעזרה בכמה שאלות - 1. מה זאת שפה רגולרית? האם אוטומט סופי דטרמיניסטי נחשב לשפה רגולרית? 2. כאשר שואלים אותי על האיבר האחרון במחסנית- הכוונה לראשון שנכנס? 3. מה זה Node? 4. איך יודעים מה הסיבוכיות/סדר הגודל של פעולה על מחסנית 5. איך אני כותבת פעולה שמקבלת מחסנית עם רצפים של מספרים ומחזירה את אותה מחסנית רק עם מופע אחד לכל מספר תודה מראש על העזרה!
  • היי קוראים לי ענבל, תלמידת כיתה יא במגמת מדעי המחשב ותוכנית הקלאב. לאחרונה התעניינתי בבניית משחק מציאות מדומה אך לצערי מצאתי רק תוכנה אחת חינמית והיא כולה בשפת c ואני לומדת java ו pycharm. אשמח אם מישהי שהתנסתה בנושא בעבר תוכל להמליץ לי על תוכנה

עוצב ונבנה ע״י Kukushka

© 2018 כל הזכויות שמורות לסייברגירלז