本篇文章給大家談?wù)?0行python代碼的入門級(jí)小游戲,以及python簡單好玩的編程代碼,希望對(duì)各位有所幫助,不要忘了收藏本站喔。
大家好,我是辣條。
今天給大家?guī)?0個(gè)py小游戲,一定要收藏!
目錄
有手就行
1、吃金幣
2、打乒乓
3、滑雪
4、并夕夕版飛機(jī)大戰(zhàn)
5、打地鼠
簡簡單單
6、小恐龍
7、消消樂
8、俄羅斯方塊
9、貪吃蛇
普普通通
10、24點(diǎn)小游戲
11、平衡木
12、外星人入侵
13、貪心鳥
14、井字棋888‘’
有點(diǎn)困難
15、炸彈人
16、保衛(wèi)森林
17、五子棋
18、吃豆豆
19、坦克大戰(zhàn)
20、超級(jí)瑪麗
21、水果忍者
極度困難
22、飛機(jī)大戰(zhàn)
23、2048
24、推箱子
25、塔防
26、植物大戰(zhàn)僵尸
27、掃雷
終極挑戰(zhàn)?
28、拼圖
?29、走迷宮
30、最強(qiáng)游戲
有手就行
1、吃金幣
【有手就行系列不介紹玩法了+附源碼】
源碼分享:
?
import os
import cfg
import sys
import pygame
import random
from modules import *
'''游戲初始化'''
def initGame():
? ? # 初始化pygame, 設(shè)置展示窗口
? ? pygame.init()
? ? screen = pygame.display.set_mode(cfg.SCREENSIZE)
? ? pygame.display.set_caption('catch coins —— 九歌')
? ? # 加載必要的游戲素材
? ? game_images = {}
? ? for key, value in cfg.IMAGE_PATHS.items():
? ? ? ? if isinstance(value, list):
? ? ? ? ? ? images = []
? ? ? ? ? ? for item in value: images.append(pygame.image.load(item))
? ? ? ? ? ? game_images[key] = images
? ? ? ? else:
? ? ? ? ? ? game_images[key] = pygame.image.load(value)
? ? game_sounds = {}
? ? for key, value in cfg.AUDIO_PATHS.items():
? ? ? ? if key == 'bgm': continue
? ? ? ? game_sounds[key] = pygame.mixer.Sound(value)
? ? # 返回初始化數(shù)據(jù)
? ? return screen, game_images, game_sounds
'''主函數(shù)'''
def main():
? ? # 初始化
? ? screen, game_images, game_sounds = initGame()
? ? # 播放背景音樂
? ? pygame.mixer.music.load(cfg.AUDIO_PATHS['bgm'])
? ? pygame.mixer.music.play(-1, 0.0)
? ? # 字體加載
? ? font = pygame.font.Font(cfg.FONT_PATH, 40)
? ? # 定義hero
? ? hero = Hero(game_images['hero'], position=(375, 520))
? ? # 定義食物組
? ? food_sprites_group = pygame.sprite.Group()
? ? generate_food_freq = random.randint(10, 20)
? ? generate_food_count = 0
? ? # 當(dāng)前分?jǐn)?shù)/歷史最高分
? ? score = 0
? ? highest_score = 0 if not os.path.exists(cfg.HIGHEST_SCORE_RECORD_FILEPATH) else int(open(cfg.HIGHEST_SCORE_RECORD_FILEPATH).read())
? ? # 游戲主循環(huán)
? ? clock = pygame.time.Clock()
? ? while True:
? ? ? ? # --填充背景
? ? ? ? screen.fill(0)
? ? ? ? screen.blit(game_images['background'], (0, 0))
? ? ? ? # --倒計(jì)時(shí)信息
? ? ? ? countdown_text = 'Count down: ' + str((90000 - pygame.time.get_ticks()) // 60000) + ":" + str((90000 - pygame.time.get_ticks()) // 1000 % 60).zfill(2)
? ? ? ? countdown_text = font.render(countdown_text, True, (0, 0, 0))
? ? ? ? countdown_rect = countdown_text.get_rect()
? ? ? ? countdown_rect.topright = [cfg.SCREENSIZE[0]-30, 5]
? ? ? ? screen.blit(countdown_text, countdown_rect)
? ? ? ? # --按鍵檢測
? ? ? ? for event in pygame.event.get():
? ? ? ? ? ? if event.type == pygame.QUIT:
? ? ? ? ? ? ? ? pygame.quit()
? ? ? ? ? ? ? ? sys.exit()
? ? ? ? key_pressed = pygame.key.get_pressed()
? ? ? ? if key_pressed[pygame.K_a] or key_pressed[pygame.K_LEFT]:
? ? ? ? ? ? hero.move(cfg.SCREENSIZE, 'left')
? ? ? ? if key_pressed[pygame.K_d] or key_pressed[pygame.K_RIGHT]:
? ? ? ? ? ? hero.move(cfg.SCREENSIZE, 'right')
? ? ? ? # --隨機(jī)生成食物
? ? ? ? generate_food_count += 1
? ? ? ? if generate_food_count > generate_food_freq:
? ? ? ? ? ? generate_food_freq = random.randint(10, 20)
? ? ? ? ? ? generate_food_count = 0
? ? ? ? ? ? food = Food(game_images, random.choice(['gold',] * 10 + ['apple']), cfg.SCREENSIZE)
? ? ? ? ? ? food_sprites_group.add(food)
? ? ? ? # --更新食物
? ? ? ? for food in food_sprites_group:
? ? ? ? ? ? if food.update(): food_sprites_group.remove(food)
? ? ? ? # --碰撞檢測
? ? ? ? for food in food_sprites_group:
? ? ? ? ? ? if pygame.sprite.collide_mask(food, hero):
? ? ? ? ? ? ? ? game_sounds['get'].play()
? ? ? ? ? ? ? ? food_sprites_group.remove(food)
? ? ? ? ? ? ? ? score += food.score
? ? ? ? ? ? ? ? if score > highest_score: highest_score = score
? ? ? ? # --畫hero
? ? ? ? hero.draw(screen)
? ? ? ? # --畫食物
? ? ? ? food_sprites_group.draw(screen)
? ? ? ? # --顯示得分
? ? ? ? score_text = f'Score: {score}, Highest: {highest_score}'
? ? ? ? score_text = font.render(score_text, True, (0, 0, 0))
? ? ? ? score_rect = score_text.get_rect()
? ? ? ? score_rect.topleft = [5, 5]
? ? ? ? screen.blit(score_text, score_rect)
? ? ? ? # --判斷游戲是否結(jié)束
? ? ? ? if pygame.time.get_ticks() >= 90000:
? ? ? ? ? ? break
? ? ? ? # --更新屏幕
? ? ? ? pygame.display.flip()
? ? ? ? clock.tick(cfg.FPS)
? ? # 游戲結(jié)束, 記錄最高分并顯示游戲結(jié)束畫面
? ? fp = open(cfg.HIGHEST_SCORE_RECORD_FILEPATH, 'w')
? ? fp.write(str(highest_score))
? ? fp.close()
? ? return showEndGameInterface(screen, cfg, score, highest_score)
'''run'''
if __name__ == '__main__':
? ? while main():
? ? ? ? pass
2、打乒乓
源碼分享:
import sys
import cfg
import pygame
from modules import *
'''定義按鈕'''
def Button(screen, position, text, button_size=(200, 50)):
left, top = position
bwidth, bheight = button_size
pygame.draw.line(screen, (150, 150, 150), (left, top), (left+bwidth, top), 5)
pygame.draw.line(screen, (150, 150, 150), (left, top-2), (left, top+bheight), 5)
pygame.draw.line(screen, (50, 50, 50), (left, top+bheight), (left+bwidth, top+bheight), 5)
pygame.draw.line(screen, (50, 50, 50), (left+bwidth, top+bheight), (left+bwidth, top), 5)
pygame.draw.rect(screen, (100, 100, 100), (left, top, bwidth, bheight))
font = pygame.font.Font(cfg.FONTPATH, 30)
text_render = font.render(text, 1, (255, 235, 205))
return screen.blit(text_render, (left+50, top+10))
'''
Function:
開始界面
Input:
--screen: 游戲界面
Return:
--game_mode: 1(單人模式)/2(雙人模式)
'''
def startInterface(screen):
clock = pygame.time.Clock()
while True:
screen.fill((41, 36, 33))
button_1 = Button(screen, (150, 175), '1 Player')
button_2 = Button(screen, (150, 275), '2 Player')
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN:
if button_1.collidepoint(pygame.mouse.get_pos()):
return 1
elif button_2.collidepoint(pygame.mouse.get_pos()):
return 2
clock.tick(10)
pygame.display.update()
'''結(jié)束界面'''
def endInterface(screen, score_left, score_right):
clock = pygame.time.Clock()
font1 = pygame.font.Font(cfg.FONTPATH, 30)
font2 = pygame.font.Font(cfg.FONTPATH, 20)
msg = 'Player on left won!' if score_left > score_right else 'Player on right won!'
texts = [font1.render(msg, True, cfg.WHITE),
font2.render('Press ESCAPE to quit.', True, cfg.WHITE),
font2.render('Press ENTER to continue or play again.', True, cfg.WHITE)]
positions = [[120, 200], [155, 270], [80, 300]]
while True:
screen.fill((41, 36, 33))
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN:
return
elif event.key == pygame.K_ESCAPE:
sys.exit()
pygame.quit()
for text, pos in zip(texts, positions):
screen.blit(text, pos)
clock.tick(10)
pygame.display.update()
'''運(yùn)行游戲Demo'''
def runDemo(screen):
# 加載游戲素材
hit_sound = pygame.mixer.Sound(cfg.HITSOUNDPATH)
goal_sound = pygame.mixer.Sound(cfg.GOALSOUNDPATH)
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.play(-1, 0.0)
font = pygame.font.Font(cfg.FONTPATH, 50)
# 開始界面
game_mode = startInterface(screen)
# 游戲主循環(huán)
# --左邊球拍(ws控制, 僅雙人模式時(shí)可控制)
score_left = 0
racket_left = Racket(cfg.RACKETPICPATH, 'LEFT', cfg)
# --右邊球拍(↑↓控制)
score_right = 0
racket_right = Racket(cfg.RACKETPICPATH, 'RIGHT', cfg)
# --球
ball = Ball(cfg.BALLPICPATH, cfg)
clock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit(-1)
screen.fill((41, 36, 33))
# 玩家操作
pressed_keys = pygame.key.get_pressed()
if pressed_keys[pygame.K_UP]:
racket_right.move('UP')
elif pressed_keys[pygame.K_DOWN]:
racket_right.move('DOWN')
if game_mode == 2:
if pressed_keys[pygame.K_w]:
racket_left.move('UP')
elif pressed_keys[pygame.K_s]:
racket_left.move('DOWN')
else:
racket_left.automove(ball)
# 球運(yùn)動(dòng)
scores = ball.move(ball, racket_left, racket_right, hit_sound, goal_sound)
score_left += scores[0]
score_right += scores[1]
# 顯示
# --分隔線
pygame.draw.rect(screen, cfg.WHITE, (247, 0, 6, 500))
# --球
ball.draw(screen)
# --拍
racket_left.draw(screen)
racket_right.draw(screen)
# --得分
screen.blit(font.render(str(score_left), False, cfg.WHITE), (150, 10))
screen.blit(font.render(str(score_right), False, cfg.WHITE), (300, 10))
if score_left == 11 or score_right == 11:
return score_left, score_right
clock.tick(100)
pygame.display.update()
'''主函數(shù)'''
def main():
# 初始化
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((cfg.WIDTH, cfg.HEIGHT))
pygame.display.set_caption('pingpong —— 九歌')
# 開始游戲
while True:
score_left, score_right = runDemo(screen)
endInterface(screen, score_left, score_right)
'''run'''
if __name__ == '__main__':
main()
3、滑雪
源碼分享:
import sys
import cfg
import pygame
import random
'''滑雪者類'''
class SkierClass(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
# 滑雪者的朝向(-2到2)
self.direction = 0
self.imagepaths = cfg.SKIER_IMAGE_PATHS[:-1]
self.image = pygame.image.load(self.imagepaths[self.direction])
self.rect = self.image.get_rect()
self.rect.center = [320, 100]
self.speed = [self.direction, 6-abs(self.direction)*2]
'''改變滑雪者的朝向. 負(fù)數(shù)為向左,正數(shù)為向右,0為向前'''
def turn(self, num):
self.direction += num
self.direction = max(-2, self.direction)
self.direction = min(2, self.direction)
center = self.rect.center
self.image = pygame.image.load(self.imagepaths[self.direction])
self.rect = self.image.get_rect()
self.rect.center = center
self.speed = [self.direction, 6-abs(self.direction)*2]
return self.speed
'''移動(dòng)滑雪者'''
def move(self):
self.rect.centerx += self.speed[0]
self.rect.centerx = max(20, self.rect.centerx)
self.rect.centerx = min(620, self.rect.centerx)
'''設(shè)置為摔倒?fàn)顟B(tài)'''
def setFall(self):
self.image = pygame.image.load(cfg.SKIER_IMAGE_PATHS[-1])
'''設(shè)置為站立狀態(tài)'''
def setForward(self):
self.direction = 0
self.image = pygame.image.load(self.imagepaths[self.direction])
'''
Function:
障礙物類
Input:
img_path: 障礙物圖片路徑
location: 障礙物位置
attribute: 障礙物類別屬性
'''
class ObstacleClass(pygame.sprite.Sprite):
def __init__(self, img_path, location, attribute):
pygame.sprite.Sprite.__init__(self)
self.img_path = img_path
self.image = pygame.image.load(self.img_path)
self.location = location
self.rect = self.image.get_rect()
self.rect.center = self.location
self.attribute = attribute
self.passed = False
'''移動(dòng)'''
def move(self, num):
self.rect.centery = self.location[1] - num
'''創(chuàng)建障礙物'''
def createObstacles(s, e, num=10):
obstacles = pygame.sprite.Group()
locations = []
for i in range(num):
row = random.randint(s, e)
col = random.randint(0, 9)
location = [col*64+20, row*64+20]
if location not in locations:
locations.append(location)
attribute = random.choice(list(cfg.OBSTACLE_PATHS.keys()))
img_path = cfg.OBSTACLE_PATHS[attribute]
obstacle = ObstacleClass(img_path, location, attribute)
obstacles.add(obstacle)
return obstacles
'''合并障礙物'''
def AddObstacles(obstacles0, obstacles1):
obstacles = pygame.sprite.Group()
for obstacle in obstacles0:
obstacles.add(obstacle)
for obstacle in obstacles1:
obstacles.add(obstacle)
return obstacles
'''顯示游戲開始界面'''
def ShowStartInterface(screen, screensize):
screen.fill((255, 255, 255))
tfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//5)
cfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//20)
title = tfont.render(u'滑雪游戲', True, (255, 0, 0))
content = cfont.render(u'按任意鍵開始游戲', True, (0, 0, 255))
trect = title.get_rect()
trect.midtop = (screensize[0]/2, screensize[1]/5)
crect = content.get_rect()
crect.midtop = (screensize[0]/2, screensize[1]/2)
screen.blit(title, trect)
screen.blit(content, crect)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
return
pygame.display.update()
'''顯示分?jǐn)?shù)'''
def showScore(screen, score, pos=(10, 10)):
font = pygame.font.Font(cfg.FONTPATH, 30)
score_text = font.render("Score: %s" % score, True, (0, 0, 0))
screen.blit(score_text, pos)
'''更新當(dāng)前幀的游戲畫面'''
def updateFrame(screen, obstacles, skier, score):
screen.fill((255, 255, 255))
obstacles.draw(screen)
screen.blit(skier.image, skier.rect)
showScore(screen, score)
pygame.display.update()
'''主程序'''
def main():
# 游戲初始化
pygame.init()
pygame.mixer.init()
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.set_volume(0.4)
pygame.mixer.music.play(-1)
# 設(shè)置屏幕
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('滑雪游戲 —— 九歌')
# 游戲開始界面
ShowStartInterface(screen, cfg.SCREENSIZE)
# 實(shí)例化游戲精靈
# --滑雪者
skier = SkierClass()
# --創(chuàng)建障礙物
obstacles0 = createObstacles(20, 29)
obstacles1 = createObstacles(10, 19)
obstaclesflag = 0
obstacles = AddObstacles(obstacles0, obstacles1)
# 游戲clock
clock = pygame.time.Clock()
# 記錄滑雪的距離
distance = 0
# 記錄當(dāng)前的分?jǐn)?shù)
score = 0
# 記錄當(dāng)前的速度
speed = [0, 6]
# 游戲主循環(huán)
while True:
# --事件捕獲
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT or event.key == pygame.K_a:
speed = skier.turn(-1)
elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
speed = skier.turn(1)
# --更新當(dāng)前游戲幀的數(shù)據(jù)
skier.move()
distance += speed[1]
if distance >= 640 and obstaclesflag == 0:
obstaclesflag = 1
obstacles0 = createObstacles(20, 29)
obstacles = AddObstacles(obstacles0, obstacles1)
if distance >= 1280 and obstaclesflag == 1:
obstaclesflag = 0
distance -= 1280
for obstacle in obstacles0:
obstacle.location[1] = obstacle.location[1] - 1280
obstacles1 = createObstacles(10, 19)
obstacles = AddObstacles(obstacles0, obstacles1)
for obstacle in obstacles:
obstacle.move(distance)
# --碰撞檢測
hitted_obstacles = pygame.sprite.spritecollide(skier, obstacles, False)
if hitted_obstacles:
if hitted_obstacles[0].attribute == "tree" and not hitted_obstacles[0].passed:
score -= 50
skier.setFall()
updateFrame(screen, obstacles, skier, score)
pygame.time.delay(1000)
skier.setForward()
speed = [0, 6]
hitted_obstacles[0].passed = True
elif hitted_obstacles[0].attribute == "flag" and not hitted_obstacles[0].passed:
score += 10
obstacles.remove(hitted_obstacles[0])
# --更新屏幕
updateFrame(screen, obstacles, skier, score)
clock.tick(cfg.FPS)
'''run'''
if __name__ == '__main__':
main();
4、并夕夕版飛機(jī)大戰(zhàn)
源碼分享:
import sys
import cfg
import pygame
from modules import *
'''游戲界面'''
def GamingInterface(num_player, screen):
# 初始化
pygame.mixer.music.load(cfg.SOUNDPATHS['Cool Space Music'])
pygame.mixer.music.set_volume(0.4)
pygame.mixer.music.play(-1)
explosion_sound = pygame.mixer.Sound(cfg.SOUNDPATHS['boom'])
fire_sound = pygame.mixer.Sound(cfg.SOUNDPATHS['shot'])
font = pygame.font.Font(cfg.FONTPATH, 20)
# 游戲背景圖
bg_imgs = [cfg.IMAGEPATHS['bg_big'], cfg.IMAGEPATHS['seamless_space'], cfg.IMAGEPATHS['space3']]
bg_move_dis = 0
bg_1 = pygame.image.load(bg_imgs[0]).convert()
bg_2 = pygame.image.load(bg_imgs[1]).convert()
bg_3 = pygame.image.load(bg_imgs[2]).convert()
# 玩家, 子彈和小行星精靈組
player_group = pygame.sprite.Group()
bullet_group = pygame.sprite.Group()
asteroid_group = pygame.sprite.Group()
# 產(chǎn)生小行星的時(shí)間間隔
asteroid_ticks = 90
for i in range(num_player):
player_group.add(Ship(i+1, cfg))
clock = pygame.time.Clock()
# 分?jǐn)?shù)
score_1, score_2 = 0, 0
# 游戲主循環(huán)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# --玩家一: ↑↓←→控制, j射擊; 玩家二: wsad控制, 空格射擊
pressed_keys = pygame.key.get_pressed()
for idx, player in enumerate(player_group):
direction = None
if idx == 0:
if pressed_keys[pygame.K_UP]:
direction = 'up'
elif pressed_keys[pygame.K_DOWN]:
direction = 'down'
elif pressed_keys[pygame.K_LEFT]:
direction = 'left'
elif pressed_keys[pygame.K_RIGHT]:
direction = 'right'
if direction:
player.move(direction)
if pressed_keys[pygame.K_j]:
if player.cooling_time == 0:
fire_sound.play()
bullet_group.add(player.shot())
player.cooling_time = 20
elif idx == 1:
if pressed_keys[pygame.K_w]:
direction = 'up'
elif pressed_keys[pygame.K_s]:
direction = 'down'
elif pressed_keys[pygame.K_a]:
direction = 'left'
elif pressed_keys[pygame.K_d]:
direction = 'right'
if direction:
player.move(direction)
if pressed_keys[pygame.K_SPACE]:
if player.cooling_time == 0:
fire_sound.play()
bullet_group.add(player.shot())
player.cooling_time = 20
if player.cooling_time > 0:
player.cooling_time -= 1
if (score_1 + score_2) < 500:
background = bg_1
elif (score_1 + score_2) < 1500:
background = bg_2
else:
background = bg_3
# --向下移動(dòng)背景圖實(shí)現(xiàn)飛船向上移動(dòng)的效果
screen.blit(background, (0, -background.get_rect().height + bg_move_dis))
screen.blit(background, (0, bg_move_dis))
bg_move_dis = (bg_move_dis + 2) % background.get_rect().height
# --生成小行星
if asteroid_ticks == 0:
asteroid_ticks = 90
asteroid_group.add(Asteroid(cfg))
else:
asteroid_ticks -= 1
# --畫飛船
for player in player_group:
if pygame.sprite.spritecollide(player, asteroid_group, True, None):
player.explode_step = 1
explosion_sound.play()
elif player.explode_step > 0:
if player.explode_step > 3:
player_group.remove(player)
if len(player_group) == 0:
return
else:
player.explode(screen)
else:
player.draw(screen)
# --畫子彈
for bullet in bullet_group:
bullet.move()
if pygame.sprite.spritecollide(bullet, asteroid_group, True, None):
bullet_group.remove(bullet)
if bullet.player_idx == 1:
score_1 += 1
else:
score_2 += 1
else:
bullet.draw(screen)
# --畫小行星
for asteroid in asteroid_group:
asteroid.move()
asteroid.rotate()
asteroid.draw(screen)
# --顯示分?jǐn)?shù)
score_1_text = '玩家一得分: %s' % score_1
score_2_text = '玩家二得分: %s' % score_2
text_1 = font.render(score_1_text, True, (0, 0, 255))
text_2 = font.render(score_2_text, True, (255, 0, 0))
screen.blit(text_1, (2, 5))
screen.blit(text_2, (2, 35))
# --屏幕刷新
pygame.display.update()
clock.tick(60)
'''主函數(shù)'''
def main():
pygame.init()
pygame.font.init()
pygame.mixer.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('飛機(jī)大戰(zhàn) —— 九歌')
num_player = StartInterface(screen, cfg)
if num_player == 1:
while True:
GamingInterface(num_player=1, screen=screen)
EndInterface(screen, cfg)
else:
while True:
GamingInterface(num_player=2, screen=screen)
EndInterface(screen, cfg)
'''run'''
if __name__ == '__main__':
main()
5、打地鼠
源碼分享:
import cfg
import sys
import pygame
import random
from modules import *
'''游戲初始化'''
def initGame():
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('打地鼠 —— 九歌')
return screen
'''主函數(shù)'''
def main():
# 初始化
screen = initGame()
# 加載背景音樂和其他音效
pygame.mixer.music.load(cfg.BGM_PATH)
pygame.mixer.music.play(-1)
audios = {
'count_down': pygame.mixer.Sound(cfg.COUNT_DOWN_SOUND_PATH),
'hammering': pygame.mixer.Sound(cfg.HAMMERING_SOUND_PATH)
}
# 加載字體
font = pygame.font.Font(cfg.FONT_PATH, 40)
# 加載背景圖片
bg_img = pygame.image.load(cfg.GAME_BG_IMAGEPATH)
# 開始界面
startInterface(screen, cfg.GAME_BEGIN_IMAGEPATHS)
# 地鼠改變位置的計(jì)時(shí)
hole_pos = random.choice(cfg.HOLE_POSITIONS)
change_hole_event = pygame.USEREVENT
pygame.time.set_timer(change_hole_event, 800)
# 地鼠
mole = Mole(cfg.MOLE_IMAGEPATHS, hole_pos)
# 錘子
hammer = Hammer(cfg.HAMMER_IMAGEPATHS, (500, 250))
# 時(shí)鐘
clock = pygame.time.Clock()
# 分?jǐn)?shù)
your_score = 0
flag = False
# 初始時(shí)間
init_time = pygame.time.get_ticks()
# 游戲主循環(huán)
while True:
# --游戲時(shí)間為60s
time_remain = round((61000 - (pygame.time.get_ticks() - init_time)) / 1000.)
# --游戲時(shí)間減少, 地鼠變位置速度變快
if time_remain == 40 and not flag:
hole_pos = random.choice(cfg.HOLE_POSITIONS)
mole.reset()
mole.setPosition(hole_pos)
pygame.time.set_timer(change_hole_event, 650)
flag = True
elif time_remain == 20 and flag:
hole_pos = random.choice(cfg.HOLE_POSITIONS)
mole.reset()
mole.setPosition(hole_pos)
pygame.time.set_timer(change_hole_event, 500)
flag = False
# --倒計(jì)時(shí)音效
if time_remain == 10:
audios['count_down'].play()
# --游戲結(jié)束
if time_remain < 0: break
count_down_text = font.render('Time: '+str(time_remain), True, cfg.WHITE)
# --按鍵檢測
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEMOTION:
hammer.setPosition(pygame.mouse.get_pos())
elif event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
hammer.setHammering()
elif event.type == change_hole_event:
hole_pos = random.choice(cfg.HOLE_POSITIONS)
mole.reset()
mole.setPosition(hole_pos)
# --碰撞檢測
if hammer.is_hammering and not mole.is_hammer:
is_hammer = pygame.sprite.collide_mask(hammer, mole)
if is_hammer:
audios['hammering'].play()
mole.setBeHammered()
your_score += 10
# --分?jǐn)?shù)
your_score_text = font.render('Score: '+str(your_score), True, cfg.BROWN)
# --綁定必要的游戲元素到屏幕(注意順序)
screen.blit(bg_img, (0, 0))
screen.blit(count_down_text, (875, 8))
screen.blit(your_score_text, (800, 430))
mole.draw(screen)
hammer.draw(screen)
# --更新
pygame.display.flip()
clock.tick(60)
# 讀取最佳分?jǐn)?shù)(try塊避免第一次游戲無.rec文件)
try:
best_score = int(open(cfg.RECORD_PATH).read())
except:
best_score = 0
# 若當(dāng)前分?jǐn)?shù)大于最佳分?jǐn)?shù)則更新最佳分?jǐn)?shù)
if your_score > best_score:
f = open(cfg.RECORD_PATH, 'w')
f.write(str(your_score))
f.close()
# 結(jié)束界面
score_info = {'your_score': your_score, 'best_score': best_score}
is_restart = endInterface(screen, cfg.GAME_END_IMAGEPATH, cfg.GAME_AGAIN_IMAGEPATHS, score_info, cfg.FONT_PATH, [cfg.WHITE, cfg.RED], cfg.SCREENSIZE)
return is_restart
'''run'''
if __name__ == '__main__':
while True:
is_restart = main()
if not is_restart:
break
簡簡單單
【簡單介紹一下玩法+附源碼】
6、小恐龍
玩法:上下控制起跳躲避
源碼分享:
import cfg
import sys
import random
import pygame
from modules import *
'''main'''
def main(highest_score):
# 游戲初始化
pygame.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('九歌')
# 導(dǎo)入所有聲音文件
sounds = {}
for key, value in cfg.AUDIO_PATHS.items():
sounds[key] = pygame.mixer.Sound(value)
# 游戲開始界面
GameStartInterface(screen, sounds, cfg)
# 定義一些游戲中必要的元素和變量
score = 0
score_board = Scoreboard(cfg.IMAGE_PATHS['numbers'], position=(534, 15), bg_color=cfg.BACKGROUND_COLOR)
highest_score = highest_score
highest_score_board = Scoreboard(cfg.IMAGE_PATHS['numbers'], position=(435, 15), bg_color=cfg.BACKGROUND_COLOR, is_highest=True)
dino = Dinosaur(cfg.IMAGE_PATHS['dino'])
ground = Ground(cfg.IMAGE_PATHS['ground'], position=(0, cfg.SCREENSIZE[1]))
cloud_sprites_group = pygame.sprite.Group()
cactus_sprites_group = pygame.sprite.Group()
ptera_sprites_group = pygame.sprite.Group()
add_obstacle_timer = 0
score_timer = 0
# 游戲主循環(huán)
clock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE or event.key == pygame.K_UP:
dino.jump(sounds)
elif event.key == pygame.K_DOWN:
dino.duck()
elif event.type == pygame.KEYUP and event.key == pygame.K_DOWN:
dino.unduck()
screen.fill(cfg.BACKGROUND_COLOR)
# --隨機(jī)添加云
if len(cloud_sprites_group) < 5 and random.randrange(0, 300) == 10:
cloud_sprites_group.add(Cloud(cfg.IMAGE_PATHS['cloud'], position=(cfg.SCREENSIZE[0], random.randrange(30, 75))))
# --隨機(jī)添加仙人掌/飛龍
add_obstacle_timer += 1
if add_obstacle_timer > random.randrange(50, 150):
add_obstacle_timer = 0
random_value = random.randrange(0, 10)
if random_value >= 5 and random_value <= 7:
cactus_sprites_group.add(Cactus(cfg.IMAGE_PATHS['cacti']))
else:
position_ys = [cfg.SCREENSIZE[1]*0.82, cfg.SCREENSIZE[1]*0.75, cfg.SCREENSIZE[1]*0.60, cfg.SCREENSIZE[1]*0.20]
ptera_sprites_group.add(Ptera(cfg.IMAGE_PATHS['ptera'], position=(600, random.choice(position_ys))))
# --更新游戲元素
dino.update()
ground.update()
cloud_sprites_group.update()
cactus_sprites_group.update()
ptera_sprites_group.update()
score_timer += 1
if score_timer > (cfg.FPS//12):
score_timer = 0
score += 1
score = min(score, 99999)
if score > highest_score:
highest_score = score
if score % 100 == 0:
sounds['point'].play()
if score % 1000 == 0:
ground.speed -= 1
for item in cloud_sprites_group:
item.speed -= 1
for item in cactus_sprites_group:
item.speed -= 1
for item in ptera_sprites_group:
item.speed -= 1
# --碰撞檢測
for item in cactus_sprites_group:
if pygame.sprite.collide_mask(dino, item):
dino.die(sounds)
for item in ptera_sprites_group:
if pygame.sprite.collide_mask(dino, item):
dino.die(sounds)
# --將游戲元素畫到屏幕上
dino.draw(screen)
ground.draw(screen)
cloud_sprites_group.draw(screen)
cactus_sprites_group.draw(screen)
ptera_sprites_group.draw(screen)
score_board.set(score)
highest_score_board.set(highest_score)
score_board.draw(screen)
highest_score_board.draw(screen)
# --更新屏幕
pygame.display.update()
clock.tick(cfg.FPS)
# --游戲是否結(jié)束
if dino.is_dead:
break
# 游戲結(jié)束界面
return GameEndInterface(screen, cfg), highest_score
'''run'''
if __name__ == '__main__':
highest_score = 0
while True:
flag, highest_score = main(highest_score)
if not flag: break
7、消消樂
玩法:三個(gè)相連就能消除
源碼分享:
import os
import sys
import cfg
import pygame
from modules import *
'''游戲主程序'''
def main():
pygame.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('Gemgem —— 九歌')
# 加載背景音樂
pygame.mixer.init()
pygame.mixer.music.load(os.path.join(cfg.ROOTDIR, "resources/audios/bg.mp3"))
pygame.mixer.music.set_volume(0.6)
pygame.mixer.music.play(-1)
# 加載音效
sounds = {}
sounds['mismatch'] = pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, 'resources/audios/badswap.wav'))
sounds['match'] = []
for i in range(6):
sounds['match'].append(pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, 'resources/audios/match%s.wav' % i)))
# 加載字體
font = pygame.font.Font(os.path.join(cfg.ROOTDIR, 'resources/font/font.TTF'), 25)
# 圖片加載
gem_imgs = []
for i in range(1, 8):
gem_imgs.append(os.path.join(cfg.ROOTDIR, 'resources/images/gem%s.png' % i))
# 主循環(huán)
game = gemGame(screen, sounds, font, gem_imgs, cfg)
while True:
score = game.start()
flag = False
# 一輪游戲結(jié)束后玩家選擇重玩或者退出
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT or (event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE):
pygame.quit()
sys.exit()
elif event.type == pygame.KEYUP and event.key == pygame.K_r:
flag = True
if flag:
break
screen.fill((135, 206, 235))
text0 = 'Final score: %s' % score
text1 = 'Press <R> to restart the game.'
text2 = 'Press <Esc> to quit the game.'
y = 150
for idx, text in enumerate([text0, text1, text2]):
text_render = font.render(text, 1, (85, 65, 0))
rect = text_render.get_rect()
if idx == 0:
rect.left, rect.top = (212, y)
elif idx == 1:
rect.left, rect.top = (122.5, y)
else:
rect.left, rect.top = (126.5, y)
y += 100
screen.blit(text_render, rect)
pygame.display.update()
game.reset()
'''run'''
if __name__ == '__main__':
main()
8、俄羅斯方塊
玩法:童年經(jīng)典,普通模式?jīng)]啥意思,小時(shí)候我們都是玩加速的python中turtle畫蝴蝶。
源碼分享:
import os
import sys
import random
from modules import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
'''定義俄羅斯方塊游戲類'''
class TetrisGame(QMainWindow):
def __init__(self, parent=None):
super(TetrisGame, self).__init__(parent)
# 是否暫停ing
self.is_paused = False
# 是否開始ing
self.is_started = False
self.initUI()
'''界面初始化'''
def initUI(self):
# icon
self.setWindowIcon(QIcon(os.path.join(os.getcwd(), 'resources/icon.jpg')))
# 塊大小
self.grid_size = 22
# 游戲幀率
self.fps = 200
self.timer = QBasicTimer()
# 焦點(diǎn)
self.setFocusPolicy(Qt.StrongFocus)
# 水平布局
layout_horizontal = QHBoxLayout()
self.inner_board = InnerBoard()
self.external_board = ExternalBoard(self, self.grid_size, self.inner_board)
layout_horizontal.addWidget(self.external_board)
self.side_panel = SidePanel(self, self.grid_size, self.inner_board)
layout_horizontal.addWidget(self.side_panel)
self.status_bar = self.statusBar()
self.external_board.score_signal[str].connect(self.status_bar.showMessage)
self.start()
self.center()
self.setWindowTitle('Tetris —— 九歌')
self.show()
self.setFixedSize(self.external_board.width() + self.side_panel.width(), self.side_panel.height() + self.status_bar.height())
'''游戲界面移動(dòng)到屏幕中間'''
def center(self):
screen = QDesktopWidget().screenGeometry()
size = self.geometry()
self.move((screen.width() - size.width()) // 2, (screen.height() - size.height()) // 2)
'''更新界面'''
def updateWindow(self):
self.external_board.updateData()
self.side_panel.updateData()
self.update()
'''開始'''
def start(self):
if self.is_started:
return
self.is_started = True
self.inner_board.createNewTetris()
self.timer.start(self.fps, self)
'''暫停/不暫停'''
def pause(self):
if not self.is_started:
return
self.is_paused = not self.is_paused
if self.is_paused:
self.timer.stop()
self.external_board.score_signal.emit('Paused')
else:
self.timer.start(self.fps, self)
self.updateWindow()
'''計(jì)時(shí)器事件'''
def timerEvent(self, event):
if event.timerId() == self.timer.timerId():
removed_lines = self.inner_board.moveDown()
self.external_board.score += removed_lines
self.updateWindow()
else:
super(TetrisGame, self).timerEvent(event)
'''按鍵事件'''
def keyPressEvent(self, event):
if not self.is_started or self.inner_board.current_tetris == tetrisShape().shape_empty:
super(TetrisGame, self).keyPressEvent(event)
return
key = event.key()
# P鍵暫停
if key == Qt.Key_P:
self.pause()
return
if self.is_paused:
return
# 向左
elif key == Qt.Key_Left:
self.inner_board.moveLeft()
# 向右
elif key == Qt.Key_Right:
self.inner_board.moveRight()
# 旋轉(zhuǎn)
elif key == Qt.Key_Up:
self.inner_board.rotateAnticlockwise()
# 快速墜落
elif key == Qt.Key_Space:
self.external_board.score += self.inner_board.dropDown()
else:
super(TetrisGame, self).keyPressEvent(event)
self.updateWindow()
'''run'''
if __name__ == '__main__':
app = QApplication([])
tetris = TetrisGame()
sys.exit(app.exec_())
9、貪吃蛇
玩法:童年經(jīng)典,普通魔術(shù)也沒啥意思,小時(shí)候玩的也是加速的。
源碼分享:
import cfg
import sys
import pygame
from modules import *
'''主函數(shù)'''
def main(cfg):
# 游戲初始化
pygame.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('Greedy Snake —— 九歌')
clock = pygame.time.Clock()
# 播放背景音樂
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.play(-1)
# 游戲主循環(huán)
snake = Snake(cfg)
apple = Apple(cfg, snake.coords)
score = 0
while True:
screen.fill(cfg.BLACK)
# --按鍵檢測
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key in [pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT]:
snake.setDirection({pygame.K_UP: 'up', pygame.K_DOWN: 'down', pygame.K_LEFT: 'left', pygame.K_RIGHT: 'right'}[event.key])
# --更新貪吃蛇和食物
if snake.update(apple):
apple = Apple(cfg, snake.coords)
score += 1
# --判斷游戲是否結(jié)束
if snake.isgameover: break
# --顯示游戲里必要的元素
drawGameGrid(cfg, screen)
snake.draw(screen)
apple.draw(screen)
showScore(cfg, score, screen)
# --屏幕更新
pygame.display.update()
clock.tick(cfg.FPS)
return endInterface(screen, cfg)
'''run'''
if __name__ == '__main__':
while True:
if not main(cfg):
break
普普通通
【玩法詳細(xì)介紹+源碼】
CFG配置文件就在文末
10、24點(diǎn)小游戲
玩法:通過加減乘除操作,小學(xué)生都沒問題的。
源碼分享:
import os
import sys
import pygame
from cfg import *
from modules import *
from fractions import Fraction
'''檢查控件是否被點(diǎn)擊'''
def checkClicked(group, mouse_pos, group_type='NUMBER'):
selected = []
# 數(shù)字卡片/運(yùn)算符卡片
if group_type == GROUPTYPES[0] or group_type == GROUPTYPES[1]:
max_selected = 2 if group_type == GROUPTYPES[0] else 1
num_selected = 0
for each in group:
num_selected += int(each.is_selected)
for each in group:
if each.rect.collidepoint(mouse_pos):
if each.is_selected:
each.is_selected = not each.is_selected
num_selected -= 1
each.select_order = None
else:
if num_selected < max_selected:
each.is_selected = not each.is_selected
num_selected += 1
each.select_order = str(num_selected)
if each.is_selected:
selected.append(each.attribute)
# 按鈕卡片
elif group_type == GROUPTYPES[2]:
for each in group:
if each.rect.collidepoint(mouse_pos):
each.is_selected = True
selected.append(each.attribute)
# 拋出異常
else:
raise ValueError('checkClicked.group_type unsupport %s, expect %s, %s or %s...' % (group_type, *GROUPTYPES))
return selected
'''獲取數(shù)字精靈組'''
def getNumberSpritesGroup(numbers):
number_sprites_group = pygame.sprite.Group()
for idx, number in enumerate(numbers):
args = (*NUMBERCARD_POSITIONS[idx], str(number), NUMBERFONT, NUMBERFONT_COLORS, NUMBERCARD_COLORS, str(number))
number_sprites_group.add(Card(*args))
return number_sprites_group
'''獲取運(yùn)算符精靈組'''
def getOperatorSpritesGroup(operators):
operator_sprites_group = pygame.sprite.Group()
for idx, operator in enumerate(operators):
args = (*OPERATORCARD_POSITIONS[idx], str(operator), OPERATORFONT, OPREATORFONT_COLORS, OPERATORCARD_COLORS, str(operator))
operator_sprites_group.add(Card(*args))
return operator_sprites_group
'''獲取按鈕精靈組'''
def getButtonSpritesGroup(buttons):
button_sprites_group = pygame.sprite.Group()
for idx, button in enumerate(buttons):
args = (*BUTTONCARD_POSITIONS[idx], str(button), BUTTONFONT, BUTTONFONT_COLORS, BUTTONCARD_COLORS, str(button))
button_sprites_group.add(Button(*args))
return button_sprites_group
'''計(jì)算'''
def calculate(number1, number2, operator):
operator_map = {'+': '+', '-': '-', '×': '*', '÷': '/'}
try:
result = str(eval(number1+operator_map[operator]+number2))
return result if '.' not in result else str(Fraction(number1+operator_map[operator]+number2))
except:
return None
'''在屏幕上顯示信息'''
def showInfo(text, screen):
rect = pygame.Rect(200, 180, 400, 200)
pygame.draw.rect(screen, PAPAYAWHIP, rect)
font = pygame.font.Font(FONTPATH, 40)
text_render = font.render(text, True, BLACK)
font_size = font.size(text)
screen.blit(text_render, (rect.x+(rect.width-font_size[0])/2, rect.y+(rect.height-font_size[1])/2))
'''主函數(shù)'''
def main():
# 初始化, 導(dǎo)入必要的游戲素材
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode(SCREENSIZE)
pygame.display.set_caption('24 point —— 九歌')
win_sound = pygame.mixer.Sound(AUDIOWINPATH)
lose_sound = pygame.mixer.Sound(AUDIOLOSEPATH)
warn_sound = pygame.mixer.Sound(AUDIOWARNPATH)
pygame.mixer.music.load(BGMPATH)
pygame.mixer.music.play(-1, 0.0)
# 24點(diǎn)游戲生成器
game24_gen = game24Generator()
game24_gen.generate()
# 精靈組
# --數(shù)字
number_sprites_group = getNumberSpritesGroup(game24_gen.numbers_now)
# --運(yùn)算符
operator_sprites_group = getOperatorSpritesGroup(OPREATORS)
# --按鈕
button_sprites_group = getButtonSpritesGroup(BUTTONS)
# 游戲主循環(huán)
clock = pygame.time.Clock()
selected_numbers = []
selected_operators = []
selected_buttons = []
is_win = False
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit(-1)
elif event.type == pygame.MOUSEBUTTONUP:
mouse_pos = pygame.mouse.get_pos()
selected_numbers = checkClicked(number_sprites_group, mouse_pos, 'NUMBER')
selected_operators = checkClicked(operator_sprites_group, mouse_pos, 'OPREATOR')
selected_buttons = checkClicked(button_sprites_group, mouse_pos, 'BUTTON')
screen.fill(AZURE)
# 更新數(shù)字
if len(selected_numbers) == 2 and len(selected_operators) == 1:
noselected_numbers = []
for each in number_sprites_group:
if each.is_selected:
if each.select_order == '1':
selected_number1 = each.attribute
elif each.select_order == '2':
selected_number2 = each.attribute
else:
raise ValueError('Unknow select_order %s, expect 1 or 2...' % each.select_order)
else:
noselected_numbers.append(each.attribute)
each.is_selected = False
for each in operator_sprites_group:
each.is_selected = False
result = calculate(selected_number1, selected_number2, *selected_operators)
if result is not None:
game24_gen.numbers_now = noselected_numbers + [result]
is_win = game24_gen.check()
if is_win:
win_sound.play()
if not is_win and len(game24_gen.numbers_now) == 1:
lose_sound.play()
else:
warn_sound.play()
selected_numbers = []
selected_operators = []
number_sprites_group = getNumberSpritesGroup(game24_gen.numbers_now)
# 精靈都畫到screen上
for each in number_sprites_group:
each.draw(screen, pygame.mouse.get_pos())
for each in operator_sprites_group:
each.draw(screen, pygame.mouse.get_pos())
for each in button_sprites_group:
if selected_buttons and selected_buttons[0] in ['RESET', 'NEXT']:
is_win = False
if selected_buttons and each.attribute == selected_buttons[0]:
each.is_selected = False
number_sprites_group = each.do(game24_gen, getNumberSpritesGroup, number_sprites_group, button_sprites_group)
selected_buttons = []
each.draw(screen, pygame.mouse.get_pos())
# 游戲勝利
if is_win:
showInfo('Congratulations', screen)
# 游戲失敗
if not is_win and len(game24_gen.numbers_now) == 1:
showInfo('Game Over', screen)
pygame.display.flip()
clock.tick(30)
'''run'''
if __name__ == '__main__':
main()
11、平衡木
玩法:也是小時(shí)候的經(jīng)典游戲,控制左右就行,到后面才有一點(diǎn)點(diǎn)難度。
源碼分享:
import cfg
from modules import breakoutClone
'''主函數(shù)'''
def main():
game = breakoutClone(cfg)
game.run()
'''run'''
if __name__ == '__main__':
main()
【還有配置文件】
12、外星人入侵
玩法:這讓我想起了魂斗羅那第幾關(guān)的boss,有點(diǎn)類似,不過魂斗羅那個(gè)難度肯定高點(diǎn)。
源碼分享:
import os
import sys
import cfg
import random
import pygame
from modules import *
'''開始游戲'''
def startGame(screen):
clock = pygame.time.Clock()
# 加載字體
font = pygame.font.SysFont('arial', 18)
if not os.path.isfile('score'):
f = open('score', 'w')
f.write('0')
f.close()
with open('score', 'r') as f:
highest_score = int(f.read().strip())
# 敵方
enemies_group = pygame.sprite.Group()
for i in range(55):
if i < 11:
enemy = enemySprite('small', i, cfg.WHITE, cfg.WHITE)
elif i < 33:
enemy = enemySprite('medium', i, cfg.WHITE, cfg.WHITE)
else:
enemy = enemySprite('large', i, cfg.WHITE, cfg.WHITE)
enemy.rect.x = 85 + (i % 11) * 50
enemy.rect.y = 120 + (i // 11) * 45
enemies_group.add(enemy)
boomed_enemies_group = pygame.sprite.Group()
en_bullets_group = pygame.sprite.Group()
ufo = ufoSprite(color=cfg.RED)
# 我方
myaircraft = aircraftSprite(color=cfg.GREEN, bullet_color=cfg.WHITE)
my_bullets_group = pygame.sprite.Group()
# 用于控制敵方位置更新
# --移動(dòng)一行
enemy_move_count = 24
enemy_move_interval = 24
enemy_move_flag = False
# --改變移動(dòng)方向(改變方向的同時(shí)集體下降一次)
enemy_change_direction_count = 0
enemy_change_direction_interval = 60
enemy_need_down = False
enemy_move_right = True
enemy_need_move_row = 6
enemy_max_row = 5
# 用于控制敵方發(fā)射子彈
enemy_shot_interval = 100
enemy_shot_count = 0
enemy_shot_flag = False
# 游戲進(jìn)行中
running = True
is_win = False
# 主循環(huán)
while running:
screen.fill(cfg.BLACK)
for event in pygame.event.get():
# --點(diǎn)右上角的X或者按Esc鍵退出游戲
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()
# --射擊
if event.type == pygame.MOUSEBUTTONDOWN:
my_bullet = myaircraft.shot()
if my_bullet:
my_bullets_group.add(my_bullet)
# --我方子彈與敵方/UFO碰撞檢測
for enemy in enemies_group:
if pygame.sprite.spritecollide(enemy, my_bullets_group, True, None):
boomed_enemies_group.add(enemy)
enemies_group.remove(enemy)
myaircraft.score += enemy.reward
if pygame.sprite.spritecollide(ufo, my_bullets_group, True, None):
ufo.is_dead = True
myaircraft.score += ufo.reward
# --更新并畫敵方
# ----敵方子彈
enemy_shot_count += 1
if enemy_shot_count > enemy_shot_interval:
enemy_shot_flag = True
enemies_survive_list = [enemy.number for enemy in enemies_group]
shot_number = random.choice(enemies_survive_list)
enemy_shot_count = 0
# ----敵方移動(dòng)
enemy_move_count += 1
if enemy_move_count > enemy_move_interval:
enemy_move_count = 0
enemy_move_flag = True
enemy_need_move_row -= 1
if enemy_need_move_row == 0:
enemy_need_move_row = enemy_max_row
enemy_change_direction_count += 1
if enemy_change_direction_count > enemy_change_direction_interval:
enemy_change_direction_count = 1
enemy_move_right = not enemy_move_right
enemy_need_down = True
# ----每次下降提高移動(dòng)和射擊速度
enemy_move_interval = max(15, enemy_move_interval-3)
enemy_shot_interval = max(50, enemy_move_interval-10)
# ----遍歷更新
for enemy in enemies_group:
if enemy_shot_flag:
if enemy.number == shot_number:
en_bullet = enemy.shot()
en_bullets_group.add(en_bullet)
if enemy_move_flag:
if enemy.number in range((enemy_need_move_row-1)*11, enemy_need_move_row*11):
if enemy_move_right:
enemy.update('right', cfg.SCREENSIZE[1])
else:
enemy.update('left', cfg.SCREENSIZE[1])
else:
enemy.update(None, cfg.SCREENSIZE[1])
if enemy_need_down:
if enemy.update('down', cfg.SCREENSIZE[1]):
running = False
is_win = False
enemy.change_count -= 1
enemy.draw(screen)
enemy_move_flag = False
enemy_need_down = False
enemy_shot_flag = False
# ----敵方爆炸特效
for boomed_enemy in boomed_enemies_group:
if boomed_enemy.boom(screen):
boomed_enemies_group.remove(boomed_enemy)
del boomed_enemy
# --敵方子彈與我方飛船碰撞檢測
if not myaircraft.one_dead:
if pygame.sprite.spritecollide(myaircraft, en_bullets_group, True, None):
myaircraft.one_dead = True
if myaircraft.one_dead:
if myaircraft.boom(screen):
myaircraft.resetBoom()
myaircraft.num_life -= 1
if myaircraft.num_life < 1:
running = False
is_win = False
else:
# ----更新飛船
myaircraft.update(cfg.SCREENSIZE[0])
# ----畫飛船
myaircraft.draw(screen)
if (not ufo.has_boomed) and (ufo.is_dead):
if ufo.boom(screen):
ufo.has_boomed = True
else:
# ----更新UFO
ufo.update(cfg.SCREENSIZE[0])
# ----畫UFO
ufo.draw(screen)
# --畫我方飛船子彈
for bullet in my_bullets_group:
if bullet.update():
my_bullets_group.remove(bullet)
del bullet
else:
bullet.draw(screen)
# --畫敵方子彈
for bullet in en_bullets_group:
if bullet.update(cfg.SCREENSIZE[1]):
en_bullets_group.remove(bullet)
del bullet
else:
bullet.draw(screen)
if myaircraft.score > highest_score:
highest_score = myaircraft.score
# --得分每增加2000我方飛船增加一條生命
if (myaircraft.score % 2000 == 0) and (myaircraft.score > 0) and (myaircraft.score != myaircraft.old_score):
myaircraft.old_score = myaircraft.score
myaircraft.num_life = min(myaircraft.num_life + 1, myaircraft.max_num_life)
# --敵人都死光了的話就勝利了
if len(enemies_group) < 1:
is_win = True
running = False
# --顯示文字
# ----當(dāng)前得分
showText(screen, 'SCORE: ', cfg.WHITE, font, 200, 8)
showText(screen, str(myaircraft.score), cfg.WHITE, font, 200, 24)
# ----敵人數(shù)量
showText(screen, 'ENEMY: ', cfg.WHITE, font, 370, 8)
showText(screen, str(len(enemies_group)), cfg.WHITE, font, 370, 24)
# ----歷史最高分
showText(screen, 'HIGHEST: ', cfg.WHITE, font, 540, 8)
showText(screen, str(highest_score), cfg.WHITE, font, 540, 24)
# ----FPS
showText(screen, 'FPS: ' + str(int(clock.get_fps())), cfg.RED, font, 8, 8)
# --顯示剩余生命值
showLife(screen, myaircraft.num_life, cfg.GREEN)
pygame.display.update()
clock.tick(cfg.FPS)
with open('score', 'w') as f:
f.write(str(highest_score))
return is_win
'''主函數(shù)'''
def main():
# 初始化
pygame.init()
pygame.display.set_caption('外星人入侵 —— 九歌')
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.mixer.init()
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.set_volume(0.4)
pygame.mixer.music.play(-1)
while True:
is_win = startGame(screen)
endInterface(screen, cfg.BLACK, is_win)
'''run'''
if __name__ == '__main__':
main()
13、貪心鳥
玩法:有點(diǎn)類似那個(gè)炸彈人,控制好走位問題不大。
14、井字棋888‘’
玩法:我打賭大家在課堂上肯定玩過這個(gè),想想當(dāng)年和同桌玩這個(gè)廢了好幾本本子。
源碼分享
from tkinter import *
import tkinter.messagebox as msg
root = Tk()
root.title('TIC-TAC-TOE---Project Gurukul')
# labels
Label(root, text="player1 : X", font="times 15").grid(row=0, column=1)
Label(root, text="player2 : O", font="times 15").grid(row=0, column=2)
digits = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# for player1 sign = X and for player2 sign= Y
mark = ''
# counting the no. of click
count = 0
panels = ["panel"] * 10
def win(panels, sign):
return ((panels[1] == panels[2] == panels[3] == sign)
or (panels[1] == panels[4] == panels[7] == sign)
or (panels[1] == panels[5] == panels[9] == sign)
or (panels[2] == panels[5] == panels[8] == sign)
or (panels[3] == panels[6] == panels[9] == sign)
or (panels[3] == panels[5] == panels[7] == sign)
or (panels[4] == panels[5] == panels[6] == sign)
or (panels[7] == panels[8] == panels[9] == sign))
def checker(digit):
global count, mark, digits
# Check which button clicked
if digit == 1 and digit in digits:
digits.remove(digit)
##player1 will play if the value of count is even and for odd player2 will play
if count % 2 == 0:
mark = 'X'
panels[digit] = mark
elif count % 2 != 0:
mark = 'O'
panels[digit] = mark
button1.config(text=mark)
count = count + 1
sign = mark
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 2 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
mark = 'X'
panels[digit] = mark
elif count % 2 != 0:
mark = 'O'
panels[digit] = mark
button2.config(text=mark)
count = count + 1
sign = mark
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 3 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
mark = 'X'
panels[digit] = mark
elif count % 2 != 0:
mark = 'O'
panels[digit] = mark
button3.config(text=mark)
count = count + 1
sign = mark
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 4 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
mark = 'X'
panels[digit] = mark
elif count % 2 != 0:
mark = 'O'
panels[digit] = mark
button4.config(text=mark)
count = count + 1
sign = mark
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 5 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
mark = 'X'
panels[digit] = mark
elif count % 2 != 0:
mark = 'O'
panels[digit] = mark
button5.config(text=mark)
count = count + 1
sign = mark
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 6 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
mark = 'X'
panels[digit] = mark
elif count % 2 != 0:
mark = 'O'
panels[digit] = mark
button6.config(text=mark)
count = count + 1
sign = mark
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 7 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
mark = 'X'
panels[digit] = mark
elif count % 2 != 0:
mark = 'O'
panels[digit] = mark
button7.config(text=mark)
count = count + 1
sign = mark
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 8 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
mark = 'X'
panels[digit] = mark
elif count % 2 != 0:
mark = 'O'
panels[digit] = mark
button8.config(text=mark)
count = count + 1
sign = mark
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 9 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
mark = 'X'
panels[digit] = mark
elif count % 2 != 0:
mark = 'O'
panels[digit] = mark
button9.config(text=mark)
count = count + 1
sign = mark
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
###if count is greater then 8 then the match has been tied
if (count > 8 and win(panels, 'X') == False and win(panels, 'O') == False):
msg.showinfo("Result", "Match Tied")
root.destroy()
####define buttons
button1 = Button(root, width=15, font=('Times 16 bold'), height=7, command=lambda: checker(1))
button1.grid(row=1, column=1)
button2 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(2))
button2.grid(row=1, column=2)
button3 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(3))
button3.grid(row=1, column=3)
button4 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(4))
button4.grid(row=2, column=1)
button5 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(5))
button5.grid(row=2, column=2)
button6 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(6))
button6.grid(row=2, column=3)
button7 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(7))
button7.grid(row=3, column=1)
button8 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(8))
button8.grid(row=3, column=2)
button9 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(9))
button9.grid(row=3, column=3)
root.mainloop()
有點(diǎn)困難
【玩法詳解+源碼獲取看底部】
15、炸彈人
玩法詳解:小時(shí)候的又一經(jīng)典游戲,小時(shí)候很多次都被自己炸死了。
16、保衛(wèi)森林
玩法詳解:類似保衛(wèi)蘿卜,塔防類的小游戲,布局一定要合理,考慮射程屬性等等
17、五子棋
玩法詳解:小時(shí)候很愛玩,先出是有必勝方法的,后面才知道會(huì)有禁手這個(gè)規(guī)則,就比較復(fù)雜了,大家可以學(xué)一下先出必勝的開局,有浦月、流星、丘月、游星、慧星等等。
18、吃豆豆
玩法詳解:考驗(yàn)手速和操作和走位,我不喜歡玩這類跑來跑去的。
19、坦克大戰(zhàn)
玩法詳解:這是經(jīng)典中的經(jīng)典,我喜歡玩雙人模式,后面有一些改版的模式,這是我覺得少數(shù)幾個(gè)現(xiàn)在玩都不過時(shí)的游戲。
20、超級(jí)瑪麗
玩法詳解:經(jīng)典中的經(jīng)典,小時(shí)候玩覺得可難了,操作不必介紹了吧。
21、水果忍者
玩法詳解:切水果風(fēng)靡一時(shí)的游戲,不知道為啥總是切刀炸掉,挺解壓的游戲。
極度困難
【攻略大全+源碼獲取看底部】
22、飛機(jī)大戰(zhàn)
攻略大全:從這里開始的游戲,真正算的上有難度了,這個(gè)飛機(jī)大戰(zhàn)跟童年玩的比起來還是差一點(diǎn)。
23、2048
攻略大全:也是曾經(jīng)風(fēng)靡一時(shí)的,越到后面越難,合成的時(shí)候一定要大數(shù)放在角落。
24、推箱子
攻略大全:以前的那個(gè)手機(jī)上都有的游戲,越推到后面的關(guān)卡越難,我好像是玩到二十多關(guān)就玩不下去了。
25、塔防
攻略大全:又是一種塔防類的游戲,有點(diǎn)意思,就是速度太快了,反應(yīng)不過來。
26、植物大戰(zhàn)僵尸
攻略大全:最經(jīng)典的植物大戰(zhàn)僵尸,操作不用介紹了,不過可以自己玩玩看。
27、掃雷
玩法詳解:掃雷還是挺有意思的,技能玩又考驗(yàn)推理
終極挑戰(zhàn)?
【太難了。。源碼領(lǐng)取看文章底部】
28、拼圖
游戲體驗(yàn):三個(gè)終極挑戰(zhàn),能完成一個(gè)就算你厲害,拼圖是我最煩的,太難了。
?29、走迷宮
游戲體驗(yàn):我反正沒走出去,大家能走出去嗎
30、最強(qiáng)游戲
游戲體驗(yàn):可太難控制了。。
行業(yè)資料:添加即可領(lǐng)取PPT模板、簡歷模板、行業(yè)經(jīng)典書籍PDF。
面試題庫:歷年經(jīng)典,熱乎的大廠面試真題,持續(xù)更新中,添加獲取。
學(xué)習(xí)資料:含Python、爬蟲、數(shù)據(jù)分析、算法等學(xué)習(xí)視頻和文檔,添加獲取
交流加群:大佬指點(diǎn)迷津,你的問題往往有人遇到過,技術(shù)互助交流。
?
其他源碼以及cfg配置文件等領(lǐng)取文章來源:http://www.zghlxwxcb.cn/news/detail-796385.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-796385.html
大家好,我是辣條。
今天給大家?guī)?0個(gè)py小游戲,一定要收藏!
目錄
有手就行
1、吃金幣
2、打乒乓
3、滑雪
4、并夕夕版飛機(jī)大戰(zhàn)
5、打地鼠
簡簡單單
6、小恐龍
7、消消樂
8、俄羅斯方塊
9、貪吃蛇
普普通通
10、24點(diǎn)小游戲
11、平衡木
12、外星人入侵
13、貪心鳥
14、井字棋888‘’
有點(diǎn)困難
15、炸彈人
16、保衛(wèi)森林
17、五子棋
18、吃豆豆
19、坦克大戰(zhàn)
20、超級(jí)瑪麗
21、水果忍者
極度困難
22、飛機(jī)大戰(zhàn)
23、2048
24、推箱子
25、塔防
26、植物大戰(zhàn)僵尸
27、掃雷
終極挑戰(zhàn)?
28、拼圖
?29、走迷宮
30、最強(qiáng)游戲
有手就行
1、吃金幣
【有手就行系列不介紹玩法了+附源碼】
源碼分享:
?
import os
import cfg
import sys
import pygame
import random
from modules import *
'''游戲初始化'''
def initGame():
? ? # 初始化pygame, 設(shè)置展示窗口
? ? pygame.init()
? ? screen = pygame.display.set_mode(cfg.SCREENSIZE)
? ? pygame.display.set_caption('catch coins —— 九歌')
? ? # 加載必要的游戲素材
? ? game_images = {}
? ? for key, value in cfg.IMAGE_PATHS.items():
? ? ? ? if isinstance(value, list):
? ? ? ? ? ? images = []
? ? ? ? ? ? for item in value: images.append(pygame.image.load(item))
? ? ? ? ? ? game_images[key] = images
? ? ? ? else:
? ? ? ? ? ? game_images[key] = pygame.image.load(value)
? ? game_sounds = {}
? ? for key, value in cfg.AUDIO_PATHS.items():
? ? ? ? if key == 'bgm': continue
? ? ? ? game_sounds[key] = pygame.mixer.Sound(value)
? ? # 返回初始化數(shù)據(jù)
? ? return screen, game_images, game_sounds
'''主函數(shù)'''
def main():
? ? # 初始化
? ? screen, game_images, game_sounds = initGame()
? ? # 播放背景音樂
? ? pygame.mixer.music.load(cfg.AUDIO_PATHS['bgm'])
? ? pygame.mixer.music.play(-1, 0.0)
? ? # 字體加載
? ? font = pygame.font.Font(cfg.FONT_PATH, 40)
? ? # 定義hero
? ? hero = Hero(game_images['hero'], position=(375, 520))
? ? # 定義食物組
? ? food_sprites_group = pygame.sprite.Group()
? ? generate_food_freq = random.randint(10, 20)
? ? generate_food_count = 0
? ? # 當(dāng)前分?jǐn)?shù)/歷史最高分
? ? score = 0
? ? highest_score = 0 if not os.path.exists(cfg.HIGHEST_SCORE_RECORD_FILEPATH) else int(open(cfg.HIGHEST_SCORE_RECORD_FILEPATH).read())
? ? # 游戲主循環(huán)
? ? clock = pygame.time.Clock()
? ? while True:
? ? ? ? # --填充背景
? ? ? ? screen.fill(0)
? ? ? ? screen.blit(game_images['background'], (0, 0))
? ? ? ? # --倒計(jì)時(shí)信息
? ? ? ? countdown_text = 'Count down: ' + str((90000 - pygame.time.get_ticks()) // 60000) + ":" + str((90000 - pygame.time.get_ticks()) // 1000 % 60).zfill(2)
? ? ? ? countdown_text = font.render(countdown_text, True, (0, 0, 0))
? ? ? ? countdown_rect = countdown_text.get_rect()
? ? ? ? countdown_rect.topright = [cfg.SCREENSIZE[0]-30, 5]
? ? ? ? screen.blit(countdown_text, countdown_rect)
? ? ? ? # --按鍵檢測
? ? ? ? for event in pygame.event.get():
? ? ? ? ? ? if event.type == pygame.QUIT:
? ? ? ? ? ? ? ? pygame.quit()
? ? ? ? ? ? ? ? sys.exit()
? ? ? ? key_pressed = pygame.key.get_pressed()
? ? ? ? if key_pressed[pygame.K_a] or key_pressed[pygame.K_LEFT]:
? ? ? ? ? ? hero.move(cfg.SCREENSIZE, 'left')
? ? ? ? if key_pressed[pygame.K_d] or key_pressed[pygame.K_RIGHT]:
? ? ? ? ? ? hero.move(cfg.SCREENSIZE, 'right')
? ? ? ? # --隨機(jī)生成食物
? ? ? ? generate_food_count += 1
? ? ? ? if generate_food_count > generate_food_freq:
? ? ? ? ? ? generate_food_freq = random.randint(10, 20)
? ? ? ? ? ? generate_food_count = 0
? ? ? ? ? ? food = Food(game_images, random.choice(['gold',] * 10 + ['apple']), cfg.SCREENSIZE)
? ? ? ? ? ? food_sprites_group.add(food)
? ? ? ? # --更新食物
? ? ? ? for food in food_sprites_group:
? ? ? ? ? ? if food.update(): food_sprites_group.remove(food)
? ? ? ? # --碰撞檢測
? ? ? ? for food in food_sprites_group:
? ? ? ? ? ? if pygame.sprite.collide_mask(food, hero):
? ? ? ? ? ? ? ? game_sounds['get'].play()
? ? ? ? ? ? ? ? food_sprites_group.remove(food)
? ? ? ? ? ? ? ? score += food.score
? ? ? ? ? ? ? ? if score > highest_score: highest_score = score
? ? ? ? # --畫hero
? ? ? ? hero.draw(screen)
? ? ? ? # --畫食物
? ? ? ? food_sprites_group.draw(screen)
? ? ? ? # --顯示得分
? ? ? ? score_text = f'Score: {score}, Highest: {highest_score}'
? ? ? ? score_text = font.render(score_text, True, (0, 0, 0))
? ? ? ? score_rect = score_text.get_rect()
? ? ? ? score_rect.topleft = [5, 5]
? ? ? ? screen.blit(score_text, score_rect)
? ? ? ? # --判斷游戲是否結(jié)束
? ? ? ? if pygame.time.get_ticks() >= 90000:
? ? ? ? ? ? break
? ? ? ? # --更新屏幕
? ? ? ? pygame.display.flip()
? ? ? ? clock.tick(cfg.FPS)
? ? # 游戲結(jié)束, 記錄最高分并顯示游戲結(jié)束畫面
? ? fp = open(cfg.HIGHEST_SCORE_RECORD_FILEPATH, 'w')
? ? fp.write(str(highest_score))
? ? fp.close()
? ? return showEndGameInterface(screen, cfg, score, highest_score)
'''run'''
if __name__ == '__main__':
? ? while main():
? ? ? ? pass
2、打乒乓
源碼分享:
import sys
import cfg
import pygame
from modules import *
'''定義按鈕'''
def Button(screen, position, text, button_size=(200, 50)):
left, top = position
bwidth, bheight = button_size
pygame.draw.line(screen, (150, 150, 150), (left, top), (left+bwidth, top), 5)
pygame.draw.line(screen, (150, 150, 150), (left, top-2), (left, top+bheight), 5)
pygame.draw.line(screen, (50, 50, 50), (left, top+bheight), (left+bwidth, top+bheight), 5)
pygame.draw.line(screen, (50, 50, 50), (left+bwidth, top+bheight), (left+bwidth, top), 5)
pygame.draw.rect(screen, (100, 100, 100), (left, top, bwidth, bheight))
font = pygame.font.Font(cfg.FONTPATH, 30)
text_render = font.render(text, 1, (255, 235, 205))
return screen.blit(text_render, (left+50, top+10))
'''
Function:
開始界面
Input:
--screen: 游戲界面
Return:
--game_mode: 1(單人模式)/2(雙人模式)
'''
def startInterface(screen):
clock = pygame.time.Clock()
while True:
screen.fill((41, 36, 33))
button_1 = Button(screen, (150, 175), '1 Player')
button_2 = Button(screen, (150, 275), '2 Player')
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN:
if button_1.collidepoint(pygame.mouse.get_pos()):
return 1
elif button_2.collidepoint(pygame.mouse.get_pos()):
return 2
clock.tick(10)
pygame.display.update()
'''結(jié)束界面'''
def endInterface(screen, score_left, score_right):
clock = pygame.time.Clock()
font1 = pygame.font.Font(cfg.FONTPATH, 30)
font2 = pygame.font.Font(cfg.FONTPATH, 20)
msg = 'Player on left won!' if score_left > score_right else 'Player on right won!'
texts = [font1.render(msg, True, cfg.WHITE),
font2.render('Press ESCAPE to quit.', True, cfg.WHITE),
font2.render('Press ENTER to continue or play again.', True, cfg.WHITE)]
positions = [[120, 200], [155, 270], [80, 300]]
while True:
screen.fill((41, 36, 33))
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN:
return
elif event.key == pygame.K_ESCAPE:
sys.exit()
pygame.quit()
for text, pos in zip(texts, positions):
screen.blit(text, pos)
clock.tick(10)
pygame.display.update()
'''運(yùn)行游戲Demo'''
def runDemo(screen):
# 加載游戲素材
hit_sound = pygame.mixer.Sound(cfg.HITSOUNDPATH)
goal_sound = pygame.mixer.Sound(cfg.GOALSOUNDPATH)
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.play(-1, 0.0)
font = pygame.font.Font(cfg.FONTPATH, 50)
# 開始界面
game_mode = startInterface(screen)
# 游戲主循環(huán)
# --左邊球拍(ws控制, 僅雙人模式時(shí)可控制)
score_left = 0
racket_left = Racket(cfg.RACKETPICPATH, 'LEFT', cfg)
# --右邊球拍(↑↓控制)
score_right = 0
racket_right = Racket(cfg.RACKETPICPATH, 'RIGHT', cfg)
# --球
ball = Ball(cfg.BALLPICPATH, cfg)
clock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit(-1)
screen.fill((41, 36, 33))
# 玩家操作
pressed_keys = pygame.key.get_pressed()
if pressed_keys[pygame.K_UP]:
racket_right.move('UP')
elif pressed_keys[pygame.K_DOWN]:
racket_right.move('DOWN')
if game_mode == 2:
if pressed_keys[pygame.K_w]:
racket_left.move('UP')
elif pressed_keys[pygame.K_s]:
racket_left.move('DOWN')
else:
racket_left.automove(ball)
# 球運(yùn)動(dòng)
scores = ball.move(ball, racket_left, racket_right, hit_sound, goal_sound)
score_left += scores[0]
score_right += scores[1]
# 顯示
# --分隔線
pygame.draw.rect(screen, cfg.WHITE, (247, 0, 6, 500))
# --球
ball.draw(screen)
# --拍
racket_left.draw(screen)
racket_right.draw(screen)
# --得分
screen.blit(font.render(str(score_left), False, cfg.WHITE), (150, 10))
screen.blit(font.render(str(score_right), False, cfg.WHITE), (300, 10))
if score_left == 11 or score_right == 11:
return score_left, score_right
clock.tick(100)
pygame.display.update()
'''主函數(shù)'''
def main():
# 初始化
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((cfg.WIDTH, cfg.HEIGHT))
pygame.display.set_caption('pingpong —— 九歌')
# 開始游戲
while True:
score_left, score_right = runDemo(screen)
endInterface(screen, score_left, score_right)
'''run'''
if __name__ == '__main__':
main()
3、滑雪
源碼分享:
import sys
import cfg
import pygame
import random
'''滑雪者類'''
class SkierClass(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
# 滑雪者的朝向(-2到2)
self.direction = 0
self.imagepaths = cfg.SKIER_IMAGE_PATHS[:-1]
self.image = pygame.image.load(self.imagepaths[self.direction])
self.rect = self.image.get_rect()
self.rect.center = [320, 100]
self.speed = [self.direction, 6-abs(self.direction)*2]
'''改變滑雪者的朝向. 負(fù)數(shù)為向左,正數(shù)為向右,0為向前'''
def turn(self, num):
self.direction += num
self.direction = max(-2, self.direction)
self.direction = min(2, self.direction)
center = self.rect.center
self.image = pygame.image.load(self.imagepaths[self.direction])
self.rect = self.image.get_rect()
self.rect.center = center
self.speed = [self.direction, 6-abs(self.direction)*2]
return self.speed
'''移動(dòng)滑雪者'''
def move(self):
self.rect.centerx += self.speed[0]
self.rect.centerx = max(20, self.rect.centerx)
self.rect.centerx = min(620, self.rect.centerx)
'''設(shè)置為摔倒?fàn)顟B(tài)'''
def setFall(self):
self.image = pygame.image.load(cfg.SKIER_IMAGE_PATHS[-1])
'''設(shè)置為站立狀態(tài)'''
def setForward(self):
self.direction = 0
self.image = pygame.image.load(self.imagepaths[self.direction])
'''
Function:
障礙物類
Input:
img_path: 障礙物圖片路徑
location: 障礙物位置
attribute: 障礙物類別屬性
'''
class ObstacleClass(pygame.sprite.Sprite):
def __init__(self, img_path, location, attribute):
pygame.sprite.Sprite.__init__(self)
self.img_path = img_path
self.image = pygame.image.load(self.img_path)
self.location = location
self.rect = self.image.get_rect()
self.rect.center = self.location
self.attribute = attribute
self.passed = False
'''移動(dòng)'''
def move(self, num):
self.rect.centery = self.location[1] - num
'''創(chuàng)建障礙物'''
def createObstacles(s, e, num=10):
obstacles = pygame.sprite.Group()
locations = []
for i in range(num):
row = random.randint(s, e)
col = random.randint(0, 9)
location = [col*64+20, row*64+20]
if location not in locations:
locations.append(location)
attribute = random.choice(list(cfg.OBSTACLE_PATHS.keys()))
img_path = cfg.OBSTACLE_PATHS[attribute]
obstacle = ObstacleClass(img_path, location, attribute)
obstacles.add(obstacle)
return obstacles
'''合并障礙物'''
def AddObstacles(obstacles0, obstacles1):
obstacles = pygame.sprite.Group()
for obstacle in obstacles0:
obstacles.add(obstacle)
for obstacle in obstacles1:
obstacles.add(obstacle)
return obstacles
'''顯示游戲開始界面'''
def ShowStartInterface(screen, screensize):
screen.fill((255, 255, 255))
tfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//5)
cfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//20)
title = tfont.render(u'滑雪游戲', True, (255, 0, 0))
content = cfont.render(u'按任意鍵開始游戲', True, (0, 0, 255))
trect = title.get_rect()
trect.midtop = (screensize[0]/2, screensize[1]/5)
crect = content.get_rect()
crect.midtop = (screensize[0]/2, screensize[1]/2)
screen.blit(title, trect)
screen.blit(content, crect)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
return
pygame.display.update()
'''顯示分?jǐn)?shù)'''
def showScore(screen, score, pos=(10, 10)):
font = pygame.font.Font(cfg.FONTPATH, 30)
score_text = font.render("Score: %s" % score, True, (0, 0, 0))
screen.blit(score_text, pos)
'''更新當(dāng)前幀的游戲畫面'''
def updateFrame(screen, obstacles, skier, score):
screen.fill((255, 255, 255))
obstacles.draw(screen)
screen.blit(skier.image, skier.rect)
showScore(screen, score)
pygame.display.update()
'''主程序'''
def main():
# 游戲初始化
pygame.init()
pygame.mixer.init()
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.set_volume(0.4)
pygame.mixer.music.play(-1)
# 設(shè)置屏幕
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('滑雪游戲 —— 九歌')
# 游戲開始界面
ShowStartInterface(screen, cfg.SCREENSIZE)
# 實(shí)例化游戲精靈
# --滑雪者
skier = SkierClass()
# --創(chuàng)建障礙物
obstacles0 = createObstacles(20, 29)
obstacles1 = createObstacles(10, 19)
obstaclesflag = 0
obstacles = AddObstacles(obstacles0, obstacles1)
# 游戲clock
clock = pygame.time.Clock()
# 記錄滑雪的距離
distance = 0
# 記錄當(dāng)前的分?jǐn)?shù)
score = 0
# 記錄當(dāng)前的速度
speed = [0, 6]
# 游戲主循環(huán)
while True:
# --事件捕獲
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT or event.key == pygame.K_a:
speed = skier.turn(-1)
elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
speed = skier.turn(1)
# --更新當(dāng)前游戲幀的數(shù)據(jù)
skier.move()
distance += speed[1]
if distance >= 640 and obstaclesflag == 0:
obstaclesflag = 1
obstacles0 = createObstacles(20, 29)
obstacles = AddObstacles(obstacles0, obstacles1)
if distance >= 1280 and obstaclesflag == 1:
obstaclesflag = 0
distance -= 1280
for obstacle in obstacles0:
obstacle.location[1] = obstacle.location[1] - 1280
obstacles1 = createObstacles(10, 19)
obstacles = AddObstacles(obstacles0, obstacles1)
for obstacle in obstacles:
obstacle.move(distance)
# --碰撞檢測
hitted_obstacles = pygame.sprite.spritecollide(skier, obstacles, False)
if hitted_obstacles:
if hitted_obstacles[0].attribute == "tree" and not hitted_obstacles[0].passed:
score -= 50
skier.setFall()
updateFrame(screen, obstacles, skier, score)
pygame.time.delay(1000)
skier.setForward()
speed = [0, 6]
hitted_obstacles[0].passed = True
elif hitted_obstacles[0].attribute == "flag" and not hitted_obstacles[0].passed:
score += 10
obstacles.remove(hitted_obstacles[0])
# --更新屏幕
updateFrame(screen, obstacles, skier, score)
clock.tick(cfg.FPS)
'''run'''
if __name__ == '__main__':
main();
4、并夕夕版飛機(jī)大戰(zhàn)
源碼分享:
import sys
import cfg
import pygame
from modules import *
'''游戲界面'''
def GamingInterface(num_player, screen):
# 初始化
pygame.mixer.music.load(cfg.SOUNDPATHS['Cool Space Music'])
pygame.mixer.music.set_volume(0.4)
pygame.mixer.music.play(-1)
explosion_sound = pygame.mixer.Sound(cfg.SOUNDPATHS['boom'])
fire_sound = pygame.mixer.Sound(cfg.SOUNDPATHS['shot'])
font = pygame.font.Font(cfg.FONTPATH, 20)
# 游戲背景圖
bg_imgs = [cfg.IMAGEPATHS['bg_big'], cfg.IMAGEPATHS['seamless_space'], cfg.IMAGEPATHS['space3']]
bg_move_dis = 0
bg_1 = pygame.image.load(bg_imgs[0]).convert()
bg_2 = pygame.image.load(bg_imgs[1]).convert()
bg_3 = pygame.image.load(bg_imgs[2]).convert()
# 玩家, 子彈和小行星精靈組
player_group = pygame.sprite.Group()
bullet_group = pygame.sprite.Group()
asteroid_group = pygame.sprite.Group()
# 產(chǎn)生小行星的時(shí)間間隔
asteroid_ticks = 90
for i in range(num_player):
player_group.add(Ship(i+1, cfg))
clock = pygame.time.Clock()
# 分?jǐn)?shù)
score_1, score_2 = 0, 0
# 游戲主循環(huán)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# --玩家一: ↑↓←→控制, j射擊; 玩家二: wsad控制, 空格射擊
pressed_keys = pygame.key.get_pressed()
for idx, player in enumerate(player_group):
direction = None
if idx == 0:
if pressed_keys[pygame.K_UP]:
direction = 'up'
elif pressed_keys[pygame.K_DOWN]:
direction = 'down'
elif pressed_keys[pygame.K_LEFT]:
direction = 'left'
elif pressed_keys[pygame.K_RIGHT]:
direction = 'right'
if direction:
player.move(direction)
if pressed_keys[pygame.K_j]:
if player.cooling_time == 0:
fire_sound.play()
bullet_group.add(player.shot())
player.cooling_time = 20
elif idx == 1:
if pressed_keys[pygame.K_w]:
direction = 'up'
elif pressed_keys[pygame.K_s]:
direction = 'down'
elif pressed_keys[pygame.K_a]:
direction = 'left'
elif pressed_keys[pygame.K_d]:
direction = 'right'
if direction:
player.move(direction)
if pressed_keys[pygame.K_SPACE]:
if player.cooling_time == 0:
fire_sound.play()
bullet_group.add(player.shot())
player.cooling_time = 20
if player.cooling_time > 0:
player.cooling_time -= 1
if (score_1 + score_2) < 500:
background = bg_1
elif (score_1 + score_2) < 1500:
background = bg_2
else:
background = bg_3
# --向下移動(dòng)背景圖實(shí)現(xiàn)飛船向上移動(dòng)的效果
screen.blit(background, (0, -background.get_rect().height + bg_move_dis))
screen.blit(background, (0, bg_move_dis))
bg_move_dis = (bg_move_dis + 2) % background.get_rect().height
# --生成小行星
if asteroid_ticks == 0:
asteroid_ticks = 90
asteroid_group.add(Asteroid(cfg))
else:
asteroid_ticks -= 1
# --畫飛船
for player in player_group:
if pygame.sprite.spritecollide(player, asteroid_group, True, None):
player.explode_step = 1
explosion_sound.play()
elif player.explode_step > 0:
if player.explode_step > 3:
player_group.remove(player)
if len(player_group) == 0:
return
else:
player.explode(screen)
else:
player.draw(screen)
# --畫子彈
for bullet in bullet_group:
bullet.move()
if pygame.sprite.spritecollide(bullet, asteroid_group, True, None):
bullet_group.remove(bullet)
if bullet.player_idx == 1:
score_1 += 1
else:
score_2 += 1
else:
bullet.draw(screen)
# --畫小行星
for asteroid in asteroid_group:
asteroid.move()
asteroid.rotate()
asteroid.draw(screen)
# --顯示分?jǐn)?shù)
score_1_text = '玩家一得分: %s' % score_1
score_2_text = '玩家二得分: %s' % score_2
text_1 = font.render(score_1_text, True, (0, 0, 255))
text_2 = font.render(score_2_text, True, (255, 0, 0))
screen.blit(text_1, (2, 5))
screen.blit(text_2, (2, 35))
# --屏幕刷新
pygame.display.update()
clock.tick(60)
'''主函數(shù)'''
def main():
pygame.init()
pygame.font.init()
pygame.mixer.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('飛機(jī)大戰(zhàn) —— 九歌')
num_player = StartInterface(screen, cfg)
if num_player == 1:
while True:
GamingInterface(num_player=1, screen=screen)
EndInterface(screen, cfg)
else:
while True:
GamingInterface(num_player=2, screen=screen)
EndInterface(screen, cfg)
'''run'''
if __name__ == '__main__':
main()
5、打地鼠
源碼分享:
import cfg
import sys
import pygame
import random
from modules import *
'''游戲初始化'''
def initGame():
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('打地鼠 —— 九歌')
return screen
'''主函數(shù)'''
def main():
# 初始化
screen = initGame()
# 加載背景音樂和其他音效
pygame.mixer.music.load(cfg.BGM_PATH)
pygame.mixer.music.play(-1)
audios = {
'count_down': pygame.mixer.Sound(cfg.COUNT_DOWN_SOUND_PATH),
'hammering': pygame.mixer.Sound(cfg.HAMMERING_SOUND_PATH)
}
# 加載字體
font = pygame.font.Font(cfg.FONT_PATH, 40)
# 加載背景圖片
bg_img = pygame.image.load(cfg.GAME_BG_IMAGEPATH)
# 開始界面
startInterface(screen, cfg.GAME_BEGIN_IMAGEPATHS)
# 地鼠改變位置的計(jì)時(shí)
hole_pos = random.choice(cfg.HOLE_POSITIONS)
change_hole_event = pygame.USEREVENT
pygame.time.set_timer(change_hole_event, 800)
# 地鼠
mole = Mole(cfg.MOLE_IMAGEPATHS, hole_pos)
# 錘子
hammer = Hammer(cfg.HAMMER_IMAGEPATHS, (500, 250))
# 時(shí)鐘
clock = pygame.time.Clock()
# 分?jǐn)?shù)
your_score = 0
flag = False
# 初始時(shí)間
init_time = pygame.time.get_ticks()
# 游戲主循環(huán)
while True:
# --游戲時(shí)間為60s
time_remain = round((61000 - (pygame.time.get_ticks() - init_time)) / 1000.)
# --游戲時(shí)間減少, 地鼠變位置速度變快
if time_remain == 40 and not flag:
hole_pos = random.choice(cfg.HOLE_POSITIONS)
mole.reset()
mole.setPosition(hole_pos)
pygame.time.set_timer(change_hole_event, 650)
flag = True
elif time_remain == 20 and flag:
hole_pos = random.choice(cfg.HOLE_POSITIONS)
mole.reset()
mole.setPosition(hole_pos)
pygame.time.set_timer(change_hole_event, 500)
flag = False
# --倒計(jì)時(shí)音效
if time_remain == 10:
audios['count_down'].play()
# --游戲結(jié)束
if time_remain < 0: break
count_down_text = font.render('Time: '+str(time_remain), True, cfg.WHITE)
# --按鍵檢測
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEMOTION:
hammer.setPosition(pygame.mouse.get_pos())
elif event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
hammer.setHammering()
elif event.type == change_hole_event:
hole_pos = random.choice(cfg.HOLE_POSITIONS)
mole.reset()
mole.setPosition(hole_pos)
# --碰撞檢測
if hammer.is_hammering and not mole.is_hammer:
is_hammer = pygame.sprite.collide_mask(hammer, mole)
if is_hammer:
audios['hammering'].play()
mole.setBeHammered()
your_score += 10
# --分?jǐn)?shù)
your_score_text = font.render('Score: '+str(your_score), True, cfg.BROWN)
# --綁定必要的游戲元素到屏幕(注意順序)
screen.blit(bg_img, (0, 0))
screen.blit(count_down_text, (875, 8))
screen.blit(your_score_text, (800, 430))
mole.draw(screen)
hammer.draw(screen)
# --更新
pygame.display.flip()
clock.tick(60)
# 讀取最佳分?jǐn)?shù)(try塊避免第一次游戲無.rec文件)
try:
best_score = int(open(cfg.RECORD_PATH).read())
except:
best_score = 0
# 若當(dāng)前分?jǐn)?shù)大于最佳分?jǐn)?shù)則更新最佳分?jǐn)?shù)
if your_score > best_score:
f = open(cfg.RECORD_PATH, 'w')
f.write(str(your_score))
f.close()
# 結(jié)束界面
score_info = {'your_score': your_score, 'best_score': best_score}
is_restart = endInterface(screen, cfg.GAME_END_IMAGEPATH, cfg.GAME_AGAIN_IMAGEPATHS, score_info, cfg.FONT_PATH, [cfg.WHITE, cfg.RED], cfg.SCREENSIZE)
return is_restart
'''run'''
if __name__ == '__main__':
while True:
is_restart = main()
if not is_restart:
break
簡簡單單
【簡單介紹一下玩法+附源碼】
6、小恐龍
玩法:上下控制起跳躲避
源碼分享:
import cfg
import sys
import random
import pygame
from modules import *
'''main'''
def main(highest_score):
# 游戲初始化
pygame.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('九歌')
# 導(dǎo)入所有聲音文件
sounds = {}
for key, value in cfg.AUDIO_PATHS.items():
sounds[key] = pygame.mixer.Sound(value)
# 游戲開始界面
GameStartInterface(screen, sounds, cfg)
# 定義一些游戲中必要的元素和變量
score = 0
score_board = Scoreboard(cfg.IMAGE_PATHS['numbers'], position=(534, 15), bg_color=cfg.BACKGROUND_COLOR)
highest_score = highest_score
highest_score_board = Scoreboard(cfg.IMAGE_PATHS['numbers'], position=(435, 15), bg_color=cfg.BACKGROUND_COLOR, is_highest=True)
dino = Dinosaur(cfg.IMAGE_PATHS['dino'])
ground = Ground(cfg.IMAGE_PATHS['ground'], position=(0, cfg.SCREENSIZE[1]))
cloud_sprites_group = pygame.sprite.Group()
cactus_sprites_group = pygame.sprite.Group()
ptera_sprites_group = pygame.sprite.Group()
add_obstacle_timer = 0
score_timer = 0
# 游戲主循環(huán)
clock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE or event.key == pygame.K_UP:
dino.jump(sounds)
elif event.key == pygame.K_DOWN:
dino.duck()
elif event.type == pygame.KEYUP and event.key == pygame.K_DOWN:
dino.unduck()
screen.fill(cfg.BACKGROUND_COLOR)
# --隨機(jī)添加云
if len(cloud_sprites_group) < 5 and random.randrange(0, 300) == 10:
cloud_sprites_group.add(Cloud(cfg.IMAGE_PATHS['cloud'], position=(cfg.SCREENSIZE[0], random.randrange(30, 75))))
# --隨機(jī)添加仙人掌/飛龍
add_obstacle_timer += 1
if add_obstacle_timer > random.randrange(50, 150):
add_obstacle_timer = 0
random_value = random.randrange(0, 10)
if random_value >= 5 and random_value <= 7:
cactus_sprites_group.add(Cactus(cfg.IMAGE_PATHS['cacti']))
else:
position_ys = [cfg.SCREENSIZE[1]*0.82, cfg.SCREENSIZE[1]*0.75, cfg.SCREENSIZE[1]*0.60, cfg.SCREENSIZE[1]*0.20]
ptera_sprites_group.add(Ptera(cfg.IMAGE_PATHS['ptera'], position=(600, random.choice(position_ys))))
# --更新游戲元素
dino.update()
ground.update()
cloud_sprites_group.update()
cactus_sprites_group.update()
ptera_sprites_group.update()
score_timer += 1
if score_timer > (cfg.FPS//12):
score_timer = 0
score += 1
score = min(score, 99999)
if score > highest_score:
highest_score = score
if score % 100 == 0:
sounds['point'].play()
if score % 1000 == 0:
ground.speed -= 1
for item in cloud_sprites_group:
item.speed -= 1
for item in cactus_sprites_group:
item.speed -= 1
for item in ptera_sprites_group:
item.speed -= 1
# --碰撞檢測
for item in cactus_sprites_group:
if pygame.sprite.collide_mask(dino, item):
dino.die(sounds)
for item in ptera_sprites_group:
if pygame.sprite.collide_mask(dino, item):
dino.die(sounds)
# --將游戲元素畫到屏幕上
dino.draw(screen)
ground.draw(screen)
cloud_sprites_group.draw(screen)
cactus_sprites_group.draw(screen)
ptera_sprites_group.draw(screen)
score_board.set(score)
highest_score_board.set(highest_score)
score_board.draw(screen)
highest_score_board.draw(screen)
# --更新屏幕
pygame.display.update()
clock.tick(cfg.FPS)
# --游戲是否結(jié)束
if dino.is_dead:
break
# 游戲結(jié)束界面
return GameEndInterface(screen, cfg), highest_score
'''run'''
if __name__ == '__main__':
highest_score = 0
while True:
flag, highest_score = main(highest_score)
if not flag: break
7、消消樂
玩法:三個(gè)相連就能消除
源碼分享:
import os
import sys
import cfg
import pygame
from modules import *
'''游戲主程序'''
def main():
pygame.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('Gemgem —— 九歌')
# 加載背景音樂
pygame.mixer.init()
pygame.mixer.music.load(os.path.join(cfg.ROOTDIR, "resources/audios/bg.mp3"))
pygame.mixer.music.set_volume(0.6)
pygame.mixer.music.play(-1)
# 加載音效
sounds = {}
sounds['mismatch'] = pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, 'resources/audios/badswap.wav'))
sounds['match'] = []
for i in range(6):
sounds['match'].append(pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, 'resources/audios/match%s.wav' % i)))
# 加載字體
font = pygame.font.Font(os.path.join(cfg.ROOTDIR, 'resources/font/font.TTF'), 25)
# 圖片加載
gem_imgs = []
for i in range(1, 8):
gem_imgs.append(os.path.join(cfg.ROOTDIR, 'resources/images/gem%s.png' % i))
# 主循環(huán)
game = gemGame(screen, sounds, font, gem_imgs, cfg)
while True:
score = game.start()
flag = False
# 一輪游戲結(jié)束后玩家選擇重玩或者退出
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT or (event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE):
pygame.quit()
sys.exit()
elif event.type == pygame.KEYUP and event.key == pygame.K_r:
flag = True
if flag:
break
screen.fill((135, 206, 235))
text0 = 'Final score: %s' % score
text1 = 'Press <R> to restart the game.'
text2 = 'Press <Esc> to quit the game.'
y = 150
for idx, text in enumerate([text0, text1, text2]):
text_render = font.render(text, 1, (85, 65, 0))
rect = text_render.get_rect()
if idx == 0:
rect.left, rect.top = (212, y)
elif idx == 1:
rect.left, rect.top = (122.5, y)
else:
rect.left, rect.top = (126.5, y)
y += 100
screen.blit(text_render, rect)
pygame.display.update()
game.reset()
'''run'''
if __name__ == '__main__':
main()
8、俄羅斯方塊
玩法:童年經(jīng)典,普通模式?jīng)]啥意思,小時(shí)候我們都是玩加速的python中turtle畫蝴蝶。
源碼分享:
import os
import sys
import random
from modules import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
'''定義俄羅斯方塊游戲類'''
class TetrisGame(QMainWindow):
def __init__(self, parent=None):
super(TetrisGame, self).__init__(parent)
# 是否暫停ing
self.is_paused = False
# 是否開始ing
self.is_started = False
self.initUI()
'''界面初始化'''
def initUI(self):
# icon
self.setWindowIcon(QIcon(os.path.join(os.getcwd(), 'resources/icon.jpg')))
# 塊大小
self.grid_size = 22
# 游戲幀率
self.fps = 200
self.timer = QBasicTimer()
# 焦點(diǎn)
self.setFocusPolicy(Qt.StrongFocus)
# 水平布局
layout_horizontal = QHBoxLayout()
self.inner_board = InnerBoard()
self.external_board = ExternalBoard(self, self.grid_size, self.inner_board)
layout_horizontal.addWidget(self.external_board)
self.side_panel = SidePanel(self, self.grid_size, self.inner_board)
layout_horizontal.addWidget(self.side_panel)
self.status_bar = self.statusBar()
self.external_board.score_signal[str].connect(self.status_bar.showMessage)
self.start()
self.center()
self.setWindowTitle('Tetris —— 九歌')
self.show()
self.setFixedSize(self.external_board.width() + self.side_panel.width(), self.side_panel.height() + self.status_bar.height())
'''游戲界面移動(dòng)到屏幕中間'''
def center(self):
screen = QDesktopWidget().screenGeometry()
size = self.geometry()
self.move((screen.width() - size.width()) // 2, (screen.height() - size.height()) // 2)
'''更新界面'''
def updateWindow(self):
self.external_board.updateData()
self.side_panel.updateData()
self.update()
'''開始'''
def start(self):
if self.is_started:
return
self.is_started = True
self.inner_board.createNewTetris()
self.timer.start(self.fps, self)
'''暫停/不暫停'''
def pause(self):
if not self.is_started:
return
self.is_paused = not self.is_paused
if self.is_paused:
self.timer.stop()
self.external_board.score_signal.emit('Paused')
else:
self.timer.start(self.fps, self)
self.updateWindow()
'''計(jì)時(shí)器事件'''
def timerEvent(self, event):
if event.timerId() == self.timer.timerId():
removed_lines = self.inner_board.moveDown()
self.external_board.score += removed_lines
self.updateWindow()
else:
super(TetrisGame, self).timerEvent(event)
'''按鍵事件'''
def keyPressEvent(self, event):
if not self.is_started or self.inner_board.current_tetris == tetrisShape().shape_empty:
super(TetrisGame, self).keyPressEvent(event)
return
key = event.key()
# P鍵暫停
if key == Qt.Key_P:
self.pause()
return
if self.is_paused:
return
# 向左
elif key == Qt.Key_Left:
self.inner_board.moveLeft()
# 向右
elif key == Qt.Key_Right:
self.inner_board.moveRight()
# 旋轉(zhuǎn)
elif key == Qt.Key_Up:
self.inner_board.rotateAnticlockwise()
# 快速墜落
elif key == Qt.Key_Space:
self.external_board.score += self.inner_board.dropDown()
else:
super(TetrisGame, self).keyPressEvent(event)
self.updateWindow()
'''run'''
if __name__ == '__main__':
app = QApplication([])
tetris = TetrisGame()
sys.exit(app.exec_())
9、貪吃蛇
玩法:童年經(jīng)典,普通魔術(shù)也沒啥意思,小時(shí)候玩的也是加速的。
源碼分享:
import cfg
import sys
import pygame
from modules import *
'''主函數(shù)'''
def main(cfg):
# 游戲初始化
pygame.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('Greedy Snake —— 九歌')
clock = pygame.time.Clock()
# 播放背景音樂
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.play(-1)
# 游戲主循環(huán)
snake = Snake(cfg)
apple = Apple(cfg, snake.coords)
score = 0
while True:
screen.fill(cfg.BLACK)
# --按鍵檢測
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key in [pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT]:
snake.setDirection({pygame.K_UP: 'up', pygame.K_DOWN: 'down', pygame.K_LEFT: 'left', pygame.K_RIGHT: 'right'}[event.key])
# --更新貪吃蛇和食物
if snake.update(apple):
apple = Apple(cfg, snake.coords)
score += 1
# --判斷游戲是否結(jié)束
if snake.isgameover: break
# --顯示游戲里必要的元素
drawGameGrid(cfg, screen)
snake.draw(screen)
apple.draw(screen)
showScore(cfg, score, screen)
# --屏幕更新
pygame.display.update()
clock.tick(cfg.FPS)
return endInterface(screen, cfg)
'''run'''
if __name__ == '__main__':
while True:
if not main(cfg):
break
普普通通
【玩法詳細(xì)介紹+源碼】
CFG配置文件就在文末
10、24點(diǎn)小游戲
玩法:通過加減乘除操作,小學(xué)生都沒問題的。
源碼分享:
import os
import sys
import pygame
from cfg import *
from modules import *
from fractions import Fraction
'''檢查控件是否被點(diǎn)擊'''
def checkClicked(group, mouse_pos, group_type='NUMBER'):
selected = []
# 數(shù)字卡片/運(yùn)算符卡片
if group_type == GROUPTYPES[0] or group_type == GROUPTYPES[1]:
max_selected = 2 if group_type == GROUPTYPES[0] else 1
num_selected = 0
for each in group:
num_selected += int(each.is_selected)
for each in group:
if each.rect.collidepoint(mouse_pos):
if each.is_selected:
each.is_selected = not each.is_selected
num_selected -= 1
each.select_order = None
else:
if num_selected < max_selected:
each.is_selected = not each.is_selected
num_selected += 1
each.select_order = str(num_selected)
if each.is_selected:
selected.append(each.attribute)
# 按鈕卡片
elif group_type == GROUPTYPES[2]:
for each in group:
if each.rect.collidepoint(mouse_pos):
each.is_selected = True
selected.append(each.attribute)
# 拋出異常
else:
raise ValueError('checkClicked.group_type unsupport %s, expect %s, %s or %s...' % (group_type, *GROUPTYPES))
return selected
'''獲取數(shù)字精靈組'''
def getNumberSpritesGroup(numbers):
number_sprites_group = pygame.sprite.Group()
for idx, number in enumerate(numbers):
args = (*NUMBERCARD_POSITIONS[idx], str(number), NUMBERFONT, NUMBERFONT_COLORS, NUMBERCARD_COLORS, str(number))
number_sprites_group.add(Card(*args))
return number_sprites_group
'''獲取運(yùn)算符精靈組'''
def getOperatorSpritesGroup(operators):
operator_sprites_group = pygame.sprite.Group()
for idx, operator in enumerate(operators):
args = (*OPERATORCARD_POSITIONS[idx], str(operator), OPERATORFONT, OPREATORFONT_COLORS, OPERATORCARD_COLORS, str(operator))
operator_sprites_group.add(Card(*args))
return operator_sprites_group
'''獲取按鈕精靈組'''
def getButtonSpritesGroup(buttons):
button_sprites_group = pygame.sprite.Group()
for idx, button in enumerate(buttons):
args = (*BUTTONCARD_POSITIONS[idx], str(button), BUTTONFONT, BUTTONFONT_COLORS, BUTTONCARD_COLORS, str(button))
button_sprites_group.add(Button(*args))
return button_sprites_group
'''計(jì)算'''
def calculate(number1, number2, operator):
operator_map = {'+': '+', '-': '-', '×': '*', '÷': '/'}
try:
result = str(eval(number1+operator_map[operator]+number2))
return result if '.' not in result else str(Fraction(number1+operator_map[operator]+number2))
except:
return None
'''在屏幕上顯示信息'''
def showInfo(text, screen):
rect = pygame.Rect(200, 180, 400, 200)
pygame.draw.rect(screen, PAPAYAWHIP, rect)
font = pygame.font.Font(FONTPATH, 40)
text_render = font.render(text, True, BLACK)
font_size = font.size(text)
screen.blit(text_render, (rect.x+(rect.width-font_size[0])/2, rect.y+(rect.height-font_size[1])/2))
'''主函數(shù)'''
def main():
# 初始化, 導(dǎo)入必要的游戲素材
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode(SCREENSIZE)
pygame.display.set_caption('24 point —— 九歌')
win_sound = pygame.mixer.Sound(AUDIOWINPATH)
lose_sound = pygame.mixer.Sound(AUDIOLOSEPATH)
warn_sound = pygame.mixer.Sound(AUDIOWARNPATH)
pygame.mixer.music.load(BGMPATH)
pygame.mixer.music.play(-1, 0.0)
# 24點(diǎn)游戲生成器
game24_gen = game24Generator()
game24_gen.generate()
# 精靈組
# --數(shù)字
number_sprites_group = getNumberSpritesGroup(game24_gen.numbers_now)
# --運(yùn)算符
operator_sprites_group = getOperatorSpritesGroup(OPREATORS)
# --按鈕
button_sprites_group = getButtonSpritesGroup(BUTTONS)
# 游戲主循環(huán)
clock = pygame.time.Clock()
selected_numbers = []
selected_operators = []
selected_buttons = []
is_win = False
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit(-1)
elif event.type == pygame.MOUSEBUTTONUP:
mouse_pos = pygame.mouse.get_pos()
selected_numbers = checkClicked(number_sprites_group, mouse_pos, 'NUMBER')
selected_operators = checkClicked(operator_sprites_group, mouse_pos, 'OPREATOR')
selected_buttons = checkClicked(button_sprites_group, mouse_pos, 'BUTTON')
screen.fill(AZURE)
# 更新數(shù)字
if len(selected_numbers) == 2 and len(selected_operators) == 1:
noselected_numbers = []
for each in number_sprites_group:
if each.is_selected:
if each.select_order == '1':
selected_number1 = each.attribute
elif each.select_order == '2':
selected_number2 = each.attribute
else:
raise ValueError('Unknow select_order %s, expect 1 or 2...' % each.select_order)
else:
noselected_numbers.append(each.attribute)
each.is_selected = False
for each in operator_sprites_group:
each.is_selected = False
result = calculate(selected_number1, selected_number2, *selected_operators)
if result is not None:
game24_gen.numbers_now = noselected_numbers + [result]
is_win = game24_gen.check()
if is_win:
win_sound.play()
if not is_win and len(game24_gen.numbers_now) == 1:
lose_sound.play()
else:
warn_sound.play()
selected_numbers = []
selected_operators = []
number_sprites_group = getNumberSpritesGroup(game24_gen.numbers_now)
# 精靈都畫到screen上
for each in number_sprites_group:
each.draw(screen, pygame.mouse.get_pos())
for each in operator_sprites_group:
each.draw(screen, pygame.mouse.get_pos())
for each in button_sprites_group:
if selected_buttons and selected_buttons[0] in ['RESET', 'NEXT']:
is_win = False
if selected_buttons and each.attribute == selected_buttons[0]:
each.is_selected = False
number_sprites_group = each.do(game24_gen, getNumberSpritesGroup, number_sprites_group, button_sprites_group)
selected_buttons = []
each.draw(screen, pygame.mouse.get_pos())
# 游戲勝利
if is_win:
showInfo('Congratulations', screen)
# 游戲失敗
if not is_win and len(game24_gen.numbers_now) == 1:
showInfo('Game Over', screen)
pygame.display.flip()
clock.tick(30)
'''run'''
if __name__ == '__main__':
main()
11、平衡木
玩法:也是小時(shí)候的經(jīng)典游戲,控制左右就行,到后面才有一點(diǎn)點(diǎn)難度。
源碼分享:
import cfg
from modules import breakoutClone
'''主函數(shù)'''
def main():
game = breakoutClone(cfg)
game.run()
'''run'''
if __name__ == '__main__':
main()
【還有配置文件】
12、外星人入侵
玩法:這讓我想起了魂斗羅那第幾關(guān)的boss,有點(diǎn)類似,不過魂斗羅那個(gè)難度肯定高點(diǎn)。
源碼分享:
import os
import sys
import cfg
import random
import pygame
from modules import *
'''開始游戲'''
def startGame(screen):
clock = pygame.time.Clock()
# 加載字體
font = pygame.font.SysFont('arial', 18)
if not os.path.isfile('score'):
f = open('score', 'w')
f.write('0')
f.close()
with open('score', 'r') as f:
highest_score = int(f.read().strip())
# 敵方
enemies_group = pygame.sprite.Group()
for i in range(55):
if i < 11:
enemy = enemySprite('small', i, cfg.WHITE, cfg.WHITE)
elif i < 33:
enemy = enemySprite('medium', i, cfg.WHITE, cfg.WHITE)
else:
enemy = enemySprite('large', i, cfg.WHITE, cfg.WHITE)
enemy.rect.x = 85 + (i % 11) * 50
enemy.rect.y = 120 + (i // 11) * 45
enemies_group.add(enemy)
boomed_enemies_group = pygame.sprite.Group()
en_bullets_group = pygame.sprite.Group()
ufo = ufoSprite(color=cfg.RED)
# 我方
myaircraft = aircraftSprite(color=cfg.GREEN, bullet_color=cfg.WHITE)
my_bullets_group = pygame.sprite.Group()
# 用于控制敵方位置更新
# --移動(dòng)一行
enemy_move_count = 24
enemy_move_interval = 24
enemy_move_flag = False
# --改變移動(dòng)方向(改變方向的同時(shí)集體下降一次)
enemy_change_direction_count = 0
enemy_change_direction_interval = 60
enemy_need_down = False
enemy_move_right = True
enemy_need_move_row = 6
enemy_max_row = 5
# 用于控制敵方發(fā)射子彈
enemy_shot_interval = 100
enemy_shot_count = 0
enemy_shot_flag = False
# 游戲進(jìn)行中
running = True
is_win = False
# 主循環(huán)
while running:
screen.fill(cfg.BLACK)
for event in pygame.event.get():
# --點(diǎn)右上角的X或者按Esc鍵退出游戲
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()
# --射擊
if event.type == pygame.MOUSEBUTTONDOWN:
my_bullet = myaircraft.shot()
if my_bullet:
my_bullets_group.add(my_bullet)
# --我方子彈與敵方/UFO碰撞檢測
for enemy in enemies_group:
if pygame.sprite.spritecollide(enemy, my_bullets_group, True, None):
boomed_enemies_group.add(enemy)
enemies_group.remove(enemy)
myaircraft.score += enemy.reward
if pygame.sprite.spritecollide(ufo, my_bullets_group, True, None):
ufo.is_dead = True
myaircraft.score += ufo.reward
# --更新并畫敵方
# ----敵方子彈
enemy_shot_count += 1
if enemy_shot_count > enemy_shot_interval:
enemy_shot_flag = True
enemies_survive_list = [enemy.number for enemy in enemies_group]
shot_number = random.choice(enemies_survive_list)
enemy_shot_count = 0
# ----敵方移動(dòng)
enemy_move_count += 1
if enemy_move_count > enemy_move_interval:
enemy_move_count = 0
enemy_move_flag = True
enemy_need_move_row -= 1
if enemy_need_move_row == 0:
enemy_need_move_row = enemy_max_row
enemy_change_direction_count += 1
if enemy_change_direction_count > enemy_change_direction_interval:
enemy_change_direction_count = 1
enemy_move_right = not enemy_move_right
enemy_need_down = True
# ----每次下降提高移動(dòng)和射擊速度
enemy_move_interval = max(15, enemy_move_interval-3)
enemy_shot_interval = max(50, enemy_move_interval-10)
# ----遍歷更新
for enemy in enemies_group:
if enemy_shot_flag:
if enemy.number == shot_number:
en_bullet = enemy.shot()
en_bullets_group.add(en_bullet)
if enemy_move_flag:
if enemy.number in range((enemy_need_move_row-1)*11, enemy_need_move_row*11):
if enemy_move_right:
enemy.update('right', cfg.SCREENSIZE[1])
else:
enemy.update('left', cfg.SCREENSIZE[1])
else:
enemy.update(None, cfg.SCREENSIZE[1])
if enemy_need_down:
if enemy.update('down', cfg.SCREENSIZE[1]):
running = False
is_win = False
enemy.change_count -= 1
enemy.draw(screen)
enemy_move_flag = False
enemy_need_down = False
enemy_shot_flag = False
# ----敵方爆炸特效
for boomed_enemy in boomed_enemies_group:
if boomed_enemy.boom(screen):
boomed_enemies_group.remove(boomed_enemy)
del boomed_enemy
# --敵方子彈與我方飛船碰撞檢測
if not myaircraft.one_dead:
if pygame.sprite.spritecollide(myaircraft, en_bullets_group, True, None):
myaircraft.one_dead = True
if myaircraft.one_dead:
if myaircraft.boom(screen):
myaircraft.resetBoom()
myaircraft.num_life -= 1
if myaircraft.num_life < 1:
running = False
is_win = False
else:
# ----更新飛船
myaircraft.update(cfg.SCREENSIZE[0])
# ----畫飛船
myaircraft.draw(screen)
if (not ufo.has_boomed) and (ufo.is_dead):
if ufo.boom(screen):
ufo.has_boomed = True
else:
# ----更新UFO
ufo.update(cfg.SCREENSIZE[0])
# ----畫UFO
ufo.draw(screen)
# --畫我方飛船子彈
for bullet in my_bullets_group:
if bullet.update():
my_bullets_group.remove(bullet)
del bullet
else:
bullet.draw(screen)
# --畫敵方子彈
for bullet in en_bullets_group:
if bullet.update(cfg.SCREENSIZE[1]):
en_bullets_group.remove(bullet)
del bullet
else:
bullet.draw(screen)
if myaircraft.score > highest_score:
highest_score = myaircraft.score
# --得分每增加2000我方飛船增加一條生命
if (myaircraft.score % 2000 == 0) and (myaircraft.score > 0) and (myaircraft.score != myaircraft.old_score):
myaircraft.old_score = myaircraft.score
myaircraft.num_life = min(myaircraft.num_life + 1, myaircraft.max_num_life)
# --敵人都死光了的話就勝利了
if len(enemies_group) < 1:
is_win = True
running = False
# --顯示文字
# ----當(dāng)前得分
showText(screen, 'SCORE: ', cfg.WHITE, font, 200, 8)
showText(screen, str(myaircraft.score), cfg.WHITE, font, 200, 24)
# ----敵人數(shù)量
showText(screen, 'ENEMY: ', cfg.WHITE, font, 370, 8)
showText(screen, str(len(enemies_group)), cfg.WHITE, font, 370, 24)
# ----歷史最高分
showText(screen, 'HIGHEST: ', cfg.WHITE, font, 540, 8)
showText(screen, str(highest_score), cfg.WHITE, font, 540, 24)
# ----FPS
showText(screen, 'FPS: ' + str(int(clock.get_fps())), cfg.RED, font, 8, 8)
# --顯示剩余生命值
showLife(screen, myaircraft.num_life, cfg.GREEN)
pygame.display.update()
clock.tick(cfg.FPS)
with open('score', 'w') as f:
f.write(str(highest_score))
return is_win
'''主函數(shù)'''
def main():
# 初始化
pygame.init()
pygame.display.set_caption('外星人入侵 —— 九歌')
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.mixer.init()
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.set_volume(0.4)
pygame.mixer.music.play(-1)
while True:
is_win = startGame(screen)
endInterface(screen, cfg.BLACK, is_win)
'''run'''
if __name__ == '__main__':
main()
13、貪心鳥
玩法:有點(diǎn)類似那個(gè)炸彈人,控制好走位問題不大。
14、井字棋888‘’
玩法:我打賭大家在課堂上肯定玩過這個(gè),想想當(dāng)年和同桌玩這個(gè)廢了好幾本本子。
源碼分享
from tkinter import *
import tkinter.messagebox as msg
root = Tk()
root.title('TIC-TAC-TOE---Project Gurukul')
# labels
Label(root, text="player1 : X", font="times 15").grid(row=0, column=1)
Label(root, text="player2 : O", font="times 15").grid(row=0, column=2)
digits = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# for player1 sign = X and for player2 sign= Y
mark = ''
# counting the no. of click
count = 0
panels = ["panel"] * 10
def win(panels, sign):
return ((panels[1] == panels[2] == panels[3] == sign)
or (panels[1] == panels[4] == panels[7] == sign)
or (panels[1] == panels[5] == panels[9] == sign)
or (panels[2] == panels[5] == panels[8] == sign)
or (panels[3] == panels[6] == panels[9] == sign)
or (panels[3] == panels[5] == panels[7] == sign)
or (panels[4] == panels[5] == panels[6] == sign)
or (panels[7] == panels[8] == panels[9] == sign))
def checker(digit):
global count, mark, digits
# Check which button clicked
if digit == 1 and digit in digits:
digits.remove(digit)
##player1 will play if the value of count is even and for odd player2 will play
if count % 2 == 0:
mark = 'X'
panels[digit] = mark
elif count % 2 != 0:
mark = 'O'
panels[digit] = mark
button1.config(text=mark)
count = count + 1
sign = mark
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 2 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
mark = 'X'
panels[digit] = mark
elif count % 2 != 0:
mark = 'O'
panels[digit] = mark
button2.config(text=mark)
count = count + 1
sign = mark
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 3 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
mark = 'X'
panels[digit] = mark
elif count % 2 != 0:
mark = 'O'
panels[digit] = mark
button3.config(text=mark)
count = count + 1
sign = mark
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 4 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
mark = 'X'
panels[digit] = mark
elif count % 2 != 0:
mark = 'O'
panels[digit] = mark
button4.config(text=mark)
count = count + 1
sign = mark
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 5 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
mark = 'X'
panels[digit] = mark
elif count % 2 != 0:
mark = 'O'
panels[digit] = mark
button5.config(text=mark)
count = count + 1
sign = mark
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 6 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
mark = 'X'
panels[digit] = mark
elif count % 2 != 0:
mark = 'O'
panels[digit] = mark
button6.config(text=mark)
count = count + 1
sign = mark
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 7 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
mark = 'X'
panels[digit] = mark
elif count % 2 != 0:
mark = 'O'
panels[digit] = mark
button7.config(text=mark)
count = count + 1
sign = mark
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 8 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
mark = 'X'
panels[digit] = mark
elif count % 2 != 0:
mark = 'O'
panels[digit] = mark
button8.config(text=mark)
count = count + 1
sign = mark
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 9 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
mark = 'X'
panels[digit] = mark
elif count % 2 != 0:
mark = 'O'
panels[digit] = mark
button9.config(text=mark)
count = count + 1
sign = mark
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
###if count is greater then 8 then the match has been tied
if (count > 8 and win(panels, 'X') == False and win(panels, 'O') == False):
msg.showinfo("Result", "Match Tied")
root.destroy()
####define buttons
button1 = Button(root, width=15, font=('Times 16 bold'), height=7, command=lambda: checker(1))
button1.grid(row=1, column=1)
button2 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(2))
button2.grid(row=1, column=2)
button3 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(3))
button3.grid(row=1, column=3)
button4 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(4))
button4.grid(row=2, column=1)
button5 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(5))
button5.grid(row=2, column=2)
button6 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(6))
button6.grid(row=2, column=3)
button7 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(7))
button7.grid(row=3, column=1)
button8 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(8))
button8.grid(row=3, column=2)
button9 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(9))
button9.grid(row=3, column=3)
root.mainloop()
有點(diǎn)困難
【玩法詳解+源碼獲取看底部】
15、炸彈人
玩法詳解:小時(shí)候的又一經(jīng)典游戲,小時(shí)候很多次都被自己炸死了。
16、保衛(wèi)森林
玩法詳解:類似保衛(wèi)蘿卜,塔防類的小游戲,布局一定要合理,考慮射程屬性等等
17、五子棋
玩法詳解:小時(shí)候很愛玩,先出是有必勝方法的,后面才知道會(huì)有禁手這個(gè)規(guī)則,就比較復(fù)雜了,大家可以學(xué)一下先出必勝的開局,有浦月、流星、丘月、游星、慧星等等。
18、吃豆豆
玩法詳解:考驗(yàn)手速和操作和走位,我不喜歡玩這類跑來跑去的。
19、坦克大戰(zhàn)
玩法詳解:這是經(jīng)典中的經(jīng)典,我喜歡玩雙人模式,后面有一些改版的模式,這是我覺得少數(shù)幾個(gè)現(xiàn)在玩都不過時(shí)的游戲。
20、超級(jí)瑪麗
玩法詳解:經(jīng)典中的經(jīng)典,小時(shí)候玩覺得可難了,操作不必介紹了吧。
21、水果忍者
玩法詳解:切水果風(fēng)靡一時(shí)的游戲,不知道為啥總是切刀炸掉,挺解壓的游戲。
極度困難
【攻略大全+源碼獲取看底部】
22、飛機(jī)大戰(zhàn)
攻略大全:從這里開始的游戲,真正算的上有難度了,這個(gè)飛機(jī)大戰(zhàn)跟童年玩的比起來還是差一點(diǎn)。
23、2048
攻略大全:也是曾經(jīng)風(fēng)靡一時(shí)的,越到后面越難,合成的時(shí)候一定要大數(shù)放在角落。
24、推箱子
攻略大全:以前的那個(gè)手機(jī)上都有的游戲,越推到后面的關(guān)卡越難,我好像是玩到二十多關(guān)就玩不下去了。
25、塔防
攻略大全:又是一種塔防類的游戲,有點(diǎn)意思,就是速度太快了,反應(yīng)不過來。
26、植物大戰(zhàn)僵尸
攻略大全:最經(jīng)典的植物大戰(zhàn)僵尸,操作不用介紹了,不過可以自己玩玩看。
27、掃雷
玩法詳解:掃雷還是挺有意思的,技能玩又考驗(yàn)推理
終極挑戰(zhàn)?
【太難了。。源碼領(lǐng)取看文章底部】
28、拼圖
游戲體驗(yàn):三個(gè)終極挑戰(zhàn),能完成一個(gè)就算你厲害,拼圖是我最煩的,太難了。
?29、走迷宮
游戲體驗(yàn):我反正沒走出去,大家能走出去嗎
30、最強(qiáng)游戲
游戲體驗(yàn):可太難控制了。。
行業(yè)資料:添加即可領(lǐng)取PPT模板、簡歷模板、行業(yè)經(jīng)典書籍PDF。
面試題庫:歷年經(jīng)典,熱乎的大廠面試真題,持續(xù)更新中,添加獲取。
學(xué)習(xí)資料:含Python、爬蟲、數(shù)據(jù)分析、算法等學(xué)習(xí)視頻和文檔,添加獲取
交流加群:大佬指點(diǎn)迷津,你的問題往往有人遇到過,技術(shù)互助交流。
?
其他源碼以及cfg配置文件等領(lǐng)取
到了這里,關(guān)于愛心代碼編程python可復(fù)制,python有什么好玩的代碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!