תכנות משחקי מחשב יכול להיות המשרה המאתגרת ביותר (ואולי הטובה ביותר לשלם) ש- a מתכנת יכול לקבל. משחקים ברמה העליונה דורשים את הטוב ביותר הן מהמתכנתים והן מהמחשבים.
ויז'ואל בייסיק 6 עוקף ביסודיות כפלטפורמה לתכנות משחקים. (זה מעולם לא היה כזה. אפילו ב"ימים הטובים ביותר ", מתכנתי משחק רציניים לעולם לא ישתמשו בשפה ברמה גבוהה כמו VB 6 מכיוון שאתה פשוט לא יכול להשיג את החיתוך ביצועי קצה שרוב המשחקים דורשים.) אבל המשחק "Tic Tac Toe" הפשוט הוא מבוא נהדר לתכנות שהוא קצת יותר מתקדם מאשר "שלום עולם!"
זוהי הקדמה נהדרת לרבים מהמושגים הבסיסיים של תכנות מכיוון שהיא משלבת טכניקות הכוללות:
- השימוש של מערכים. סמני ה- X וה- O נשמרים במערכים נפרדים וכל המערכים מועברים בין פונקציות כדי לעקוב אחר התקדמות המשחק.
- שימוש בגרפיקה ברמה VB 6: VB 6 לא מציע יכולת גרפית נהדרת, אבל המשחק הוא מבוא טוב למה שקיים. חלק גדול משאר הסדרות הללו הוא בחינה כיצד GDI +, הדור הבא של הגרפיקה של מיקרוסופט, מחליף את הגרפיקה ברמה VB 6.
- שימוש בחישובי מתמטיקה לבקרת התוכנית: התוכנית משתמשת במודולו חכם (Mod) ומספר שלם חישובי חלוקה באמצעות מערכי הסמן של שני המשחקים כדי לקבוע מתי יש "ניצחון" בן שלושה מרכיבים התרחש.
מחלקת התכנות במאמר זה אולי קצת מעבר לרמת ההתחלה, אך היא אמורה להיות טובה עבור מתכנתים "בינוניים". אבל בואו נתחיל ברמה היסודית להמחיש כמה מהמושגים ונתחיל בעבודה שלכם ויז'ואל בייסיק קריירת תכנות משחק. אפילו סטודנטים מתקדמים מזה עשויים לגלות שמעט מאתגר להשיג את האובייקטים בצורה בדיוק.
איך לשחק טיק טק טו
אם מעולם לא שיחקת איקס עיגולהנה הכללים. שני שחקנים מתחלפים בהצבת Xs ו- Os לשדה משחק 3 x 3.
לפני תחילת המשחק, על שני השחקנים להסכים מי יעבור ראשון ומי יסמן את מהלכיו באיזה סמל. לאחר הצעד הראשון, השחקנים מניחים לסירוגין את סימניהם בכל תא ריק. מטרת המשחק היא להיות השחקן הראשון עם שלוש סימנים בקו אופקי, אלכסוני או אנכי. אם אין תאים ריקים ולאף אחד מהשחקנים אין שילוב מנצח, המשחק הוא תיקו.
לפני שתתחיל בקידוד בפועל, תמיד כדאי לשנות את שמות הרכיבים שבהם אתה משתמש. ברגע שאתה מתחיל קידוד, השם ישמש אוטומטית על ידי Visual Basic כך שתרצה שהוא יהיה השם הנכון. נשתמש בשם הטופס frmTicTacToe ונשנה גם את הכיתוב ל"על טיק טק טו. "
עם הטופס שנקבע, השתמש בבקרת ארגז הכלים כדי לצייר רשת 3 x 3. לחץ על כלי השורה, ואז צייר קו איפה שאתה רוצה אותו. תצטרך ליצור ארבע שורות בדרך זו ולהתאים את אורכן ומיקומם כדי שייראו בסדר. ל- Visual Basic יש כמה כלים נוחים בתפריט הפורמט שיעזרו. זו הזדמנות נהדרת להתאמן איתם.
בנוסף לרשת המשחק, אנו זקוקים לחפצים מסוימים לסמלי ה- X וה- O שיונחו על הרשת. מכיוון שיש תשעה רווחים ברשת, ניצור מערך אובייקטים עם תשעה רווחים, המכונים אלמנטים ב- Visual Basic.
ישנן מספר דרכים לעשות כמעט כל דבר בסביבת הפיתוח Visual Basic, ויצירת מערכי בקרה אינה יוצאת מהכלל. ככל הנראה הדרך הקלה ביותר היא ליצור את התווית הראשונה (לחץ וצייר בדיוק כמו כלי השורה), שם אותה, קבע את כל התכונות (כגון Font ו- ForeColor) ואז יצר ממנו עותקים. VB 6 ישאל אם ברצונך ליצור מערך בקרה. השתמש בשם lblPlayGround עבור התווית הראשונה.
כדי ליצור את שמונת האלמנטים האחרים של הרשת, בחר באובייקט התווית הראשון, הגדר את מאפיין האינדקס לאפס ולחץ על CTRL + C (העתק). כעת תוכלו ללחוץ על CTRL + V (הדבק) כדי ליצור אובייקט תווית אחר. כשאתה מעתיק אובייקטים כאלה, כל עותק יירש את כל המאפיינים למעט אינדקס מהראשון. האינדקס יעלה באחד לכל עותק. זהו מערך בקרה מכיוון שלכולם שם זהה, אך ערכי אינדקס שונים.
אם תיצור את המערך בצורה זו, כל העותקים יערמו זה על זה בפינה השמאלית העליונה של הטופס. גרור כל תווית לאחת ממיקומי הרשת המנגנת. ודא שערכי אינדקס הם רציפים ברשת. ההיגיון של התוכנית תלוי בה. אובייקט התווית עם ערך אינדקס 0 צריך להיות בפינה השמאלית העליונה, והתווית הימנית התחתונה צריכה להיות אינדקס 8. אם התוויות מכסות את הרשת המנגנת, בחרו כל תווית, לחצו לחיצה ימנית ובחרו שלח לחזרה.
מכיוון שיש שמונה דרכים אפשריות לנצח את המשחק, נצטרך שמונה קווים שונים כדי להציג את הניצחון ברשת המשחק. תשתמש באותה טכניקה כדי ליצור מערך בקרה נוסף. ראשית, צייר את הקו, שם אותו linWin והגדר את המאפיין אינדקס לאפס. לאחר מכן השתמש בטכניקת הדבקת העתקה כדי לייצר שבע שורות נוספות. האיור הבא מראה כיצד להגדיר נכון את מספרי האינדקס.
בנוסף לתווית ולחפצי השורה, אתה זקוק לכפתורי פקודה כדי לשחק את המשחק ועוד תוויות כדי לשמור על ציון. השלבים ליצירת אלה אינם מפורטות כאן, אך אלה הם האובייקטים הדרושים לך.
שני כפתור חפצים:
- cmdNewGame
- cmdResetScore
מסגרת אובייקט fraPlayFirst הכולל שני לחצני אפשרות:
- שחקן
- משחק אופטי
מסגרת אובייקט fraScoreBoard המכיל שש תוויות. רק lblXScore ו- lblOScore משתנים בקוד התוכנית.
- lblX
- lblXScore
- lblO
- lblOScore
- lblMinus
- lblColon
לבסוף, אתה צריך גם את אובייקט התווית lblStartMsg כדי 'להסוות' את כפתור ה- cmdNewGame כאשר אין ללחוץ עליו. זה לא נראה באיור למטה מכיוון שהוא תופס את אותו שטח בצורה של כפתור הפקודה. יתכן שתצטרך להזיז את כפתור הפקודה באופן זמני כדי לצייר תווית זו בטופס.
עד כה לא בוצע קידוד VB, אך סוף סוף אנו מוכנים לעשות זאת.
אתחול
עכשיו אתה מתחיל סוף סוף להתחיל לקודד את התוכנית. אם עדיין לא עשית זאת, ייתכן שתרצה להוריד את קוד המקור לעקוב אחרי שתסביר את פעולת התוכנית.
אחת ההחלטות העיצוביות הראשונות לקבל היא כיצד לעקוב אחר 'המצב' הנוכחי של המשחק. במילים אחרות, מהם ה- X וה- OS הנוכחיים ברשת המשחק ומי עובר הלאה. המושג 'מדינה' הוא קריטי בהרבה תכנות, ובמיוחד חשוב לתכנות ASP ו- ASP.NET עבור האינטרנט
ישנן כמה דרכים שניתן לעשות זאת, ולכן זהו צעד קריטי בניתוח. אם הייתם פותרים את הבעיה בעצמכם, מומלץ לצייר תרשים זרימה ולנסות אפשרויות שונות עם 'נייר שריטה' לפני שתתחיל קידוד כלשהו.
הפיתרון שלנו משתמש בשני "מערכים דו מימדיים" מכיוון שזה עוזר לעקוב אחר 'מצב' פשוט על ידי שינוי מדדי המערך בלולאות התוכנית. המצב של הפינה השמאלית העליונה יהיה באלמנט המערך עם אינדקס (1, 1), הפינה השמאלית העליונה תהיה (1, 3), הימנית התחתונה ב (3,3), וכן הלאה. שני המערכים שעושים זאת הם:
iXPos (x, y)
ו
iOPos (x, y)
יש הרבה דרכים שונות שניתן לעשות זאת, ופתרון ה- VB.NET הסופי בסדרה זו מראה לכם כיצד לעשות זאת באמצעות מערך חד-ממדי יחיד.
התכנות לתרגום מערכים אלה להחלטות לנצח של שחקנים ותצוגות גלויות בטופס מופיעות בעמוד הבא.
אתה צריך גם כמה משתנים גלובליים כדלקמן. שימו לב כי אלה נמצאים בקוד הכללי וההצהרות של הטופס. זה הופך אותם "רמת מודול" משתנים שניתן להפנות אליהם בכל מקום בקוד עבור טופס זה. למידע נוסף בנושא זה, בדוק את הבנת היקף המשתנים בעזרה של Visual Basic.
ישנם שני תחומים שבהם המשתנים מאתחלים בתוכנית שלנו. ראשית, כמה משתנים מאתחלים בזמן שהטופס frmTicTacToe נטען.
טופס משנה פרטי_Load ()
שנית, לפני כל משחק חדש, כל המשתנים שצריך לאתחל לערכי התחלה מוקצים בתת-תת-תחום אתחול.
Sub InitPlayGround ()
שים לב כי אתחול עומס הטופס קורא גם אתחול המשחקים.
אחת המיומנויות הקריטיות של מתכנת היא היכולת להשתמש במתקני הבאגים בכדי להבין מה עושה הקוד. אתה יכול להשתמש בתוכנית זו כדי לנסות:
- עובר בקוד באמצעות מקש F8
- הגדרת שעון על משתני מפתח, כמו sPlaySign או iMove
קביעת נקודת שבירה ושאילתת לערך המשתנים. לדוגמה, בלופ הפנימי של האתחול:
lblPlayGround ((i - 1) * 3 + j - 1). הכיתוב = ""
שים לב שתוכנית זו מראה בבירור מדוע שיטת תכנות טובה לשמור נתונים במערכים בכל מקום אפשרי. אם לא היו לך מערכים בתוכנית זו, היית צריך לכתוב קוד כזה:
Line0.Visible = שווא
Line1.Visible = שווא
Line2.Visible = שווא
Line3.Visible = שווא
Line4.Visible = שווא
Line5.Visible = שווא
Line6.Visible = שווא
Line7.Visible = שווא
במקום זה:
עבור i = 0 עד 7
linWin (i). Visible = False
הבא אני
לעשות צעד
אם ניתן לחשוב על חלק כלשהו במערכת כ'לב ', זה lroPlayGround_Click תת-רחמי. תת-קרנה זו נקראת בכל פעם ששחקן לוחץ על רשת המשחק. (הקליקים חייבים להיות בתוך אחד מתשעת האלמנטים של lblPlayGround.) שימו לב שלתת-השמש הזו יש טיעון: (אינדקס כמספר שלם). רוב 'תתי-המשנה האירועים' האחרים, כמו cmdNewGame_Click () אינם. אינדקס מציין על איזה אובייקט תווית שלחץ. לדוגמה, אינדקס יכיל את הערך אפס בפינה השמאלית העליונה של הרשת ואת הערך שמונה בפינה השמאלית התחתונה.
לאחר ששחקן לוחץ על ריבוע ברשת המשחק, לחצן הפקודה כדי להתחיל משחק אחר, cmdNewGame, "מופעל" על ידי הצגתו לגלוי. המצב של כפתור הפקודה עושה חובה כפולה מכיוון שהוא משמש גם כמשתנה להחלטה בוליאני בהמשך התוכנית. השימוש בערך המאפיין כמשתנה החלטה בדרך כלל מתייאש מכיוון שאם יהיה צורך אי פעם לשנות את התוכנית (נניח, למשל, להפוך את לחצן הפקודה cmdNewGame גלוי כל הזמן), ואז התוכנית תיכשל במפתיע מכיוון שאולי אינך זוכר שהיא משמשת גם כחלק מהתוכנית היגיון. מסיבה זו, תמיד כדאי לחפש בקוד התוכנית ולבדוק את השימוש בכל דבר שתשנה בעת ביצוע תחזוקת התוכנית, אפילו לערכי הנכסים. תוכנית זו מפרה את הכלל, בין השאר כדי להבהיר את הנקודה הזו, ובחלקה מכיוון שמדובר בקטע קוד פשוט יחסית בו קל יותר לראות מה נעשה ולהימנע מבעיות אחר כך.
בחירת שחקן של ריבוע משחק מעובדת על ידי קריאת תת-השמע של GamePlay עם אינדקס כטיעון.
מעבד את המהלך
ראשית, תבדוק אם נלחץ על ריבוע לא תפוס.
אם lblPlayGround (xo_Move) .Caption = "" ואז
ברגע שאנו בטוחים שמדובר במהלך לגיטימי, מונה התנועה (iMove) מוגדל. שתי השורות הבאות מעניינות מאוד מכיוון שהם מתרגמים את הקואורדינטות מהחד-ממדי אם רכיב lblPlayGround מערך לאינדקסים דו מימדיים שבהם אתה יכול להשתמש ב- iXPos או ב- iOPos. חלוקת Mod ו- heleger ('הקו האחורי') הם פעולות מתמטיות בהן אינך משתמש כל יום, אך הנה דוגמה נהדרת המראה כיצד הם יכולים להועיל מאוד.
אם lblPlayGround (xo_Move) .Caption = "" ואז
iMove = iMove + 1
x = בינוני (xo_Move / 3) + 1
y = (xo_Move Mod 3) + 1
הערך xo_Move 0 יתורגם ל (1, 1), 1 ל- (1, 2)... 3 עד (2, 1)... 8 עד (3, 3).
הערך ב- sPlaySign, משתנה עם היקף מודול, עוקב אחר השחקן שעשה את המהלך. לאחר עדכון מערכי המהלכים, ניתן לעדכן את רכיבי התווית ברשת המנגנת באמצעות הסימן המתאים.
אם sPlaySign = "O" ואז
iOPos (x, y) = 1
iWin = CheckWin (iOPos ())
אחרת
iXPos (x, y) = 1
iWin = CheckWin (iXPos ())
סוף אם
lblPlayGround (xo_Move) .Caption = sPlaySign
לדוגמה, כאשר נגן ה- X לוחץ על הפינה השמאלית העליונה של הרשת, למשתנים יהיו הערכים הבאים:
מסך המשתמש מציג רק X בתיבה השמאלית העליונה, ואילו ל- iXPos יש 1 בתיבה השמאלית העליונה ו- 0 בכל האחרים. ל- iOPos יש 0 בכל תיבות.
הערכים משתנים כאשר נגן O לוחץ על הריבוע המרכזי של הרשת. כעת ה- iOPos מראה 1 בתיבה המרכזית ואילו במסך המשתמש מופיע X בחלק השמאלי העליון ו- O בתיבה המרכזית. ה- iXPos מציג רק את 1 בפינה השמאלית העליונה, עם 0 בכל התיבות האחרות.
עכשיו שאתה יודע לאן שחקן לחץ, ואיזה שחקן עשה את הלחיצה (באמצעות הערך ב sPlaySign), כל שעליכם לעשות הוא לגלות אם מישהו זכה במשחק ולגלות כיצד להראות את זה ב- תצוגה.
למצוא ווינר
לאחר כל מהלך, פונקציית CheckWin בודקת את השילוב המנצח. CheckWin פועל על ידי הוספת כל שורה, על פני כל עמודה ודרך כל אלכסון. מעקב אחר השלבים דרך CheckWin באמצעות תכונת הבאגים של Visual Basic יכול להיות מאוד חינוכי. מציאת זכייה היא עניין של ראשית, לבדוק אם נמצאו שלוש 1 בכל אחת מהבדיקות הבודדות במשתנה iScore, ואז החזרת ערך "חתימה" ייחודי ב- Checkwin המשמש כאינדקס המערך לשינוי המאפיין הנראה של אלמנט אחד ב- linWin מערך רכיבים. אם אין מנצח, CheckWin יכיל את הערך -1. אם יש מנצח, התצוגה מעודכנת, לוח התוצאות משתנה, מוצגת הודעת מזל טוב והמשחק מופעל מחדש.
בואו לעבור על אחת מהבדיקות בפירוט כדי לראות איך זה עובד. האחרים דומים.
'בדוק שורות ל -3
עבור i = 1 עד 3
iScore = 0
CheckWin = CheckWin + 1
עבור j = 1 עד 3
iScore = iScore + iPos (i, j)
הבא ג'
אם iScore = 3 אז
פונקצית יציאה
סוף אם
הבא אני
הדבר הראשון שיש לשים לב הוא שמונה האינדקס הראשון i סופר את השורות ואילו ה- j השני סופר על פני העמודות. הלולאה החיצונית, ואז פשוט עוברת משורה אחת לשנייה. הלולאה הפנימית סופרת את ה- 1 בשורה הנוכחית. אם יש שלושה, אז יש לך מנצח.
שימו לב שאתה עוקב אחר המספר הכולל של המשבצות שנבדקו במשתנה CheckWin, שהוא הערך שהוחזר כאשר פונקציה זו מסתיימת. כל שילוב מנצח יסתיים עם ערך ייחודי ב- CheckWin בין 0 ל- 7 המשמש לבחירת אחד האלמנטים במערך הרכיבים linWin (). זה חשוב גם לסדר הקוד בפונקציה CheckWin! אם העברתם את אחד מהגושי של קוד לולאה (כמו זה שלמעלה), הקו השגוי יימשך על רשת המשחק כאשר מישהו ינצח. נסה את זה ותראה!
פרטי הגמר
הקוד היחיד שטרם נדון הוא תת-השמע למשחק חדש ותת--השערה שתאפס את הניקוד. שאר ההיגיון במערכת הופך את יצירתם לקלים למדי. כדי להתחיל משחק חדש, עליכם רק להתקשר לשאלת המשנה של InitPlayGround. לנוחיות לשחקנים מכיוון שניתן היה ללחוץ על הכפתור באמצע המשחק, אתה מבקש אישור לפני שתמשיך. אתה גם מבקש אישור לפני שתפעיל מחדש את לוח התוצאות.