משחק החיים

בפרויקט זה יש לכתוב סימולציה של משחק החיים ( Conway’s Game of Life ).
המשחק מתקיים על לוח דו-מימדי אינסופי של תאים. בתחילה ( בדור 0 או בזמן t=0 ) מספר סופי של תאים מוגדרים כ-"חיים". שאר התאים מוגדרים כ-"מתים". בכל דור, התאים יכולים להשאר חיים או מתים, או להחליף מצב בהתאם לחוקים מסויימים. לפיכך מהלך המשחק תלוי בקונפיגורציה ההתחלתית ובאוסף החוקים הקבוע. מצבו החדש של תא תלוי במצבו הנוכחי ( חי או מת ) ובמצב הנוכחי של שמונת שכניו ( תאים הנוגעים בו בצלע או בפינה ).

חוקי המשחק

לידה: תא שהיה מת בזמן t הופך להיות חי בזמן t+1 אם בדיוק שלושה מתוך שמונת שכניו היו חיים בזמן t.

מוות מצפיפות: תא שהיה חי בזמן t וארבעה או יותר משמונת שכניו היו חיים בזמן t, ימות בזמן t+1.

מוות מבדידות: תא שיש לו שכן אחד חי או שאין לו שכנים חיים בזמן t, ימות בזמן t+1.

לסיכום החוקים, תא חי ישאר חי אם יש לו בדיוק 2 או 3 שכנים חיים, אחרת הוא ימות. תא מת יהפוך להיות חי אם יש לו בדיוק 3 שכנים חיים, אחרת הוא ישאר מת.

הסימולציה

הסימולציה תתבצע על מלבן בגודל קבוע של  תאים, עם M שורות ו-N עמודות. בפרויקט זה נגדיר M=24 ו-N=80. יש להשתמש במערך דו-מימדי של char, כאשר רווח יסמן תא מת וכוכבית (*) תסמן תא חי.

יש לשים לב לכך שלתאים על גבולות הלוח יש פחות משמונה שכנים. הספירה של מספר התאים החיים והמתים צריכה להתחשב בגבולות הלוח. 
מספרי השורות הם בתחום 0 עד M-1 ומספרי העמודות הם בתחום 0 עד N-1.

יש להשתמש בשני מערכים דו-מימדיים בגודל  כדי לייצג את דור t ודור t+1.

פונקציות למימוש 

יש לממש את הפונקציות הבאות:

#define M 24
#define N 80

int neighbors(char b[M][N],int i,int j);
void next_gen(char b1[M][N],char b2[M][N]);
void get_config (char b[M][N]);
void disp_array(char b[M][N]);
void assign(char b1[M][N],char b2[M][N]);

הפונקציה neighbors מחזירה את מספר השכנים החיים של התא (i,j). הפונקציה צריכה להתחשב בגבולות הלוח בצורה המתאימה.
הפונקציה next_gen משתמשת בפונקציה neighbors כדי לעדכן את מצב הלוח מדור מסויים לדור שאחריו.
הפונקציה get_config קוראת מהקלט מספר סופי של זוגות של מספרים שלמים המייצגים את הקונפיגורציה ההתחלתית.
הפונקציה disp_array מדפיסה למסך את מצב הלוח בדור מסויים.
הפונקציה assign מבצעת העתקה של מצב הלוח.

ממשקים

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

דוגמאות

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

1. R-pentomino		

2. Beehive			

3. Toad			

4. Glider			

5. Bomb			 

6. Monster			

לשם נוחות הבדיקה, לכל אחת משש הדוגמאות לעיל יש להכין קובץ המכיל את הקואורדינטות הרלוונטיות, כאשר את התאים החיים יש למקם במרכז הלוח ככל האפשר. 
יש לוודא שמתקבלת תוצאה זהה לתוצאת ההרצה של ה-Applet המופיע באתר הבא:

http://www.math.com/students/wonders/life/life.html

הנחיות כלליות

1.	תאריך ההגשה: 21 בפברואר 2006.
2.	יש לשים את קבצי המקור ואת ששת קבצי הדוגמה במחיצה ~/intro2cs/project.
3.	קומפילציה באמצעות gcc –Wall צריכה לעבור ללא שגיאות וללא אזהרות.

  

בהצלחה !!!