هل مازلت تتذكر ألعاب Windows التي لعبناها في تلك السنوات؟ عند الحديث عن الألعاب التي تأتي مع Windows، أعتقد أن العديد من الأصدقاء الذين ولدوا في الثمانينيات والتسعينيات من القرن الماضي على دراية بها. في الأيام الأولى عندما كانت الألعاب قاحلة، ساعدتنا ألعاب مثل "Solitaire" و"Minesweeper" على جلب الكثير من البهجة إلى فصول الكمبيوتر الصغيرة لدينا.
وقت سعيد. ولكن من بين هذه الألعاب، هناك لعبة واحدة لا يبدو أن الكثير من الناس يفهمونها، أو حتى لا يعرفون كيف يلعبونها. هذه اللعبة
إنها القلوب.
في الآونة الأخيرة، بعد أن درسها المحرر بعناية لمجرد نزوة، وجدت أن لعب هذه اللعبة أكثر متعة من الألعاب الأخرى.
بعض. لأن طريقة اللعب في هذه اللعبة يمكن تلخيصها ببساطة في كلمتين: "الغش" ، وهي نوع اللعبة التي تتسم بالغش بشكل واضح.
1. افتح اللعبة: انقر نقرًا مزدوجًا فوق hongxindazhan.py وسيتم تشغيل البرنامج الرئيسي!
2. ابدأ اللعبة: اكتب اسم اللاعب، وقم بإنشاء معرف جديد، ثم انقر فوق تأكيد للدخول إلى اللعبة.
3. تدفق اللعبة:
1) تغيير البطاقات: حدد ثلاث بطاقات في يدك وانقر فوق الزر أعلاه لإكمال عملية التبادل؛ 2) لعب الورق: عندما يحين دور اللاعب للعب الورق، حدد البطاقات الموجودة في يدك وانقر لتشغيلها. (راجع الملحق لمعرفة قواعد لعب الورق المحددة) ملاحظة: عندما لا يمكن لعب هذه البطاقة في هذا الوقت، سيعرض شريط المطالبة أدناه سبب عدم إمكانية تشغيلها.
4. مقسمة بشكل منهجي إلى مراحل: بعد جولة من اللعبة، سينبثق جدول النتائج، موضحًا النقاط وإجمالي نقاط كل جولة للاعب وأجهزة الكمبيوتر الثلاثة، و
الترتيب الحالي للاعب. (انظر الملحق لمعرفة القواعد المحددة لتحديد النصر أو الهزيمة)
5. شريط القوائم:
1) شريط اللعبة: لعبة جديدة (F2): انقر لبدء لعبة جديدة. النتيجة (F4): انقر لعرض جدول النتائج. موسيقى الخلفية: انقر لتبديل مفتاح الموسيقى. الخيار (F5): انقر لتعديل سرعة تشغيل الكمبيوتر. خروج: انقر للخروج من اللعبة. 2) شريط المساعدة: مقدمة القاعدة (F1): انقر لعرض القواعد الموجزة وشروط الفوز. اقتباس: انقر ليظهر اقتباس مشهور.
6. موسيقى الخلفية: الاستبدال: يمكنك استخدام موسيقى تنسيق wav الخاصة بك لإعادة تسميتها إلى "m1.wav" لاستبدال الملف بنفس الاسم في دليل البرنامج.
1. قبل أن تلعب اللعبة، عليك أن تحدد الموزع. على الكمبيوتر، يجلس المصرفي جنوبًا. 2. بعد الحصول على مجموعة من البطاقات (إجمالي 13 بطاقة)، يجب على الموزع أولاً اختيار ثلاث بطاقات وتمريرها إلى خصوم آخرين. في الجولة الأولى، يتم تمرير البطاقات إلى اللاعب الموجود على اليسار؛ وفي الجولة الثانية، يتم تمرير البطاقات إلى اللاعب الموجود على اليمين؛ وفي الجولة الثالثة، يتم تمرير البطاقات إلى اللاعب الذي يجلس في الجهة المقابلة؛ مستديرة، ولا يتم تمرير أي بطاقات، وهكذا. بعد استلام التصريح من الموزع، ستحتاج أيضًا إلى إعادة ثلاث بطاقات إلى الموزع حسب الرغبة. على الكمبيوتر، إذا كنت تريد تحديد بطاقة، فما عليك سوى النقر على البطاقة المقابلة. لإلغاء تحديد البطاقة، انقر مرة أخرى. 3. اللاعب الذي يمسك الفريقين يجب أن يلعب الفريقين أولاً، وهو الهجوم الأول. 4. ثم قم بلعب الأوراق في اتجاه عقارب الساعة. يجب على كل لاعب بدوره أن يسحب بطاقات من نفس النوع. إذا لم تكن هناك بطاقات من نفس نوع البطاقة الموزعة، فيمكن لعب أي بطاقة. الاستثناء الوحيد هو أنه لا يمكن لعب قلب أو ملكة البستوني (المعروفة باسم "الخنزير") في الجولة الأولى. ملحوظة: أعلى بطاقة بين البطاقات من نفس النوع التي تم لعبها ستفوز بهذه الجولة، واللاعب الذي يفوز بالبطاقة سيلعب البطاقة أولاً في الجولة التالية. فقط بعد لعب القلوب من قبل، يمكن سحب القلوب (ما لم يكن هناك سوى بطاقات من نوع واحد في اليد، القلوب). 5. في نهاية كل جولة من اللعبة، كل قلب أحمر يستحق نقطة واحدة، و"ملكة البستوني (الخنزير)" تستحق 13 نقطة. ستستمر اللعبة حتى يسجل شخص ما 100 نقطة أو أكثر أو يخرج الموزع من اللعبة. إذا تم الفوز بجميع القلوب و"ملكة البستوني" في جولة (تسمى "الالتقاط")، فإن لاعب "الالتقاط" يحصل على صفر نقاط ويحصل كل من اللاعبين المتبقين على 26 نقطة. كلما انخفضت النتيجة كلما كان ذلك أفضل لهذه اللعبة.
▲تثبيت البيئة بيئة التشغيل المستخدمة في هذه المقالة: Python3.7، Pycharm Community Edition 2020، وحدة tkinter، جزء
يمكن استيراد الوحدة المدمجة مباشرة دون تثبيت. (إذا كنت بحاجة إلى تثبيت برنامج أو تفعيل الأكواد أو واجهت مشاكل، يمكنك إرسال رسالة خاصة إلي
ها! ) تثبيت الوحدة النمطية: تثبيت النقطة -i
https://pypi.douban.com/simple/ + اسم الوحدة
الخلفية الخضراء الأكثر الأصلي. (تظهر الخلفية فقط ولا تظهر باقي الصور) المرجع هو الصورة الثانية في الأعلى
يتم عرض كود مصدر البرنامج الرئيسي فقط. يتم التعليق على كل سطر من التعليمات البرمجية حتى يمكن عرضه مباشرة! شاهد الكود المصدري بالكامل في نهاية المقال!
من استيراد Tkinter * من استيراد tkFont * استيراد Winsound من tkMessageBox import * من الاستيراد الداخلي * من استيراد الحوار * # إنشاء الواجهة الرئيسية للعبة classGameFrame:def__init__(self,game,bgimg):#game, كائن فئة اللعبة bgimg, صورة الخلفية self; .master = game.root # أنشئ لوحة قماشية وارسم الخلفية self.c = Canvas(self.master,width = 1024,height = 640) self.c.create_image(514,322,image=bgimg) self.c.pack( ) # إنشاء شريط الحالة self.status = Label(self.master,text="Welcome to the Heart War!", bd=1,relief=SUNKEN,anchor=W) self.status.pack(fill = X) # افتح مربع حوار البدء startdialog = StartDialog(self.master,"Hearts") ifstartdialog.isCancel:game.cancel() else:self.gamemodetext = ['تمرير إلى اليسار', 'تمرير إلى اليمين', 'تقاطع- تغيير'] self.name = [startdialog.name,'West','North','East'] self.handXY = [[346.5,490,1,0],[20,135,0,1], [586.5, 20,-1,0 ],[913,375,0,-1]] self.nameXY = [[-20,130,SE],[0,-20,SW],[91+20,0,NW],[91,130 +20,NE]] self.middleXY = [[466.5,330],[411,255],[466.5,180],[522,255]] self.img = 53* [''] fori inrange(52): self.img [i] = PhotoImage( file = 'card\%s.pgm'% (i)) self.img[52] = PhotoImage(file = 'back.pgm') self.scorelist = [] self.cards = [ ] self.gamemode = 0self .speed = 100self.wait = self.speed self.isChanging = False self.iswait = False # ارسم الاسم fori inrange(4): self.c.create_text(self.handXY[i][0] ]+self.nameXY[i] [0]، self.handXY[i] [1]+self.nameXY[i] [1]، fill = 'white'، text = self.name[i]، مرساة = self .nameXY[i][2 ], Font = Font(size=15,weight=bold))) # إنشاء يد self.l = 52* [''] fori inrange(52): self.l[i] = Label(self.master, image=self.img[52],bd = -1) fori inrange(13): self.l[i]['text'] = str(i) self.l[i]. bind("<Button-1 >",self.cardEvent) # إنشاء البطاقة المركزية self.ml = 4* [''] fori inrange(4): self.ml[i] = Label(self.master,image= self.img[52],bd = -1) self.b = Button(self.master,width=15,command=self.buttonEvent) # تبدأ جولة من اللعبة self.oneGameStart() defoneGameStart(self): #Create كائن Onegame للحصول على معلومات البطاقة self.onegame = OneGame() # احصل على يد اللاعب واعرض اليد = self.onegame.getPlayerHand(0) fori inrange(13): self.l[i]['image'] = self .img[hand[i] .id] fori inrange(4): forj inrange(13): self.moveCard(i,j,0) # أدخل مرحلة تغيير البطاقة عندما يكون وضع اللعبة هو 0، 1، 2 ifself. gamemode != 3: self.changeHands( ) else: self.onegame.changeCards([],3) self.isChanging = False self.leftCards = 13# أدخل مرحلة لعب الورق، الكمبيوتر الموجود أمام اللاعب يلعب الورق بنفسه .playpreCards() defchangeHands(self): # تغيير مرحلة البطاقة التهيئة المقابلة self.select = []# البطاقات المحددة self.isChanging = True self.isOK = False s = [1,3,2] self.status['text' ] = 'الرجاء تحديد ثلاث بطاقات للتمرير' +self.name[s[self.gamemode]]+'. '# يعرض زر المطالبة self.b['text'] = self.gamemodetext[self.gamemode] self.b.place(x = 460,y = 400) self.b['state'] = DISABLED defcardEvent(self ، حدث): # حدث البطاقة # احصل على موضع البطاقة i = int(event.widget['text']) ifnotself.isChanging: # حدث البطاقة في مرحلة لعب البطاقة # لن يتم لعب أي بطاقة أثناء انتظار ifself. iswait:return#Cannot be Play لا يتم لعب البطاقة ifnotself.onegame.available(i): self.status['text'] = self.onegame.errorString returnself.onegame.playCard(i) # يتم عرض البطاقة التي تم لعبها في المركز events.widget.place_forget() self .ml[self.turn]['image'] = events.widget['image'] self.ml[self.turn].place(x = self.middleXY[0] [0],y = self.middleXY[ 0][1]) self.turn += 1self.leftCards -= 1# الكمبيوتر الموجود خلف اللاعب يلعب الورق self.iswait = True self.playlaterCards() self.status[' text'] = 'Waiting...'self .wait += 500+ 5* self.speed # بعد الانتظار لفترة من الوقت، يتم مسح البطاقة المركزية، ويقوم الكمبيوتر الموجود أمام اللاعب بتشغيل البطاقة الذاتية. master.after(self.wait,self.playpreCards) self.wait = self.speed else: #أحداث البطاقة في مرحلة تغيير البطاقة، ارتدت، سقطت ارتدت ifnotself.isOK:ifi inself.select:self.select.remove( i) self.moveCard(0,i,0) self.b['state '] = DISABLED else:iflen(self.select) < 3: self.select.append(i) self.moveCard(0,i,1 ) iflen(self.select) == 3: self.b['state' ] = NORMAL defbuttonEvent(self): #حدث زر المطالبة ifnotself.isOK: # قم بتغيير البطاقات بواسطة الكمبيوتر قبل تغيير البطاقات لاستبدالها self. حدد = self.onegame.changeCards(self.select,self.gamemode) hand = self.onegame .getPlayerHand(0) fori inrange(13): self.l[i]['image'] = self.img[hand[ i].id] self.moveCard(0,i,0) fori inself.select:self .moveCard(0,i,1) self.status['text'] = ' الرجاء الضغط على "موافق" لقبول البطاقة التي تم تمريرها . 'self.b['text'] = 'OK' self.isOK = True else: #تأكيد بعد تغيير البطاقات، أدخل إلى مرحلة لعب الورق، يقوم الكمبيوتر الموجود أمام اللاعب بلعب البطاقات من أجل inself.select:self. moveCard(0,i ,0) self.b.place_forget() self.isChanging = False self.leftCards = 13self.playpreCards() defplaypreCards(self): ifself.leftCards == 0: # بعد لعب البطاقات، النتائج سيتم تجميعها وسيتم عرض مربع حوار النتيجة لـ inrange (4): hand = self.onegame.p[i].scoreHand forj inrange(len(hand)): self.l[i*13+j][' image'] = self.img[hand[j].id] self.moveCard(i,j,0) Score = self.onegame.getScore() self.scorelist.append(score) iflen(self.scorelist) != 1: fori inrange(4): self.scorelist[- 1][i] += self.scorelist[-2][i] self.status['text'] = 'Score'scoredialog = self.showScoreDialog() # قم بالتهيئة بعد تأكيد النتيجة وابدأ جولة جديدة من اللعبة ifscoredialog.isover :self.scorelist = [] self.gamemode = 0else:self.gamemode = (self.gamemode + 1) % 4fori inrange(52): self. l[i].place_forget() self.l[i]['image '] = self.img[52] fori inrange(4): self.ml[i].place_forget() self.oneGameStart() else: # احصل على بطاقة الكمبيوتر السابقة للاعب واعرضها في النطاق (4): self .ml[i].place_forget() self.turn = 0preCards = self.onegame.preCard iflen(preCards) == 0: self.end() else :fori inrange(len(preCards)): p,j = preCards[ i][0],preCards[i][1] self.cards.append([self.turn,p,j]) self.master.after (self.wait,self.showMiddleCard) ifp == 3: self.master.after(self.wait,self.end) self.wait = self.speed else:self.wait += self.speed self.turn += 1defplaylaterCards(self): # احصل على بطاقات الكمبيوتر الخاصة باللاعب واعرضها لاحقًاCards = self.onegame.laterCard fori inrange(len(laterCards)): p,j = LaterCards[i][0],laterCards[i][1] self .cards.append([self.turn,p,j] ) self.master.after(self.wait,self.showMiddleCard) self.wait += self.speed self.turn += 1defmoveCard(self,i,j, الحالة):#i، player؛ j، أي بطاقة؛ الدولة، ترتد أو اخماد حركة البطاقة # self.l[i*13+j].place_forget() x0= self.handXY[i][0] + self. handXY[i][2]*j*20y0 = self.handXY[i][1] + self.handXY[i][3]*j*20self.l[i*13+j].place(x = x0) ,y = y0-state * 20) defnewGame(self): #لعبة جديدة self.scorelist = [] self.gamemode = 0fori inrange(52): self.l[i].place_forget() self.l[i][ 'image'] = self.img[52] fori inrange(4): self.ml[i].place_forget() self.oneGameStart() defshowScoreDialog(self): #Display النتيجة الحوار Scoredialog = ScoreDialog(self.master,self .scorelist,self.name) returncoredialog defshowMiddleCard( self): # عرض البطاقة المركزية i = self.cards[0][0] p = self.cards[0][1] j = self.cards[0][2] del self.cards[0] self.l [p*13+j].place_forget() hand = self.onegame.getPlayerHand(p) self.ml[i]['image'] = self.img[hand[j .id] self.ml[i] .place(x = self.middleXY[p][0], y = self.middleXY[p][1]) defence(self): # التبديل من وقت انتهاء تشغيل الكمبيوتر البطاقات التي يستخدمها اللاعب عندما يلعب البطاقات self.iswait = False self. '#إنشاء نافذة لعبة وإنشاء عنصر قائمة لعبة classGame:def__init__(self): # إنشاء نافذة جذر وتعيين self.root = Tk() self.root.title("Hearts") self.root.geometry(' + 150+10') self.root.resizable(False, False) # تشغيل موسيقى الخلفية self.s = Winsound.PlaySound('m1.wav', Winsound.SND_ASYNC+winsound.SND_LOOP) # إنشاء قائمة m = Menu(self root) self.root['menu'] = m gamemenu = Menu(m) helpmenu = Menu(m) m.add_cascade(label = 'Game',menu = gamemenu) m.add_cascade(label = 'Help',menu. = helpmenu) gamemenu.add_command(label = "لعبة جديدة F2"، أمر = self.gameEvent1) gamemenu.add_separator() gamemenu.add_command(label = "Score... F4"، أمر = self.gameEvent2) gamemenu.add_command( التسمية = "الخيار... F5"، الأمر = self.gameEvent4) self.v = IntVar() self.v.set(1) gamemenu.add_checkbutton(label = "موسيقى الخلفية"، متغير = self.v، الأمر = self .gameEvent3) gamemenu.add_separator() gamemenu.add_command(label = "خروج"، أمر = self.cancel) helpmenu.add_command (label = "مقدمة للقواعد... F1"، أمر = self.helpEvent1) helpmenu.add_command (label ="Quotation...",command = self.helpEvent2) self.root.bind('<F2>',self.gameEvent1) self.root.bind('<F4>',self.gameEvent2) self. root.bind('<F5>',self.gameEvent4) self.root.bind('<F1>',self.helpEvent1) self.root.protocol("WM_DELETE_WINDOW",self.cancel) #Import الخلفية bgimg =. PhotoImage( file = 'bg.gif') # إنشاء الواجهة الرئيسية self.frame = GameFrame(self,bgimg) #Main Loop self.root.mainloop() defgameEvent1(self,event=None): # عنصر قائمة اللعبة "جديد" Game" flag = Askokcancel('لعبة جديدة', 'هل أنت متأكد من أنك تريد التخلي عن اللعبة الحالية وبدء لعبة جديدة؟ ') ifflag:self.frame.newGame() defgameEvent2(self,event=None): # عنصر قائمة اللعبة "Score" self.frame.showScoreDialog() defgameEvent3(self): # عنصر قائمة اللعبة "موسيقى الخلفية" ifself.v .get() == 0: Winsound.PlaySound(self.s,winsound.SND_PURGE) else:self.s = Winsound.PlaySound('m1.wav', Winsound.SND_ASYNC+winsound.SND_LOOP) defgameEvent4(self,event= لا شيء): # عنصر قائمة اللعبة "خيار" optionDialog = OptionDialog(self.root,self.frame.speed / 100- 1) ifnotoptionDialog.isCancel:self.frame.speed = 100+ optionDialog.v.get() * 100defhelpEvent1( self, events=None): #عنصر قائمة المساعدة" مقدمة القاعدة "HelpDialog(self.root) defhelpEvent2(self): # عنصر قائمة المساعدة" القول المأثور "SayDialog(self.root) defcancel(self): # أوقف تشغيل الموسيقى واخرج من اللعبة Winsound.PlaySound(self.s,winsound.SND_PURGE) self.root.destroy() defmain(): Game() if__name__== '__main__': main()
تتغير التكنولوجيا مع مرور كل يوم. لقد تحولت "الطوب الكبير" لسطح المكتب إلى أجهزة لوحية محمولة في لحظة. الأشخاص الذين لعبوا هذه الألعاب المدمجة سرًا في ذلك الوقت
إما أن يصبحوا شخصًا جديدًا في مكان العمل أو يصبحوا أحد الوالدين، فقد بدأوا جميعًا مراحلهم الجديدة، وقد أكملت هذه الألعاب أيضًا مهامها!
ما هي اللعبة التي كانت المفضلة لديك عندما كنت مراهقا؟ بالمناسبة، لقد كتبت عن العديد من الألعاب من قبل، إذا كنت بحاجة إلى الكود المصدري، فتذكر أن تحصل عليه مني!