ساخت بازی حافظه تصویری با پایتون – ساده و مقدماتی
میتوان گفت در حال حاضر، زبان پایتون به یکی از رایجترین زبانهای برنامه نویسی موجود در دنیا تبدیل شده است و با افزایش محبوبیت آن، افراد زیادی به دنبال یادگیری پایتون هستند. با توجه به اینکه یکی از راههای موثر تقویت مهارت برنامهنویسی پایتون، یادگیری آن بهصورت پروژه محور و انجام تمرینها و پروژههای زیاد کوچک و بزرگ است، در این پست، به آموزش توسعه و ساخت بازی حافظه تصویری با پایتون و ۲ مورد از کتابخانه های پایتون، یعنی tkinter و turtle پرداختهایم. بازی حافظه تصویری، خود تمرینی برای ذهن است و به تقویت حافظه و افزایش تمرکز بازیکن نیز کمک بهسزایی میکند. امیدواریم که این مطلب در راستای افزایش سطح مهارت شما در برنامهنویسی پایتون موثر واقع شود.
بازی حافظه تصویری چیست؟
بازی حافظه تصویری، صفحهای جدول مانند دارد که در هر خانه از این جدول، عدد یا شکلی پنهان شده است. هنگام شروع بازی، اَشکال و تصاویر موجود در این خانهها، پنهان هستند و زمانیکه بازیکن (کاربر) روی خانهای کلیک میکند، تصویر نهفته در آن، آشکار میشود. پس از انتخاب خانه بعدی توسط بازیکن (یعنی دومین خانه)، در صورتی که شکل موجود در آن با خانه انتخابی اول یکسان باشد، امتیاز بازیکن افزایش مییابد. برای تکمیل بازی، بازیکن باید تمام خانههایی که دو به دو دارای اشکالی مشابه هستند را پیدا کند.
پس از اینکه بازی به پایان رسید، تعداد حرکات مورد نیاز برای تکمیل بازی نیز روی صفحه نشان داده میشود. در فرایند ساخت بازی حافظه تصویری با پایتون، ۳ سطح «آسان»، «متوسط» و «سخت» را برای کاربر (بازیکن) در نظر میگیریم. در این مطلب، فرایند پیادهسازی و ساخت بازی حافظه تصویری با پایتون با ۲ کتابخانه tkinter و turtle توضیح داده شده است.
ساخت بازی حافظه تصویری با پایتون و ماژول tkinter چگونه است؟
بهتر است برای پاسخ به این سؤال، مروری کوتاه بر ماژول tkinter داشته باشیم.
ماژول tkinter چیست؟
زبان پایتون، گزینههای متعددی را برای توسعه «رابط کاربری گرافیکی» (Graphical User Interface | GUI) در اختیار برنامه نویس قرار میدهد. از بین تمامی این روشها، ماژول Tkinter، متداولترین روشی است که مورد استفاده قرار میگیرد. این ماژول یکی از کتابخانههای گرافیکی پایتون است.
ایجاد اپلیکیشنهای GUI با استفاده از Tkinter، کار آسانی محسوب میشود و در مدت زمانی معقول و با کمترین پیچیدگی، میتواند ما را به هدف برساند تا بتوانیم از این طریق رابطی گرافیکی را برای برنامه خود ایجاد کنیم.
پیش از ادامه این مبحث لازم است یادآور شویم که میتوانید Tkinter را با استفاده از مجموعه آموزش تکینتر، مقدماتی تا پیشرفته فرادرس یاد بگیرید.
مراحل ساخت برنامه دارای رابط گرافیکی با tkinter چگونه است؟
به منظور ساخت رابط کاربری گرافیکی با tkinter برای برنامه پایتونی خود میبایست مراحلی که در ادامه میآید را دنبال کنیم.
- افزودن ماژول tkinter
- ایجاد پنجره اصلی (که به آن Container نیز میگویند)
- افزودن تعداد دلخواهی ابزارک یا «ویجت» (Widget) به پنجره اصلی
- اِعمالِ محرک رویداد به ویجتها
«وارد کردن» (Import کردن) ماژول tkinter در کدهای پایتون، مانند وارد کردن هر ماژول دیگری، انجام میشود. توجه داشته باشید که نام این ماژول در نسخه2.xپایتون، «Tkinter» و در پایتونِ نسخه3.x، «tkinter» است. با دستوری که در ادامه می آید، میتوانیم این ماژول را در کدهای برنامه خود وارد یا ایمپورت کنیم.
1import tkinter
دو متد در tkinter وجود دارند که برنامهنویس هنگام ایجاد اپلیکیشنهای پایتونِ دارای رابط کاربری گرافیکی، لازم است به یاد داشته باشد. در ادامه به شرح هر یک از این ۲ مورد پرداخته شده است.
متد Tk() چیست؟
برای ایجاد پنجره اصلی، یکی از متدهایی که tkinter پیشنهاد میدهد، متد Tk() است که جزئیات آن در ادامه نشان داده شده است.
1Tk(screenName=None, baseName=None, className=’Tk’, useTk=1)
برای تغییر نام پنجره، میبایستclassNameرا برابر با نام مورد نظر قرار دهیم. کد مورد استفاده برای ایجاد پنجره اصلی اپلیکیشن، در ادامه آمده است.
1m = tkinter.Tk()
در دستور فوق،mبیانگر نام شی مربوط به «پنجره اصلی» است.
متد mainloop() چیست؟
متد دیگری که هنگام ایجاد رابط گرافیکی برای برنامه خود باید استفاده کنیم، mainloop() است. این متُد زمانی استفاده میشود که برنامه ما آماده اجرا باشد. این متد در حقیقت، حلقه بینهایتی به حساب میآید که برای اجرای اپلیکیشن استفاده میشود، بهطوریکه منتظر وقوع رویدادی میماند و تا زمانی که پنجره بسته نشده است، آن را پردازش میکند.
کدی که در ادامه میآید، نحوه استفاده از این متد را نشان میدهد.
1m.mainloop()
کدهایی که در ادامه آمدهاند ، نحوه استفاده از ۲ متُدی که در بالا به آنها اشاره کردیم را در قالب یک نمونه برنامه نشان میدهند.
1import tkinter
2m = tkinter.Tk()
3'''
4ویجت ها در اینجا اضافه میشوند
5'''
6m.mainloop(
در این مطلب قصد داریم تا مراحل ساخت بازی حافظه تصویری با پایتون دارای ۳ سطح سختی مختلف برای کاربر را مرور کنیم. برای شروع توسعه این پروژه، ضروری است که کتابخانه tkinter را نصب داشته باشیم.
پیش نیاز های ساخت بازی حافظه تصویری با پایتون چیست؟
برای پیشبرد پروژه ساخت بازی حافظه تصویری با پایتون، نیاز است با مفاهیم پایه زبان برنامه نویسی پایتون و همچنین کتابخانه tkinter آشنا باشیم. برای یادگیری پایتون در سطح مقدماتی، استفاده از دوره آموزشی زیر پیشنهاد میشود:
همچنین برای یادگیری tkinter نیز دوره آموزشی کاربردی و جامعی در پلتفرم فرادرس موجود است که میتوان از آن استفاده کرد:
دوره آموزشی دیگری هم برای ساخت اپلیکیشنهای دسکتاپی با کتابخانه Tkinter موجود است که برای یادگیری بیشتر این کتابخانه، پیشنهاد میشود:
ساختار پروژه ساخت بازی چگونه است ؟
در ادامه، مراحلی فهرست شدهاند که برای ساخت بازی حافظه تصویری با پایتون باید پشت سر بگذاریم.
- نصب ماژول Tkinter
- Import کردن ماژولها و پیکربندی پنجره tkinter
- نوشتن توابع گوناگونی که برای پیادهسازی سطح آسان بازی مورد نیاز هستند.
- نوشتن توابعی که برای ایجاد سطح متوسط بازی لازم داریم.
- کدنویسی توابعی که بهمنظور پیادهسازی سطح دشوار در بازی لازم هستند.
برای ساخت بازی حافظه تصویری با پایتون و کتابخانه tkinter، مراحل فهرست شده بالا را در زیربخشهایی جداگانه شرح و آموزش میدهیم.
گام اول: نصب کتابخانه Tkinter
همانطور که بیان شد، نصب ماژول Tkinter برای شروع پروژه، ضروری است و این ماژول، یکی از آسانترین روشهایی محسوب میشود که با آن میتوان «رابط کاربری گرافیکی» (Graphical User Interface) پروژه را گسترش داد.
برای نصب ماژول tkinter، کافی است تا دستوری که در ادامه میآید را در ترمینال یا خط فرمان پایتون وارد کنید.
1pip install tkinter
گام دوم: افزودن ماژول ها و راه اندازی پنجره tkinter
در این گام، ماژولهای مورد نیاز، وارد و تنظیمات اولیه مربوط به tkinter، انجام شده است.
1from tkinter import *
2import random
3from tkinter import ttk
4
5PuzzleWindow=Tk()
6
7PuzzleWindow.title('Memory Puzzle Game By DataFlair')
8
9tabs = ttk.Notebook(PuzzleWindow)
10easy= ttk.Frame(tabs)
در ادامه، توضیحات مربوط به کدهای بالا فهرست شدهاند.
- کتابخانهrandomبه ما کمک میکند تا اعدادی تصادفی را تولید کنیم.
- Tk(): همانطور که پیشتر بیان شد، امکان دسترسی به کتابخانهای از ابزارکها یا ویجتهای رابط کاربری گرافیکی، بهوسیله این متد برای ما فراهم میشود.
- title(): با استفاده از این متد میتوانیم «عنوان» پنجره بازی را تعیین کنیم.
- ttk.Notebook(): این ویجت مجموعه پنجرههای پروژه را مدیریت میکند و در هر لحظه تنها یک پنجره را نمایش میدهد.
- ttk.Frame(): این مولفه، نگهدارندهای مستطیلی شکل را برای دیگر ویجتها فراهم میکند.
گام سوم: نوشتن توابع مورد نیاز برای ایجاد سطح آسان بازی
کدهایی که در ادامه میآیند، شامل توابعی هستند که ساختار و عملیات اصلی بازی حافظه تصویری را شامل میشوند.
این توابع برای ایجاد سطح «آسان» بازی حافظه تصویری با پایتون و tkinter نوشته شدهاند.
1def draw(a,l,m):
2 global base1
3 if a=='A':
4 d=base1.create_rectangle(100*l+20,m*100+20,100*l+100-20,100*m+100-20,fill='red')
5 elif a=='B':
6 d=base1.create_rectangle(100*l+20,m*100+20,100*l+100-20,100*m+100-20,fill='yellow')
7 elif a=='C':
8 d=base1.create_rectangle(100*l+20,m*100+20,100*l+100-20,100*m+100-20,fill='blue')
9 elif a=='D':
10 d=base1.create_oval(100*l+20,m*100+20,100*l+100-20,100*m+100-20,fill='red')
11 elif a=='E':
12 d=base1.create_oval(100*l+20,m*100+20,100*l+100-20,100*m+100-20,fill='yellow')
13 elif a=='F':
14 d=base1.create_oval(100*l+20,m*100+20,100*l+100-20,100*m+100-20,fill='blue')
15 elif a=='G':
16 d=base1.create_polygon(100*l+50,m*100+20,100*l+20,100*m+100-20,100*l+100-20,100*m+100-20,fill='red')
17 elif a=='H':
18 d=base1.create_polygon(100*l+50,m*100+20,100*l+20,100*m+100-20,100*l+100-20,100*m+100-20,fill='green')
19
20def quizboard():
21 global base1,ans1,board1,moves1
22 count=0
23 for i in range(4):
24 for j in range(4):
25 rec=base1.create_rectangle(100*i,j*100,100*i+100,100*j+100,fill="white")
26 if(board1[i][j]!='.'):
27 draw(board1[i][j],i,j)
28 count+=1
29 if count==16:
30 base1.create_text(200,450,text="No. of moves: "+str(moves1),font=('arial',20))
31
32
33def call(event):
34 global base1,ans1,board1,moves1,prev1
35 i=event.x//100
36 j=event.y//100
37 if board1[i][j]!='.':
38 return
39 moves1+=1
40 #print(moves)
41 if(prev1[0]>4):
42 prev1[0]=i
43 prev1[1]=j
44 board1[i][j]=ans1[i][j]
45 quizboard()
46 else:
47 board1[i][j]=ans1[i][j]
48 quizboard()
49 if(ans1[i][j]==board1[prev1[0]][prev1[1]]):
50 print("matched")
51 prev1=[100,100]
52 quizboard()
53 return
54 else:
55 board1[prev1[0]][prev1[1]]='.'
56 quizboard()
57 prev1=[i,j]
58 return
59
60base1=Canvas(easy,width=500,height=500)
61base1.pack()
62
63ans1 = list('AABBCCDDEEFFGGHH')
64random.shuffle(ans1)
65ans1 = [ans1[:4],
66 ans1[4:8],
67 ans1[8:12],
68 ans1[12:]]
69
70base1.bind("<Button-1>", call)
71
72moves1=IntVar()
73moves1=0
74
75prev1=[100,100]
76
77board1=[list('.'*4) for count in range(4)]
78quizboard()
در ادامه، توضیحات مربوط به کدهای بالا را با هم مرور میکنیم.
- draw() : این تابع برای ترسیم اشکال مختلفی که در خانههای جدول پنهان شدهاند، بهکار میرود.
- create_rectangle() : برای رسم مستطیل روی صفحه از این تابع استفاده میکنیم.
- create_polygon() : اگر بخواهیم یک چندضلعی روی صفحه رسم کنیم، از این تابع استفاده میکنیم.
- <b>create_oval()</b>: این تابع برای رسم بیضی روی صفحه بهکار میرود.
- Quizboard : عملیات ترسیم کادری جدول مانند با ابعاد ۴ در ۴ بهعنوان صفحه بازی (در سطح آسان) را این تابع بر عهده دارد.
- call() : زمانیکه بازیکن روی خانههای بازی کلیک کند، این تابع فراخوانی میشود. تنها در صورتی که دو خانه انتخابی دارای شکلی یکسان باشند، این تابع اَشکال پنهان شده در آنها را نمایش میدهد. یعنی اگر خانههای انتخاب شده دارای اشکال متفاوتی باشند، شکل پنهان درون آنها، همچنان پنهان میماند.
- Canvas : بهوسیله این تابع میتوان ساختارهای گرافیکی را به برنامههای پایتونی اضافه کرد.
- List : برای ذخیره لیستی از اعداد، رشتهها، کاراکترها و غیره مورد استفاده قرار میگیرد.
- shuffle() : این تابع، لیستی را به عنوان ورودی دریافت کرده، سپس ترتیب عناصر موجود در آن را تغییر میدهد (لیست را به هم میریزد).
گام چهارم: نوشتن توابع مورد نیاز برای ایجاد سطح متوسط بازی
در این مرحله از ساخت بازی حافظه تصویری با پایتون، لازم است تا توابع مربوط به بخش سطح دشواری متوسط بازی را پیادهسازی کنیم.
در قطعه کد زیر کدهای مربوط به تعریف توابع مورد نیاز برای ایجاد بخش مربوط به سختی متوسط بازی آمدهاند.
1window2= ttk.Frame(tabs)
2
3def draw1(a,l,m):
4 global base2
5 if a=='A':
6 d=base2.create_rectangle(100*l+20,m*100+20,100*l+100-20,100*m+100-20,fill='red')
7 elif a=='B':
8 d=base2.create_rectangle(100*l+20,m*100+20,100*l+100-20,100*m+100-20,fill='yellow')
9 elif a=='C':
10 d=base2.create_rectangle(100*l+20,m*100+20,100*l+100-20,100*m+100-20,fill='blue')
11 elif a=='D':
12 d=base2.create_oval(100*l+20,m*100+20,100*l+100-20,100*m+100-20,fill='red')
13 elif a=='E':
14 d=base2.create_oval(100*l+20,m*100+20,100*l+100-20,100*m+100-20,fill='yellow')
15 elif a=='F':
16 d=base2.create_oval(100*l+20,m*100+20,100*l+100-20,100*m+100-20,fill='blue')
17 elif a=='G':
18 d=base2.create_polygon(100*l+50,m*100+20,100*l+20,100*m+100-20,100*l+100-20,100*m+100-20,fill='red')
19 elif a=='H':
20 d=base2.create_polygon(100*l+50,m*100+20,100*l+20,100*m+100-20,100*l+100-20,100*m+100-20,fill='green')
21 elif a=='I':
22 d=base2.create_polygon(100*l+50,m*100+20,100*l+20,100*m+100-20,100*l+100-20,100*m+100-20,fill='yellow')
23 elif a=='J':
24 d=base2.create_polygon(100*l+50,m*100+20,100*l+20,100*m+100-20,100*l+100-20,100*m+100-20,fill='blue')
25 elif a=='K':
26 d=base2.create_polygon(100*l+50,m*100+20,100*l+20,100*m+100-20,100*l+100-20,100*m+100-20,fill='black')
27 elif a=='L':
28 d=base2.create_polygon(100*l+50,m*100+20,100*l+20,100*m+100-20,100*l+100-20,100*m+100-20,fill='orange')
29 elif a=='M':
30 d=base2.create_rectangle(100*l+20,m*100+20,100*l+100-20,100*m+100-20,fill='black')
31 elif a=='N':
32 d=base2.create_rectangle(100*l+20,m*100+20,100*l+100-20,100*m+100-20,fill='orange')
33 elif a=='O':
34 d=base2.create_rectangle(100*l+20,m*100+20,100*l+100-20,100*m+100-20,fill='green')
35 elif a=='P':
36 d=base2.create_oval(100*l+20,m*100+20,100*l+100-20,100*m+100-20,fill='black')
37 elif a=='Q':
38 d=base2.create_oval(100*l+20,m*100+20,100*l+100-20,100*m+100-20,fill='orange')
39 elif a=='R':
40 d=base2.create_oval(100*l+20,m*100+20,100*l+100-20,100*m+100-20,fill='green')
41
42
43def puzzleboard2():
44 global base2,ans2,board2,moves2
45 count=0
46 for i in range(6):
47 for j in range(6):
48 rec=base2.create_rectangle(100*i,j*100,100*i+100,100*j+100,fill="white")
49 if(board2[i][j]!='.'):
50 draw1(board2[i][j],i,j)
51 count+=1
52 if count>=36:
53 base2.create_text(300,650,text="No. of moves: "+str(moves2),font=('arial',20))
54
55def call2(event):
56 global base2,ans2,board2,moves2,prev2
57 i=event.x//100
58 j=event.y//100
59 if board2[i][j]!='.':
60 return
61 moves2+=1
62 if(prev2[0]>6):
63 prev2[0]=i
64 prev2[1]=j
65 board2[i][j]=ans2[i][j]
66 puzzleboard2()
67 else:
68 board2[i][j]=ans2[i][j]
69 puzzleboard2()
70 if(ans2[i][j]==board2[prev2[0]][prev2[1]]):
71 prev2=[100,100]
72 puzzleboard2()
73 return
74 else:
75 board2[prev2[0]][prev2[1]]='.'
76 puzzleboard2()
77 prev2=[i,j]
78 return
79base2=Canvas(window2,width=1000,height=1000)
80base2.pack()
81ans2 = list('AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRR')
82random.shuffle(ans2)
83ans2 = [ans2[:6],
84 ans2[6:12],
85 ans2[12:18],
86 ans2[18:24],
87 ans2[24:30],
88 ans2[30:]
89 ]
90base2.bind("<Button-1>", call2)
91moves2=IntVar()
92moves2=0
93prev2=[100,100]
94board2=[list('.'*6) for count in range(6)]
95puzzleboard2()
در ادامه، توضیحاتی پیرامون هر یک از توابع این بخش ارائه شده است.
- draw1(): با کمک این تابع است که اشکال موجود در هر خانه از صفحه بازی را ترسیم میکنیم.
- quizboard2(): این تابع برای ایجاد صفحه بازی در سطح «متوسط» که کادری جدولمانند به ابعاد ۶×۶ بهکار میرود.
- Create_text: با اِعمال این متد روی شی Canvas، میتوان عنصری متنی روی آن ایجاد و متن مورد نظر را نوشت.
- call2(): این تابع زمانی فراخوانی میشود که بازیکن روی خانهها کلیک و آنها را انتخاب کرده باشد، حال تنها در صورتی که دو خانه انتخابی شامل اشکال مشابهی باشند، اشکال درون آنها نمایش داده میشود. در غیر این صورت، اشکال درون آنها همچنان پنهان میمانند.
- IntVar: مقدار متغیر را در قالب عدد صحیح بر میگرداند.
گام پنجم: نوشتن توابع مورد نیاز برای ایجاد سطح دشوار بازی
در این قسمت، توابع مورد نیاز برای سطح «دشوار» بازی حافظه تصویری نوشته شده است.
1window3= ttk.Frame(tabs)
2tabs.add(easy, text ='Easy')
3tabs.add(window2, text ='medium')
4tabs.add(window3, text ='Hard')
5tabs.pack(expand = 1, fill ="both")
6
7def draw2(a,l,m):
8 global base3
9 if a=='A':
10 d=base3.create_rectangle(80*l+20,m*80+20,80*l+80-20,80*m+80-20,fill='red')
11 elif a=='B':
12 d=base3.create_rectangle(80*l+20,m*80+20,80*l+80-20,80*m+80-20,fill='yellow')
13 elif a=='C':
14 d=base3.create_rectangle(80*l+20,m*80+20,80*l+80-20,80*m+80-20,fill='blue')
15 elif a=='D':
16 d=base3.create_oval(80*l+20,m*80+20,80*l+80-20,80*m+80-20,fill='red')
17 elif a=='E':
18 d=base3.create_oval(80*l+20,m*80+20,80*l+80-20,80*m+80-20,fill='yellow')
19 elif a=='F':
20 d=base3.create_oval(80*l+20,m*80+20,80*l+80-20,80*m+80-20,fill='blue')
21 elif a=='G':
22 d=base3.create_polygon(80*l+50,m*80+20,80*l+20,80*m+80-20,80*l+80-20,80*m+80-20,fill='red')
23 elif a=='H':
24 d=base3.create_polygon(80*l+50,m*80+20,80*l+20,80*m+80-20,80*l+80-20,80*m+80-20,fill='green')
25 elif a=='I':
26 d=base3.create_polygon(80*l+50,m*80+20,80*l+20,80*m+80-20,80*l+80-20,80*m+80-20,fill='yellow')
27 elif a=='J':
28 d=base3.create_polygon(80*l+50,m*80+20,80*l+20,80*m+80-20,80*l+80-20,80*m+80-20,fill='blue')
29 elif a=='K':
30 d=base3.create_polygon(80*l+50,m*80+20,80*l+20,80*m+80-20,80*l+80-20,80*m+80-20,fill='black')
31 elif a=='L':
32 d=base3.create_polygon(80*l+50,m*80+20,80*l+20,80*m+80-20,80*l+80-20,80*m+80-20,fill='orange')
33 elif a=='M':
34 d=base3.create_rectangle(80*l+20,m*80+20,80*l+80-20,80*m+80-20,fill='black')
35 elif a=='N':
36 d=base3.create_rectangle(80*l+20,m*80+20,80*l+80-20,80*m+80-20,fill='orange')
37 elif a=='O':
38 d=base3.create_rectangle(80*l+20,m*80+20,80*l+80-20,80*m+80-20,fill='green')
39 elif a=='P':
40 d=base3.create_oval(80*l+20,m*80+20,80*l+80-20,80*m+80-20,fill='pink')
41 elif a=='Q':
42 d=base3.create_oval(80*l+20,m*80+20,80*l+80-20,80*m+80-20,fill='green')
43 elif a=='R':
44 d=base3.create_rectangle(80*l+20,m*80+20,80*l+80-20,80*m+80-20,fill='pink')
45 elif a=='S':
46 d=base3.create_rectangle(80*l+20,m*80+20,80*l+80-20,80*m+80-20,fill='purple')
47 elif a=='T':
48 d=base3.create_oval(80*l+20,m*80+20,80*l+80-20,80*m+80-20,fill='purple')
49 elif a=='U':
50 d=base3.create_polygon(80*l+50,m*80+20,80*l+20,80*m+80-20,80*l+80-20,80*m+80-20,fill='purple')
51 elif a=='V':
52 d=base3.create_polygon(80*l+50,m*80+20,80*l+20,80*m+80-20,80*l+80-20,80*m+80-20,fill='pink')
53 elif a=='W':
54 d=base3.create_polygon(80*l+50,m*80+20,80*l+20,80*m+80-20,80*l+80-20,80*m+80-20,fill='maroon')
55 elif a=='X':
56 d=base3.create_rectangle(80*l+20,m*80+20,80*l+80-20,80*m+80-20,fill='maroon')
57 elif a=='Y':
58 d=base3.create_oval(80*l+20,m*80+20,80*l+80-20,80*m+80-20,fill='maroon')
59 elif a=='Z':
60 d=base3.create_polygon(80*l+50,m*80+20,80*l+20,80*m+80-20,80*l+80-20,80*m+80-20,fill='brown')
61 elif a=='a':
62 d=base3.create_oval(80*l+20,m*80+20,80*l+80-20,80*m+80-20,fill='brown')
63 elif a=='b':
64 d=base3.create_rectangle(80*l+20,m*80+20,80*l+80-20,80*m+80-20,fill='brown')
65 elif a=='c':
66 d=base3.create_polygon(80*l+50,m*80+20,80*l+20,80*m+80-20,80*l+80-20,80*m+80-20,fill='aqua')
67 elif a=='d':
68 d=base3.create_rectangle(80*l+20,m*80+20,80*l+80-20,80*m+80-20,fill='aqua')
69 elif a=='e':
70 d=base3.create_oval(80*l+20,m*80+20,80*l+80-20,80*m+80-20,fill='aqua')
71 elif a=='f':
72 d=base3.create_polygon(80*l+50,m*80+20,80*l+20,80*m+80-20,80*l+80-20,80*m+80-20,fill='magenta')
73 elif a=='g':
74 d=base3.create_oval(80*l+20,m*80+20,80*l+80-20,80*m+80-20,fill='magenta')
75
76def quizboard3():
77 global base3,ans3,board3,moves3
78 count=0
79 for i in range(8):
80 for j in range(8):
81 e=base3.create_rectangle(80*i,j*80,80*i+80,80*j+80,fill="white")
82 if(board3[i][j]!='.'):
83 draw2(board3[i][j],i,j)
84 count+=1
85 if count>=64:
86 base3.create_text(300,650,text="No. of moves: "+str(moves3),font=('arial',20))
87
88
89
90def call3(event):
91 global base3,ans3,board3,moves3,prev3
92 i=event.x//80
93 j=event.y//80
94 if board3[i][j]!='.':
95 return
96 moves3+=1
97 if(prev3[0]>8):
98 prev3[0]=i
99 prev3[1]=j
100 board3[i][j]=ans3[i][j]
101 quizboard3()
102 else:
103 board3[i][j]=ans3[i][j]
104 quizboard3()
105 if(ans3[i][j]==board3[prev3[0]][prev3[1]]):
106 print("matched")
107 prev3=[100,100]
108 quizboard3()
109 return
110 else:
111 board3[prev3[0]][prev3[1]]='.'
112 quizboard3()
113 prev3=[i,j]
114 return
115
116base3=Canvas(window3,width=1000,height=1000)
117base3.pack()
118
119ans3 = list('AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUWWXXYYZZaabbccddeeffgg')
120random.shuffle(ans3)
121ans3 = [ans3[:8],
122 ans3[8:16],
123 ans3[16:24],
124 ans3[24:32],
125 ans3[32:40],
126 ans3[40:48],
127 ans3[48:56],
128 ans3[56:]
129 ]
130
131base3.bind("<Button-1>", call3)
132
133moves3=IntVar()
134moves3=0
135
136prev3=[80,80]
137
138board3=[list('.'*8) for count in range(8)]
139quizboard3()
140
141mainloop()
عمکلرد هر یک از توابع موجود در کدهای بالا، در ادامه تشریح میشوند.
- draw2(): این تابع برای رسم اشکال مختلفی که درون هر یک از خانههای صفحه بازی پنهان هستند، بهکار میرود.
- quizboard3(): برای ایجاد صفحه بازی در سطح «سخت» که کادری در ابعاد ۸ در ۸ است، از این تابع استفاده میکنیم.
- call3(): این تابع زمانی فراخونی میشود که بازیکن روی یکی از خانهها کلیک کند. در این صورت، اشکال پنهان شده در خانهها، تنها در صورتی که در هر دو خانه یکسان باشند، آشکار میشوند و در غیر این صورت، پنهان میمانند.
- shuffle(): این تابع، لیستی را به عنوان ورودی دریافت کرده، سپس ترتیب عناصر موجود در آن را تغییر میدهد.
خروجی پروژه ساخت بازی حافظه تصویری با پایتون و tkinter چیست؟
تا این مرحله، توانستیم پروژه ساخت بازی حافظه تصویری با پایتون را با موفقیت توسعه دهیم. حالا زمان آن رسیده است که بازی را اجرا کنیم.
تصویری که در ادامه میآید، خروجی بازی حافظه تصویری نوشته شده با پایتون و ماژول tkinter را نشان میدهد.
ساخت بازی حافظه تصویری با پایتون و ماژول turtle چگونه است؟
در این قسمت نحوه ایجاد بازی حافظه تصویری با پایتون و کتابخانه turtle شرح داده شده است. پیش از آن بیایید مروری بر ماژول turtle داشته باشیم.
ماژول Turtle چیست؟
ماژول turtle، یکی از کتابخانههای «از پیش نصب شده» روی پایتون است که یک «بومِ» (Canvas) مجازی را در اختیار برنامهنویسان قرار میدهد و آنها را قادر میسازد تا از این طریق بتوانند تصاویر و اشکال مختلفی را روی صفحه ترسیم کنند. قلمی که این کتابخانه روی صفحه نمایش در اختیار برنامهنویس میدهد تا از آن برای طراحی استفاده کند، «لاکپشت» (Turtle) نام دارد.
حالا فهمیدیم که اسم این کتابخانه از کجا آمده است. اگر خیلی ساده بخواهیم بگوییم، این کتابخانه به برنامهنویسان تازهکار کمک میکند تا درک کنند که برنامهنویسی با پایتون چقدر میتواند سرگرم کننده و تعاملی باشد. عمده کاربرد کتابخانه turtle، آشنا کردن کودکان، با دنیای کامپیوتر است. راهی ساده که میتواند برای درک مفاهیم پایتون مورد استفاده قرار گیرد تا کودکان از این طریق اولین گام را در برنامهنویسی پایتون بردارند.
با این حال، استفاده از کتابخانه turtle، تنها محدود به کودکان نیست و برای هر برنامهنویس پایتونی که تازهکار است میتواند مفید واقع شود. turtle به ما کمک میکند تا انواع اَشکال و تصاویر مختلف را ترسیم کنیم. این کتابخانه همچنین در ساخت بازیهای کوچک و انیمیشنها نیز مورد استفاده قرار میگیرد. تصویری که در ادامه میآید، نمونه شکل رسم شده بهوسیله turtle را نشان میدهد.
در پیادهسازی این پروژه نیز صفحه جدول مانندِ بازی، دارای خانههایی است که بهصورت جفتی، عدد یا شکلِ مشابهی را بهصورت پنهان در دل خود دارند. در هر نوبت، بازیکن دو مورد از خانهها را انتخاب میکند، اگر این خانهها دارای محتوای مشابهی باشند، برداشته میشوند. در غیر این صورت در جای خود قرار گرفته و عدد درون آنها نیز دوباره پنهان میشود. بازیکن این روند را تا زمانی که تمام خانهها با جفت متناظرشان انتخاب و برداشته شوند ادامه میدهد. برای پیادهسازی این بازی در پایتون، از ماژولهایturtleوrandomاستفاده میکنیم.
کدنویسی بازی حافظه تصویری با کتابخانه turtle چگونه است؟
- ماژولهایturtleوrandomرا در کدهای بازی، وارد میکنیم. ماژولrandomبه منظور تولید اعدادی تصادفی، و ماژولturtleبرای ترسیم اشکال مختلف، مورد استفاده قرار گرفته است.
- صفحه بازی را تنظیم و همچنین رنگ پسزمینه پنجره خروجی بازی را انتخاب میکنیم.
- تابعی مینویسیم تا کادر مربعی صفحه بازی را ایجاد کند.
- تابعی برای نگهداری شماره «شاخص» (Index) بررسی شده، ایجاد میکنیم.
- برای کاربر پسند (User-Friendly) شدن برنامه تابعی را مینویسیم. (مانند کلیک بازیکن)
- تابعی ایجاد میکنیم تا خانههای موجود روی کادر اصلی بازی (صفحه بازی) را که در گام سوم تعریف شد، ترسیم کند.
- از تابع shuffle() برای بهم ریختن ترتیب اعداد قرار گرفته روی خانههای صفحه بازی استفاده میکنیم.
در ادامه این مطلب از مجله فرادرس کدهای مربوط به بازی حافظه تصویری با ماژول turtle در پایتون را مشاهده میکنید.
1# import modules
2from random import *
3from turtle import *
4
5# set the screen
6screen = Screen()
7
8#choose background color
9screen.bgcolor("yellow")
10
11# define the function
12# for creating a square section
13# for the game
14def Square(x, y):
15 up()
16 goto(x, y)
17 down()
18 color('white', 'green')
19 begin_fill()
20 for count in range(4):
21 forward(50)
22 left(90)
23 end_fill()
24
25# define function to
26# keep a check of index number
27def Numbering(x, y):
28 return int((x + 200) // 50 + ((y + 200) // 50) * 8)
29
30# define function
31def Coordinates(count):
32 return (count % 8) * 50 - 200, (count // 8) * 50 - 200
33
34# define function
35# to make it interactive
36# user click
37def click(x, y):
38 spot = Numbering(x, y)
39 mark = state['mark']
40
41 if mark is None or mark == spot or tiles[mark] != tiles[spot]:
42 state['mark'] = spot
43 else:
44 hide[spot] = False
45 hide[mark] = False
46 state['mark'] = None
47
48def draw():
49 clear()
50 goto(0, 0)
51 stamp()
52
53 for count in range(64):
54 if hide[count]:
55 x, y = Coordinates(count)
56 Square(x, y)
57
58 mark = state['mark']
59
60 if mark is not None and hide[mark]:
61 x, y = Coordinates(mark)
62 up()
63 goto(x + 2, y)
64 color('black')
65 write(tiles[mark], font=('Arial', 30, 'normal'))
66
67 update()
68 ontimer(draw, 10)
69
70tiles = list(range(32)) * 2
71state = {'mark': None}
72hide = [True] * 64
73
74# for shuffling the
75# numbers placed inside
76# the square tiles
77shuffle(tiles)
78tracer(False)
79onscreenclick(click)
80draw()
81done()
خروجی پروژه ساخت بازی حافظه تصویری با پایتون و turtle چیست؟
برای اجرای بازی حافظه تصویری، کافیست برنامهای که نوشتیم را اجرا کنیم.
تصویری که در ادامه آمده است، خروجی بازی حافظه تصویری نوشته شده با زبان پایتون و ماژول turtle را نشان میدهد.
سوالات پرتکرار
در ادامه به برخی از سوالات پرتکرار در مورد بازیسازی با پایتون، پاسخ داده میشود.
آیا با استفاده از زبان پایتون می توانم بازی بسازم؟
بله. صرف نظر از اینکه در حال حاضر به این زبان مسلط هستید یا اینکه تازه شروع به یادگیری آن کردهاید، پایتون، زبانی ایدهآل و مناسب برای ماجراجویی و نوشتن بازیها محسوب میشود. به لطف وجود سینتکس تازهکار پسندِ پایتون، برنامهنویسها میتوانند به جای درگیر شدن با پیچیدگیهای زبان، روی اصول برنامهنویسی بازی تمرکز کنند.
با استفاده از پایتون و ماژول tkinter چه بازی هایی می توان ساخت؟
با استفاده از tkinter که ماژولی برای ایجاد رابط کاربری گرافیکی برنامههای پایتون به شمار میرود، میتوان بازیهای مختلفی از قبیل «سنگ، کاغذ، قیچی»، بازی «Tic Tac Toe»، بازی «Snake» و غیره را ایجاد کرد.
جمعبندی
در روند یادگیری پایتون، علاوه بر آموختن مقدمات این زبان، بهتر است تا حد امکان از تمرینها و پروژههای عملی نیز برای یادگیری آن بهره بگیریم.
در این مطلب از مجله فرادرس نحوه ساخت بازی حافظه تصویری با پایتون به صورت عملی بیان شد. مطالعه این نوشتار برای افرادی مناسب است که قصد بازیسازی با زبان پایتون را دارند و همچنین میخواهند مهارتهای خود در زمینه پیادهسازی پروژههای پایتونی تقویت کنند. کدنویسی و پیادهسازی پروژههای این چنینی، برای ارتقای سطح مهارت برنامهنویسی و ایجاد پرتفوی و نمونهکار به منظور ورود به بازار کار و استخدام، در طول مسیر یادگیری برنامه نویسی و تبدیل شدن به یک برنامهنویس حرفهای، اهمیت زیادی دارد.