그 시절 우리가 즐겼던 Windows 게임을 아직도 기억하시나요? Windows에 포함된 게임에 대해 말하자면, 80년대와 90년대에 태어난 친구들이 많이 알고 있을 것입니다. 게임이 전무하던 초창기에는 '솔리테어', '지뢰 찾기' 같은 게임이 마이크로컴퓨터 수업에 많은 즐거움을 선사해 주었습니다.
행복한 시간. 그런데 이 게임들 중에 많은 사람들이 이해하지 못하거나 심지어 플레이하는 방법조차 모르는 게임이 하나 있습니다. 이 게임
하트입니다.
최근 편집자가 임의로 주의 깊게 연구한 결과, 이 게임이 다른 게임보다 확실히 더 재미있다는 것을 알게 되었습니다.
일부. 왜냐하면 이 게임의 게임 플레이는 "부정 행위" 라는 두 단어로 간단하게 요약될 수 있고, 이는 명백히 부정 행위를 하는 종류의 게임이기 때문입니다.
1. 게임을 엽니다. hongxindazhan.py를 두 번 클릭하면 메인 프로그램이 실행됩니다!
2. 게임 시작: 플레이어의 이름을 입력하고 새 ID를 만든 후 확인을 클릭하여 게임에 입장합니다.
3. 게임 흐름:
1) 카드 변경: 손에 있는 카드 3장을 선택하고 위 버튼을 클릭하면 교환이 완료됩니다. 2) 카드 사용: 플레이어가 카드를 사용할 차례가 되면 손에 있는 카드를 선택하고 클릭하여 사용합니다. (특정 카드 플레이 규칙은 부록을 참조하세요.) 참고: 현재 이 카드를 플레이할 수 없으면 아래 프롬프트 표시줄에 플레이할 수 없는 이유가 표시됩니다.
4. 단계별로 체계적으로 나누어짐: 게임 라운드가 끝나면 점수표가 팝업되어 플레이어와 컴퓨터 3대의 각 라운드 점수와 총점을 보여줍니다.
플레이어의 현재 순위입니다. (승패를 결정하는 구체적인 규칙은 부록을 참조하세요)
5. 메뉴바:
1) 게임바: 새 게임(F2): 클릭하면 새 게임이 시작됩니다. 점수(F4): 클릭하면 점수표가 표시됩니다. 배경 음악: 음악 스위치를 전환하려면 클릭하세요. 옵션(F5): 컴퓨터 재생 속도를 수정하려면 클릭하세요. 종료: 게임을 종료하려면 클릭하세요. 2) 도움말 표시줄: 규칙 소개(F1): 클릭하면 간단한 규칙과 승리 조건이 표시됩니다. 인용문: 클릭하면 유명한 인용문이 팝업됩니다.
6. 배경음악: 대체: 자신이 만든 wav 형식의 음악을 사용하여 'm1.wav'로 이름을 바꾸어 프로그램 디렉토리에서 동일한 이름의 파일을 대체할 수 있습니다.
1. 게임을 하기 전, 딜러를 정해야 합니다. 컴퓨터에서 은행가는 남쪽에 앉아 있습니다. 2. 딜러는 카드(총 13장)를 받은 후 먼저 3장의 카드를 선택하여 다른 상대에게 전달해야 합니다. 첫 번째 라운드에서는 카드가 왼쪽에 있는 플레이어에게 전달되고, 두 번째 라운드에서는 카드가 오른쪽에 있는 플레이어에게 전달되고, 네 번째 라운드에서는 카드가 반대편에 있는 플레이어에게 전달됩니다. 라운드에서는 카드가 전달되지 않습니다. 딜러로부터 패스를 받은 후 원하는 대로 카드 3장을 딜러에게 다시 전달해야 합니다. 컴퓨터에서 카드를 선택하려면 해당 카드를 클릭하기만 하면 됩니다. 카드 선택을 취소하려면 다시 클릭하세요. 3. 2개의 곤봉을 잡은 선수는 2개의 곤봉을 먼저 플레이해야 하며, 이것이 첫 번째 공격입니다. 4. 그런 다음 시계 방향으로 카드를 플레이합니다. 각 플레이어는 차례로 같은 무늬의 카드를 뽑아야 합니다. 딜된 카드와 동일한 무늬의 카드가 없으면 어떤 카드든 사용할 수 있습니다. 유일한 예외는 하트 또는 스페이드의 여왕(일반적으로 "돼지"라고 함)이 첫 번째 라운드에서 플레이될 수 없다는 것입니다. 참고: 플레이된 동일한 모양의 카드 중 가장 높은 카드가 이번 라운드에서 승리하며, 카드를 획득한 플레이어가 다음 라운드에서 카드를 먼저 플레이하게 됩니다. 이전에 하트를 사용한 후에만 하트를 꺼낼 수 있습니다(손에 하트 모양의 카드만 있는 경우 제외). 5. 게임의 각 라운드가 종료될 때 각 빨간색 하트는 1점의 가치가 있으며, "스페이드의 여왕(돼지)"은 13점의 가치가 있습니다. 누군가가 100점 이상을 획득하거나 딜러가 게임을 종료할 때까지 게임은 계속됩니다. 모든 하트와 "스페이드의 여왕"이 한 라운드("캐치"라고 함)에서 승리하면 "캐치" 플레이어는 0점을 얻고 나머지 플레이어는 각각 26점을 얻습니다. 이 게임에서는 점수가 낮을수록 좋습니다.
▲환경 설치 이 글에서 사용한 실행 환경: Python3.7, Pycharm Community Edition 2020, tkinter 모듈, part
내장 모듈은 설치 없이 직접 가져올 수 있습니다. (소프트웨어를 설치하거나 코드를 활성화해야 하거나 문제가 발생하면 나에게 개인 메시지를 보낼 수 있습니다.
하아! ) 모듈 설치: pip install -i
https://pypi.douban.com/simple/ + 모듈 이름
가장 독창적인 녹색 배경입니다. (배경만 보이고 나머지 사진은 안보이네요) 참고는 맨 위 2번째 사진입니다
주요 프로그램 소스 코드만 표시됩니다. 각 코드 줄은 주석 처리되어 있어 직접 표시할 수 있습니다! 기사 마지막 부분에서 전체 소스 코드를 확인하세요!
from Tkinter import * from tkFont import * import presents from tkMessageBox import * from inner import * fromDialog 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,'서쪽','북쪽','동쪽'] 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], 채우기 = '흰색', 텍스트 = 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일 때 카드 변경 단계로 들어갑니다. 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 , event): # 카드 이벤트 # 카드 위치 가져오기 i = int(event.widget['text']) ifnotself.isChanging: # 카드 플레이 단계의 카드 이벤트 # 대기하는 동안에는 카드가 플레이되지 않습니다. iswait:return#플레이할 수 없습니다. 카드가 플레이되지 않습니다. ifnotself.onegame.available(i): self.status['text'] = self.onegame.errorString returnself.onegame.playCard(i) # 플레이된 카드가 다음에 표시됩니다. 중심 event.widget.place_forget() self .ml[self.turn]['image'] = event.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'] = '대기 중...'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 '] = 비활성화됨 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: #교환을 위해 카드를 교체하기 전에 컴퓨터에서 변경한 카드를 가져옵니다. select = 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: #카드 변경 후 확인, 카드 플레이 단계로 들어가면 플레이어 앞에 있는 컴퓨터가 self.select:self를 위해 카드를 플레이합니다. moveCard(0,i ,0) self.b.place_forget() self.isChanging = False self.leftCards = 13self.playpreCards() defplaypreCards(self): ifself.leftCards == 0: #카드를 사용한 후 점수 fori 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) 점수 = 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: # 플레이어의 이전 컴퓨터 카드를 가져와서 표시합니다. fori inrange(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): # 플레이어의 컴퓨터 카드를 가져와서 laterCards = 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, state):#i, 플레이어; j, 어떤 카드 ;state, 바운스 또는 내려놓기 # 카드 이동 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): # 점수 대화 상자 표시 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() 손 = 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.status['text'] = '카드를 사용하세요. '#게임 창을 만들고 게임 메뉴 항목을 만듭니다. classGame:def__init__(self): # 루트 창을 만들고 self.root = Tk() self.root.title("Hearts") self.root.geometry(' + 150+10') self.root.ressible(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",command = self.gameEvent1) gamemenu.add_separator() gamemenu.add_command(label="Score... F4",command = self.gameEvent2) gamemenu.add_command( label ="Option... F5", command = self.gameEvent4) self.v = IntVar() self.v.set(1) gamemenu.add_checkbutton(label="배경 음악", 변수 = self.v, command = self .gameEvent3) gamemenu.add_separator() gamemenu.add_command(label="Exit",command = self.cancel) helpmenu.add_command(label="규칙 소개... F1",command = self.helpEvent1) helpmenu.add_command (label ="Quotation...",command = self.helpEvent2) self.root.bind('<F2>',self.gameEvent1) self.root.bind('<F4>',self.gameEvent2) 자기. root.bind('<F5>',self.gameEvent4) self.root.bind('<F1>',self.helpEvent1) self.root.protocol("WM_DELETE_WINDOW",self.cancel) # 배경 이미지 가져오기 bgimg = PhotoImage( file = 'bg.gif') # 메인 인터페이스 생성 self.frame = GameFrame(self,bgimg) # 메인 루프 self.root.mainloop() defgameEvent1(self,event=None): #Game 메뉴 항목 "New Game" flag = Askokcancel('New Game', '현재 게임을 취소하고 새 게임을 시작하시겠습니까? ') ifflag:self.frame.newGame() defgameEvent2(self,event=None): #게임 메뉴 항목 "점수" 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= None): #게임 메뉴 항목 "option" optionDialog = OptionDialog(self.root,self.frame.speed / 100- 1) ifnotoptionDialog.isCancel:self.frame.speed = 100+ optionDialog.v.get() * 100defhelpEvent1( self, event=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()
날이 갈수록 기술은 변하고 있습니다. 당시에는 이러한 내장 게임을 몰래 플레이하던 사람들이 순식간에 휴대용 태블릿으로 바뀌었습니다.
직장에서 새로운 사람이 되거나 부모가 되거나, 그들은 모두 자신의 새로운 단계를 시작했고, 이 게임들도 그들의 임무를 완수했습니다!
당신이 십대였을 때 가장 좋아했던 게임은 무엇입니까? 그건 그렇고, 나는 이전에 많은 게임에 대해 글을 썼습니다. 소스 코드가 필요하면 나에게서 받는 것을 잊지 마세요!