当時私たちがプレイした Windows ゲームをまだ覚えていますか? Windows に付属のゲームといえば、80 年代から 90 年代生まれの友人はよく知っていると思います。ゲームが不毛だった初期の頃、 「ソリティア」や「マインスイーパー」などのゲームは、マイコン授業に大きな喜びをもたらしてくれました。
幸せな時間。しかし、これらのゲームの中に、あまり多くの人が理解していないか、遊び方さえ知らないように見えるゲームが 1 つあります。このゲーム
ハーツだよ。
最近、編集者が気まぐれにこのゲームを注意深く研究した結果、このゲームは他のゲームよりも実際にプレイするのが楽しいことがわかりました。
いくつかの。なぜなら、このゲームのゲームプレイは一言で言えば「不正行為」であり、明らかに不正行為であることが分かるようなゲームだからです。
1. ゲームを開きます。hongxindazhan.py をダブルクリックすると、メイン プログラムが実行されます。
2. ゲームを開始します。プレーヤーの名前を入力し、新しい ID を作成し、[確認] をクリックしてゲームに参加します。
3. ゲームの流れ:
1) カードを変更する: 手持ちのカードを 3 枚選択し、上のボタンをクリックして交換を完了します。 2) カードをプレイする: プレイヤーがカードをプレイする番になったら、手持ちのカードを選択し、クリックしてプレイします。 (特定のカードのプレイ ルールについては付録を参照してください) 注: 現時点でこのカードをプレイできない場合は、下のプロンプト バーにプレイできない理由が表示されます。
4. 体系的にステージに分かれています: ゲームのラウンド後、スコア表がポップアップ表示され、プレイヤーと 3 台のコンピューターの各ラウンドのポイントと合計ポイントが表示されます。
プレイヤーの現在のランキング。 (勝敗を決める具体的なルールについては付録を参照)
5. メニューバー:
1) ゲーム バー: 新しいゲーム (F2): クリックして新しいゲームを開始します。 スコア (F4): クリックするとスコア表が表示されます。 BGM: クリックして音楽スイッチを切り替えます。 オプション (F5): クリックしてコンピュータの再生速度を変更します。 終了: クリックしてゲームを終了します。 2) ヘルプバー: ルール紹介 (F1): クリックすると簡単なルールと勝利条件が表示されます。 引用: クリックすると有名な引用がポップアップ表示されます。
6. BGM: 置換: 独自の wav 形式の音楽を使用して名前を「m1.wav」に変更し、プログラム ディレクトリ内の同じ名前のファイルを置き換えることができます。
1. ゲームをプレイする前に、ディーラーを決める必要があります。コンピューター上では、銀行家は南側に座っています。 2. カード (合計 13 枚) を手に入れた後、ディーラーはまず 3 枚のカードを選択し、他の対戦相手に渡さなければなりません。最初のラウンドではカードが左側のプレイヤーに渡され、第 2 ラウンドではカードが右側のプレイヤーに渡され、第 4 ラウンドではカードが向かい側に座っているプレイヤーに渡されます。ラウンド、カードは渡されません、など。ディーラーからパスを受け取った後、任意に 3 枚のカードをディーラーに返す必要もあります。コンピューターでカードを選択する場合は、対応するカードをクリックするだけです。カードの選択を解除するには、もう一度クリックします。 3. 2 つのクラブをキャッチしたプレーヤーは、最初に 2 つのクラブをプレイしなければなりません。これが最初の攻撃です。 4. 次に、カードを時計回りにプレイします。各プレイヤーは順番に同じスーツのカードを引く必要があります。配られたカードと同じスーツのカードがない場合は、どのカードでもプレイできます。唯一の例外は、ハートまたはスペードのクイーン (一般に「ブタ」として知られている) を最初のラウンドでプレイできないことです。注: プレイされた同じスートのカードの中で最も高いカードがこのラウンドの勝ちとなり、そのカードを獲得したプレイヤーが次のラウンドで最初にそのカードをプレイします。ハートが前にプレイされた後にのみ、ハートを引き出すことができます (手札に 1 つのスートのカードしかない場合、つまりハートだけでない場合)。 5. ゲームの各ラウンド終了時に、赤いハートは 1 ポイント、「スペードの女王 (豚)」は 13 ポイントになります。ゲームは、誰かが 100 点以上を獲得するか、ディーラーがゲームを終了するまで続きます。ラウンド (「キャッチ」と呼ばれます) ですべてのハートと「スペードの女王」が獲得された場合、「キャッチ」プレーヤーは 0 ポイントを獲得し、残りのプレーヤーはそれぞれ 26 ポイントを獲得します。このゲームではスコアが低いほど有利です。
▲環境インストール この記事で使用した実行環境:Python3.7、Pycharm Community Edition 2020、tkinterモジュール、一部
内蔵モジュールはインストールせずに直接インポートできます。 (ソフトウェアをインストールする必要がある場合、コードをアクティベートする必要がある場合、または問題が発生した場合は、私にプライベート メッセージを送ってください。
はぁ! ) モジュールのインストール: pip install -i
https://pypi.douban.com/simple/ + モジュール名
最も独創的な緑の背景。 (背景のみ表示し、他の画像は表示しません) 参考は上部2枚目の画像です
メインプログラムのソースコードのみを示します。コードの各行はコメント化されているため、直接表示できます。記事の最後にあるソースコード全体をご覧ください。
Tkinter からインポート * tkFont からインポート * winsound から tkMessageBox からインポート * 内部インポートから * ダイアログからインポート * #ゲームメインインターフェイス作成 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="ハート戦争へようこそ!", bd=1,relief=SUNKEN,anchor=W) self.status.pack(fill = X) #スタートダイアログボックスを開きます startdialog = StartDialog(self.master,"Hearts") ifstartdialog.isCancel:game.cancel() else:self.gamemodetext = ['左にパス', '右にパス', 'クロス- Change'] 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 #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の場合、カードチェンジステージに入る ifself。 gamemode != 3: self.changeHands( ) else: self.onegame.changeCards([],3) self.isChanging = False self.leftCards = 13#カードプレイフェーズに入り、プレイヤーの前のコンピューターがカードをプレイします self .playpreCards() defchangeHands(self): #カードフェーズの変更 対応する初期化 self.select = []#選択されたカード self.isChanging = True self.isOK = False s = [1,3,2] self.status['text' ] = 'パスするカードを 3 枚選択してください' +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: #カードプレイングステージのカードイベント #待機中はカードはプレイされません ifself。 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 #一定時間待機した後、中央のカードがクリアされ、プレイヤーの前のコンピューターがカード self をプレイします。 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: #self 交換用のカードを変更する前に、コンピューターによって変更されたカードを取得します。 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'] = ' 渡されたカードを受け入れるには「OK」を押してください。 '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) スコア = self.onegame.getScore() self.scorelist.append(score) iflen(self.scorelist) != 1: inrange(4) の場合: self.scorelist[- 1][i] += self.scorelist[-2][i] self.status['text'] = 'スコア'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: #プレイヤーの以前のコンピューター カードを取得し、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): #プレーヤーのコンピュータ カードを取得して後で表示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, 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): #スコアダイアログを表示scoreedialog = ScoreDialog(self.master,self) .scorelist,self.name) returnscoredialog 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]) detect(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.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",command = self.gameEvent1) gamemenu.add_separator() gamemenu.add_command(label="スコア... F4",command = self.gameEvent2) gamemenu.add_command( label ="オプション... F5", command = self.gameEvent4) self.v = IntVar() self.v.set(1) gamemenu.add_checkbutton(label="BGM", 変数 = self.v, command = self .gameEvent3) gamemenu.add_separator() gamemenu.add_command(label="終了",command = self.cancel) helpmenu.add_command(label="ルールの紹介... F1",command = self.helpEvent1) helpmenu.add_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) #背景画像のインポート 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): #ゲームメニュー項目「BGM」 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): #ゲーム メニュー項目 "オプション" 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()
テクノロジーは日々変化しています。当時、内蔵ゲームを密かにプレイしていた人々は、瞬時にポータブル タブレットに変わりました。
職場で新しい人になったり、親になったり、それぞれが新たなステージに進み、ゲームもその使命を終えました!
10代の頃一番好きだったゲームは何ですか?ちなみに、私はこれまでに多くのゲームについて書きましたが、ソース コードが必要な場合は、忘れずに私から入手してください。