Python 娓告垙寮€鍙戯細浣跨敤 Pygame 鍒涘缓绠€鍗曟父鎴?/title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; line-height: 1.6; color: #333; background-color: #f5f5f5; } .container { max-width: 1200px; margin: 0 auto; padding: 20px; } header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 60px 0; text-align: center; margin-bottom: 40px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); } h1 { font-size: 2.5rem; margin-bottom: 10px; font-weight: 700; } .subtitle { font-size: 1.2rem; opacity: 0.9; } article { background: white; padding: 40px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08); margin-bottom: 30px; } h2 { color: #667eea; font-size: 1.8rem; margin: 30px 0 20px; padding-bottom: 10px; border-bottom: 2px solid #f0f0f0; } h3 { color: #555; font-size: 1.4rem; margin: 20px 0 15px; } p { margin-bottom: 15px; text-align: justify; } .code-block { background: #f8f9fa; border: 1px solid #e9ecef; border-radius: 6px; padding: 20px; margin: 20px 0; font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; font-size: 0.9rem; line-height: 1.4; overflow-x: auto; } ul, ol { margin: 15px 0; padding-left: 30px; } li { margin-bottom: 8px; } .tip { background: #e7f3ff; border-left: 4px solid #2196F3; padding: 15px; margin: 20px 0; border-radius: 4px; } .warning { background: #fff3cd; border-left: 4px solid #ffc107; padding: 15px; margin: 20px 0; border-radius: 4px; } table { width: 100%; border-collapse: collapse; margin: 20px 0; } th, td { padding: 12px; text-align: left; border-bottom: 1px solid #ddd; } th { background-color: #667eea; color: white; font-weight: 600; } tr:hover { background-color: #f5f5f5; } .game-example { background: #f0f4ff; border: 1px solid #d0d9ff; border-radius: 6px; padding: 20px; margin: 20px 0; } .screenshot { max-width: 100%; height: auto; border-radius: 4px; margin: 15px 0; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); } @media (max-width: 768px) { .container { padding: 10px; } article { padding: 20px; } h1 { font-size: 2rem; } h2 { font-size: 1.5rem; } h3 { font-size: 1.2rem; } } footer { background: #333; color: white; padding: 30px 0; margin-top: 40px; } .footer-content { max-width: 1200px; margin: 0 auto; padding: 0 20px; text-align: center; } .footer-content p { margin-bottom: 15px; font-size: 0.9rem; } .footer-links { display: flex; justify-content: center; flex-wrap: wrap; gap: 15px; font-size: 0.85rem; } .footer-link { color: #667eea; text-decoration: none; transition: color 0.3s ease; } .footer-link:hover { color: #764ba2; } .divider { color: #666; } .tech { color: #667eea; font-weight: 500; } @media (max-width: 768px) { .footer-links { flex-direction: column; gap: 10px; } .divider { display: none; } } </style> </head> <body> <header> <div class="container"> <h1>Python 娓告垙寮€鍙戯細浣跨敤 Pygame 鍒涘缓绠€鍗曟父鎴?/h1> <p class="subtitle">浠庨浂寮€濮嬪涔?Pygame 娓告垙寮€鍙?/p> </div> </header> <div class="container"> <article> <h2>浠€涔堟槸 Pygame锛?/h2> <p>Pygame 鏄竴涓熀浜?Python 鐨勮法骞冲彴娓告垙寮€鍙戝簱锛屽畠鎻愪緵浜嗕赴瀵岀殑鍔熻兘鏉ュ垱寤?2D 娓告垙銆侾ygame 鏄湪 SDL锛圫imple DirectMedia Layer锛夊簱鐨勫熀纭€涓婃瀯寤虹殑锛屾彁渚涗簡瀵瑰浘褰€佸0闊炽€佽緭鍏ョ瓑鐨勮闂紝浣垮緱娓告垙寮€鍙戝彉寰楁洿鍔犵畝鍗曘€?/p> <h2>鐜鎼缓</h2> <h3>瀹夎 Python</h3> <p>棣栧厛锛屼綘闇€瑕佸畨瑁?Python銆傝闂?<a href="https://www.python.org/" target="_blank">Python 瀹樻柟缃戠珯</a> 涓嬭浇骞跺畨瑁呮渶鏂扮増鏈殑 Python銆?/p> <h3>瀹夎 Pygame</h3> <p>瀹夎 Python 鍚庯紝浣跨敤 pip 瀹夎 Pygame锛?/p> <div class="code-block"> <pre>pip install pygame</pre> </div> <p>楠岃瘉瀹夎鏄惁鎴愬姛锛?/p> <div class="code-block"> <pre>python -c "import pygame; print(pygame.version.ver)"</pre> </div> <h2>Pygame 鍩虹</h2> <h3>鍒濆鍖?Pygame</h3> <p>鍦ㄤ娇鐢?Pygame 涔嬪墠锛岄渶瑕佸厛鍒濆鍖栧畠锛?/p> <div class="code-block"> <pre>import pygame # 鍒濆鍖?Pygame pygame.init() # 鍒涘缓娓告垙绐楀彛 width, height = 800, 600 screen = pygame.display.set_mode((width, height)) # 璁剧疆绐楀彛鏍囬 pygame.display.set_caption("鎴戠殑绗竴涓?Pygame 娓告垙") # 娓告垙涓诲惊鐜?running = True while running: # 澶勭悊浜嬩欢 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 濉厖鑳屾櫙鑹? screen.fill((255, 255, 255)) # 鏇存柊鏄剧ず pygame.display.flip() # 閫€鍑?Pygame pygame.quit()</pre> </div> <h3>鍩烘湰姒傚康</h3> <ul> <li><strong>琛ㄩ潰锛圫urface锛?/strong>锛氱敤浜庣粯鍒跺浘鍍忕殑瀵硅薄锛屽灞忓箷銆佺簿鐏电瓑</li> <li><strong>鐭╁舰锛圧ect锛?/strong>锛氱敤浜庤〃绀轰綅缃拰澶у皬鐨勫璞?/li> <li><strong>绮剧伒锛圫prite锛?/strong>锛氭父鎴忎腑鐨勮鑹叉垨瀵硅薄</li> <li><strong>浜嬩欢锛圗vent锛?/strong>锛氱敤鎴疯緭鍏ユ垨绯荤粺浜嬩欢</li> <li><strong>鏃堕挓锛圕lock锛?/strong>锛氱敤浜庢帶鍒舵父鎴忓抚鐜?/li> </ul> <h2>鍒涘缓绗竴涓父鎴忥細Pong</h2> <h3>娓告垙璁捐</h3> <p>鎴戜滑灏嗗垱寤轰竴涓畝鍗曠殑 Pong 娓告垙锛屽寘鍚互涓嬪厓绱狅細</p> <ul> <li>涓や釜 paddle锛?paddle A 鍜?paddle B锛?/li> <li>涓€涓悆</li> <li>寰楀垎绯荤粺</li> <li>鍩烘湰鐨勭鎾炴娴?/li> </ul> <h3>瀹屾暣浠g爜</h3> <div class="code-block"> <pre>import pygame import random # 鍒濆鍖?Pygame pygame.init() # 娓告垙璁剧疆 WIDTH, HEIGHT = 800, 600 FPS = 60 # 棰滆壊瀹氫箟 WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) # 鍒涘缓娓告垙绐楀彛 screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Pong") # 鏃堕挓瀵硅薄锛岀敤浜庢帶鍒跺抚鐜?clock = pygame.time.Clock() # 娓告垙瀵硅薄 class Paddle(pygame.sprite.Sprite): def __init__(self, x, y, width, height): super().__init__() self.image = pygame.Surface((width, height)) self.image.fill(WHITE) self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y self.speed = 5 def update(self, keys): if keys[pygame.K_UP] and self.rect.top > 0: self.rect.y -= self.speed if keys[pygame.K_DOWN] and self.rect.bottom < HEIGHT: self.rect.y += self.speed class PaddleAI(pygame.sprite.Sprite): def __init__(self, x, y, width, height): super().__init__() self.image = pygame.Surface((width, height)) self.image.fill(WHITE) self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y self.speed = 5 def update(self, ball): if ball.rect.y < self.rect.centery and self.rect.top > 0: self.rect.y -= self.speed if ball.rect.y > self.rect.centery and self.rect.bottom < HEIGHT: self.rect.y += self.speed class Ball(pygame.sprite.Sprite): def __init__(self, x, y, radius): super().__init__() self.image = pygame.Surface((radius * 2, radius * 2)) pygame.draw.circle(self.image, WHITE, (radius, radius), radius) self.rect = self.image.get_rect() self.rect.center = (x, y) self.speed_x = random.choice([-5, 5]) self.speed_y = random.choice([-5, 5]) def update(self): self.rect.x += self.speed_x self.rect.y += self.speed_y # 纰版挒妫€娴?- 涓婁笅杈圭晫 if self.rect.top <= 0 or self.rect.bottom >= HEIGHT: self.speed_y *= -1 # 纰版挒妫€娴?- 宸﹀彸杈圭晫锛堝緱鍒嗭級 if self.rect.left <= 0 or self.rect.right >= WIDTH: self.reset() def reset(self): self.rect.center = (WIDTH // 2, HEIGHT // 2) self.speed_x = random.choice([-5, 5]) self.speed_y = random.choice([-5, 5]) # 鍒涘缓绮剧伒缁?all_sprites = pygame.sprite.Group() paddles = pygame.sprite.Group() # 鍒涘缓娓告垙瀵硅薄 paddle_a = Paddle(20, HEIGHT // 2 - 50, 10, 100) paddle_b = PaddleAI(WIDTH - 30, HEIGHT // 2 - 50, 10, 100) ball = Ball(WIDTH // 2, HEIGHT // 2, 10) # 娣诲姞鍒扮簿鐏电粍 all_sprites.add(paddle_a, paddle_b, ball) paddles.add(paddle_a, paddle_b) # 寰楀垎 score_a = 0 score_b = 0 font = pygame.font.Font(None, 36) # 娓告垙涓诲惊鐜?running = True while running: # 鎺у埗甯х巼 clock.tick(FPS) # 澶勭悊浜嬩欢 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 鑾峰彇閿洏鐘舵€? keys = pygame.key.get_pressed() # 鏇存柊绮剧伒 paddle_a.update(keys) paddle_b.update(ball) ball.update() # 纰版挒妫€娴?- 鐞冧笌 paddle if pygame.sprite.spritecollide(ball, paddles, False): ball.speed_x *= -1 # 寰楀垎妫€娴? if ball.rect.left <= 0: score_b += 1 if ball.rect.right >= WIDTH: score_a += 1 # 缁樺埗鑳屾櫙 screen.fill(BLACK) # 缁樺埗涓嚎 pygame.draw.line(screen, WHITE, (WIDTH // 2, 0), (WIDTH // 2, HEIGHT), 2) # 缁樺埗绮剧伒 all_sprites.draw(screen) # 缁樺埗寰楀垎 score_text = font.render(f"{score_a} - {score_b}", True, WHITE) screen.blit(score_text, (WIDTH // 2 - score_text.get_width() // 2, 20)) # 鏇存柊鏄剧ず pygame.display.flip() # 閫€鍑?Pygame pygame.quit()</pre> </div> <h3>浠g爜瑙f瀽</h3> <ol> <li><strong>鍒濆鍖栭儴鍒?/strong>锛氬鍏ュ簱銆佽缃父鎴忓弬鏁般€佸垱寤虹獥鍙?/li> <li><strong>绫诲畾涔?/strong>锛? <ul> <li><code>Paddle</code>锛氱帺瀹舵帶鍒剁殑 paddle</li> <li><code>PaddleAI</code>锛氱數鑴戞帶鍒剁殑 paddle</li> <li><code>Ball</code>锛氱悆瀵硅薄</li> </ul> </li> <li><strong>娓告垙涓诲惊鐜?/strong>锛? <ul> <li>澶勭悊浜嬩欢</li> <li>鏇存柊娓告垙瀵硅薄</li> <li>妫€娴嬬鎾?/li> <li>缁樺埗娓告垙鍏冪礌</li> <li>鏇存柊鏄剧ず</li> </ul> </li> </ol> <h2>杩涢樁鎶€宸?/h2> <h3>娣诲姞澹伴煶</h3> <p>Pygame 鏀寔澹伴煶鏁堟灉锛?/p> <div class="code-block"> <pre># 鍔犺浇澹伴煶 paddle_sound = pygame.mixer.Sound("paddle_hit.wav") wall_sound = pygame.mixer.Sound("wall_hit.wav") score_sound = pygame.mixer.Sound("score.wav") # 鎾斁澹伴煶 paddle_sound.play()</pre> </div> <h3>娣诲姞鍥惧儚</h3> <p>浣跨敤鍥惧儚浠f浛绠€鍗曠殑鍑犱綍褰㈢姸锛?/p> <div class="code-block"> <pre># 鍔犺浇鍥惧儚 player_image = pygame.image.load("player.png").convert() player_image.set_colorkey(BLACK) # 璁剧疆閫忔槑鑹? # 浣跨敤鍥惧儚 class Player(pygame.sprite.Sprite): def __init__(self, x, y): super().__init__() self.image = player_image self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y</pre> </div> <h3>娣诲姞鍔ㄧ敾</h3> <p>瀹炵幇绠€鍗曠殑绮剧伒鍔ㄧ敾锛?/p> <div class="code-block"> <pre># 鍔ㄧ敾甯у垪琛?walk_frames = [] for i in range(1, 5): frame = pygame.image.load(f"walk{i}.png").convert() frame.set_colorkey(BLACK) walk_frames.append(frame) # 鍔ㄧ敾绫?class AnimatedSprite(pygame.sprite.Sprite): def __init__(self, x, y): super().__init__() self.frames = walk_frames self.current_frame = 0 self.image = self.frames[self.current_frame] self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y self.frame_rate = 5 # 姣?5 甯ф洿鏂颁竴娆? self.frame_count = 0 def update(self): self.frame_count += 1 if self.frame_count >= self.frame_rate: self.frame_count = 0 self.current_frame = (self.current_frame + 1) % len(self.frames) self.image = self.frames[self.current_frame]</pre> </div> <h3>浣跨敤绮剧伒缁?/h3> <p>绮剧伒缁勫彲浠ユ柟渚垮湴绠$悊澶氫釜绮剧伒锛?/p> <div class="code-block"> <pre># 鍒涘缓绮剧伒缁?all_sprites = pygame.sprite.Group() enemies = pygame.sprite.Group() # 娣诲姞绮剧伒 player = Player(100, 100) enemy1 = Enemy(200, 200) enemy2 = Enemy(300, 300) all_sprites.add(player, enemy1, enemy2) enemies.add(enemy1, enemy2) # 鏇存柊绮剧伒缁?all_sprites.update() # 缁樺埗绮剧伒缁?all_sprites.draw(screen) # 纰版挒妫€娴?hits = pygame.sprite.spritecollide(player, enemies, True)</pre> </div> <h2>娓告垙寮€鍙戞渶浣冲疄璺?/h2> <h3>浠g爜缁勭粐</h3> <ul> <li><strong>妯″潡鍖栬璁?/strong>锛氬皢娓告垙閫昏緫鍒嗚В涓哄涓ā鍧?/li> <li><strong>浣跨敤绫?/strong>锛氬皢娓告垙瀵硅薄灏佽涓虹被</li> <li><strong>閰嶇疆鏂囦欢</strong>锛氬皢娓告垙鍙傛暟鏀惧湪閰嶇疆鏂囦欢涓?/li> </ul> <h3>鎬ц兘浼樺寲</h3> <ul> <li><strong>浣跨敤绮剧伒缁?/strong>锛氭壒閲忓鐞嗙簿鐏垫洿鏂板拰缁樺埗</li> <li><strong>鍥惧儚浼樺寲</strong>锛氫娇鐢ㄩ€傚綋澶у皬鐨勫浘鍍忥紝閬垮厤杩囧ぇ鐨勫浘鍍?/li> <li><strong>鍑忓皯缁樺埗</strong>锛氬彧缁樺埗鍙鍖哄煙鐨勫唴瀹?/li> <li><strong>鍚堢悊浣跨敤鏃堕挓</strong>锛氭帶鍒舵父鎴忓抚鐜?/li> </ul> <h3>鐢ㄦ埛浣撻獙</h3> <ul> <li><strong>鍝嶅簲寮忔帶鍒?/strong>锛氱‘淇濇父鎴忔帶鍒舵祦鐣?/li> <li><strong>瑙嗚鍙嶉</strong>锛氫负鐢ㄦ埛鎿嶄綔鎻愪緵瑙嗚鍙嶉</li> <li><strong>闅惧害骞宠 </strong>锛氭牴鎹帺瀹舵按骞宠皟鏁存父鎴忛毦搴?/li> <li><strong>闊虫晥鍜岄煶涔?/strong>锛氭坊鍔犻€傚綋鐨勯煶鏁堝拰鑳屾櫙闊充箰</li> </ul> <h2>甯歌闂鍙婅В鍐虫柟妗?/h2> <h3>闂锛氭父鎴忕獥鍙d笉鏄剧ず</h3> <p><strong>瑙e喅鏂规</strong>锛氱‘淇濊皟鐢ㄤ簡 <code>pygame.display.flip()</code> 鏉ユ洿鏂版樉绀恒€?/p> <h3>闂锛氭父鎴忚繍琛岄€熷害杩囧揩</h3> <p><strong>瑙e喅鏂规</strong>锛氫娇鐢?<code>clock.tick(FPS)</code> 鏉ユ帶鍒跺抚鐜囥€?/p> <h3>闂锛氬浘鍍忓姞杞藉け璐?/h3> <p><strong>瑙e喅鏂规</strong>锛氱‘淇濆浘鍍忔枃浠惰矾寰勬纭紝骞朵笖鏂囦欢瀛樺湪銆?/p> <h3>闂锛氱鎾炴娴嬩笉宸ヤ綔</h3> <p><strong>瑙e喅鏂规</strong>锛氱‘淇濈簿鐏电殑 rect 灞炴€ф纭缃紝骞朵笖浣跨敤浜嗘纭殑纰版挒妫€娴嬫柟娉曘€?/p> <h2>椤圭洰鎵╁睍</h2> <h3>1. 娣诲姞鏇村娓告垙鍔熻兘</h3> <ul> <li>娣诲姞寮€濮嬭彍鍗曞拰娓告垙缁撴潫鐢婚潰</li> <li>瀹炵幇鍒嗘暟淇濆瓨鍜屾帓琛屾</li> <li>娣诲姞闅惧害绾у埆閫夋嫨</li> <li>瀹炵幇澶氫汉娓告垙妯″紡</li> </ul> <h3>2. 鍒涘缓鍏朵粬绫诲瀷鐨勬父鎴?/h3> <ul> <li><strong>骞冲彴娓告垙</strong>锛氱被浼?Super Mario 鐨勬父鎴?/li> <li><strong>灏勫嚮娓告垙</strong>锛氱被浼?Space Invaders 鐨勬父鎴?/li> <li><strong>鐩婃櫤娓告垙</strong>锛氱被浼?Tetris 鐨勬父鎴?/li> <li><strong>瑙掕壊鎵紨娓告垙</strong>锛氱畝鍗曠殑 RPG 娓告垙</li> </ul> <h2>瀛︿範璧勬簮</h2> <table> <tr> <th>璧勬簮</th> <th>绫诲瀷</th> <th>鎻忚堪</th> </tr> <tr> <td><a href="https://www.pygame.org/docs/" target="_blank">Pygame 瀹樻柟鏂囨。</a></td> <td>鏂囨。</td> <td>瀹屾暣鐨?Pygame API 鏂囨。</td> </tr> <tr> <td><a href="https://www.pygame.org/wiki/tutorials" target="_blank">Pygame 鏁欑▼</a></td> <td>鏁欑▼</td> <td>瀹樻柟鎺ㄨ崘鐨勬暀绋?/td> </tr> <tr> <td><a href="https://realpython.com/pygame-a-primer/" target="_blank">Real Python: Pygame Primer</a></td> <td>鏁欑▼</td> <td>璇︾粏鐨?Pygame 鍏ラ棬鏁欑▼</td> </tr> <tr> <td><a href="https://www.youtube.com/playlist?list=PLsk-HSGFjnaH5yghzu7PcOzm9NhsW0Urw" target="_blank">Tech With Tim: Pygame Tutorials</a></td> <td>瑙嗛鏁欑▼</td> <td>绯诲垪瑙嗛鏁欑▼</td> </tr> <tr> <td><a href="https://opengameart.org/" target="_blank">OpenGameArt</a></td> <td>璧勬簮</td> <td>鍏嶈垂鐨勬父鎴忕編鏈拰闊虫晥璧勬簮</td> </tr> </table> <h2>鎬荤粨</h2> <p>Pygame 鏄竴涓潪甯搁€傚悎鍒濆鑰呯殑娓告垙寮€鍙戝簱锛屽畠鎻愪緵浜嗙畝鍗曟槗鐢ㄧ殑 API锛屽悓鏃跺張瓒冲寮哄ぇ锛屽彲浠ュ垱寤哄悇绉嶇被鍨嬬殑 2D 娓告垙銆傞€氳繃鏈枃鐨勪粙缁嶏紝浣犲簲璇ュ凡缁忔帉鎻′簡 Pygame 鐨勫熀鏈敤娉曪紝骞惰兘澶熷垱寤虹畝鍗曠殑娓告垙銆?/p> <p>娓告垙寮€鍙戞槸涓€涓湁瓒d笖瀵屾湁鎸戞垬鎬х殑杩囩▼锛岄渶瑕佷笉鏂涔犲拰瀹炶返銆傞殢鐫€浣犲 Pygame 鐨勭啛鎮夛紝浣犲彲浠ュ皾璇曞垱寤烘洿澶嶆潅鐨勬父鎴忥紝娣诲姞鏇村鍔熻兘鍜岀壒鏁堛€?/p> <p>璁颁綇锛屾父鎴忓紑鍙戠殑鍏抽敭鏄垱鎰忓拰鍧氭寔銆備笉瑕佸鎬曞皾璇曟柊鐨勬兂娉曪紝涔熶笉瑕佸洜涓洪亣鍒板洶闅捐€屾斁寮冦€傞€氳繃涓嶆柇瀛︿範鍜屽疄璺碉紝浣犱竴瀹氳兘澶熷垱寤哄嚭浠や汉鍗拌薄娣卞埢鐨勬父鎴忋€?/p> <div class="tip"> <strong>鎻愮ず锛?/strong> 寮€濮嬫椂浠庡皬娓告垙鍋氳捣锛岄€愭澧炲姞澶嶆潅搴︺€傝繖鏍峰彲浠ヤ繚鎸佸涔犵殑鍔ㄥ姏锛屽悓鏃剁Н绱粡楠屻€? </div> </article> </div> <footer> <div class="footer-content"> <p>© 2026 骞冲钩鐨勫皬鐮寸珯 鐗堟潈鎵€鏈?/p> <div class="footer-links"> <span>鐢?<a href="https://ppkjgzs.top" class="footer-link" target="_blank">骞冲钩鐨勫皬鐮寸珯</a> 鍒朵綔</span> <span class="divider">|</span> <span>浣跨敤 <span class="tech">HTML5</span>, <span class="tech">CSS3</span> 鍜?<span class="tech">Font Awesome</span> 鏋勫缓</span> <span class="divider">|</span> <a href="https://beian.miit.gov.cn/" target="_blank" class="footer-link">娴橧CP澶?025194709鍙?2</a> <span class="divider">|</span> <a href="https://beian.mps.gov.cn/#/query/webSearch?code=13020202000680" rel="noreferrer" target="_blank" class="footer-link">鍐€鍏綉瀹夊13020202000680鍙?/a> </div> </div> </footer> </body> </html>