1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125 | # 從標準程式庫引入 Tk
from tkinter import *
# 從 tkinter 引入 font
from tkinter import font
# 從 tkinter 引入 ttk
from tkinter import ttk
# 引入 Point 定義
from exercise1810 import Point
# 引入 Lion 定義
from exercise1812 import Lion
# 引入 Elephant 定義
from exercise2901 import Elephant
# 引入 Cat 定義
from exercise2902 import Cat
# 引入 Mouse 定義
from exercise2903 import Mouse
# 引入 move() 定義
from exercise2807 import move
# 引入 bound_check() 定義
from exercise2605 import bound_check
# 引入 get_world_string() 定義
from exercise2906 import get_world_string
# 練習用的視窗類別
class JungleGUI(ttk.Frame):
def __init__(self, master):
ttk.Frame.__init__(self, master)
self.winfo_toplevel().title("鬥獸棋")
self.root = master
self.grid()
self.label_font1 = font.Font(master, font="SF 64")
self.label_font2 = font.Font(master, font="SF 32")
self.style = ttk.Style()
self.style.theme_use("alt")
self.user = Mouse(Point(3,0), "鼠")
self.animals = []
self.animals.append(self.user)
self.animals.append(Elephant(Point(0,0), "象"))
self.animals.append(Lion(Point(0,3), "獅"))
self.animals.append(Cat(Point(3,3), "貓"))
self.world = [["口", "口", "口", "口"],
["口", "口", "口", "口"],
["口", "口", "口", "口"],
["口", "口", "口", "口"]]
self.createWidgets()
self.root.bind('<Up>', self.move_up)
self.root.bind('<Down>', self.move_down)
self.root.bind('<Left>', self.move_left)
self.root.bind('<Right>', self.move_right)
def createWidgets(self):
self.display1 = Label(self)
self.display1["text"] = get_world_string(self.animals, self.world)
self.display1["width"] = 20
self.display1["bg"] = "white"
self.display1["fg"] = "black"
self.display1["font"] = self.label_font1
self.display1.grid(row=0, column=0, columnspan=3, sticky=N)
self.button_up = Button(self)
self.button_up["text"] = "上"
self.button_up["font"] = self.label_font2
self.button_up["width"] = 5
self.button_up["height"] = 1
self.button_up["command"] = self.move_up
self.button_up.grid(row=3, column=1, sticky=N)
self.button_down = Button(self)
self.button_down["text"] = "下"
self.button_down["font"] = self.label_font2
self.button_down["width"] = 5
self.button_down["height"] = 1
self.button_down["command"] = self.move_down
self.button_down.grid(row=5, column=1, sticky=N)
self.button_left = Button(self)
self.button_left["text"] = "左"
self.button_left["font"] = self.label_font2
self.button_left["width"] = 5
self.button_left["height"] = 1
self.button_left["command"] = self.move_left
self.button_left.grid(row=4, column=0, sticky=N)
self.button_right = Button(self)
self.button_right["text"] = "右"
self.button_right["font"] = self.label_font2
self.button_right["width"] = 5
self.button_right["height"] = 1
self.button_right["command"] = self.move_right
self.button_right.grid(row=4, column=2, sticky=N)
def move_up(self, event=None):
self.animal_move("up")
def move_down(self, event=None):
self.animal_move("down")
def move_left(self, event=None):
self.animal_move("left")
def move_right(self, event=None):
self.animal_move("right")
def animal_move(self, d):
# 進行移動
if bound_check(self.user, d, self.world):
move(self.user, d)
# 顯示地圖
self.display1["text"] = get_world_string(self.animals, self.world)
# 執行部分
if __name__ == '__main__':
# 建立 Tk 應用物件
root = Tk()
# 建立視窗物件
app = JungleGUI(master=root)
# 呼叫維持視窗運作的 mainloop()
root.mainloop()
# 檔名: exercise3605.py
# 說明:《Python入門指南》的練習
# 網站: http://kaiching.org
# 作者: 張凱慶
# 時間: 2023 年 12 月
|