Python - 猜灯谜 - 外星人入侵小游戏 - 小游戏 - 小乌龟 - 画五角星 - 画太阳花 - 画小蟒蛇 - 画皮卡丘 - 画小猪佩奇 - 斗地主

 

 

依赖

pip install pygame

还需要本地同级目录有个simfang.ttf文件搭配,也可以有个MP3音乐文件搭配。
百度云链接: 提取码: ptzk

代码示例


import os
import sys
import pygame
import random

data = [
    {
        'quesion': '黑嘴雀,落田渦,食水少,講話多(打一文具)',
        'options': ['鋼筆', '毛筆', '鉛筆', '墨水'],
        'answer': 1
    },
    {
        'quesion': '發言音太輕,聽眾有意見(打一成語)',
        'options': ['人微言輕', '眾口難調', '不盡人意', '低聲下氣'],
        'answer': 3
    },
    {
        'quesion': '閉口不言只管笑(打一字)',
        'options': ['答', '合', '哈', '吞'],
        'answer': 2
    },
    {
        'quesion': '張清在前,秦明斷後(打二字中國城市)',
        'options': ['洛陽', '青島', '長春', '南京'],
        'answer': 2
    },
    {
        'quesion': '冤情由來(打二字古代人名)',
        'options': ['竇娥', '魏延', '岳飛', '屈原'],
        'answer': 3
    },
    {
        'quesion': '外青內白胖娃娃,酒席上面愛雕花(打一蔬菜)',
        'options': ['蘿蔔', '冬瓜', '黃瓜', '苦瓜'],
        'answer': 1
    },
    {
        'quesion': '十字對十字,太陽對月亮(猜一個字)',
        'options': ['明', '早', '朝', '脾'],
        'answer': 2
    },
    {
        'quesion': '中心要點 (打一字)',
        'options': ['忠', '小', '卜', '重'],
        'answer': 2
    },
    {
        'quesion': '日落香殘,洗卻凡心一點(猜一字)',
        'options': ['禿', '旻', '頹', '嘰'],
        'answer': 0
    },
    {
        'quesion': '既有頭,又有尾,中間生四張嘴(猜一字)',
        'options': ['田', '申', '由', '晶'],
        'answer': 1
    },
    {
        'quesion': '二間屋仔窄一窄,裡面住著十個人客(打一生活物冠量)',
        'options': ['手套', '文具盒', '一對鞋', '化妝包'],
        'answer': 2
    },
    {
        'quesion': '一點一畫長,二畫口四方,五月荔枝熟,媽(張)開口來裝(打一字)',
        'options': ['唔', '吾', '語', '焐'],
        'answer': 2
    },
    {
        'quesion': '麥兜自己沖涼(打一作家)',
        'options': ['麥佳碧', '朱熹', '李清照', '朱自清'],
        'answer': 3
    },
    {
        'quesion': '一個「不」出頭,二個「不」出頭,三個「不」出頭,唔系唔出頭,實系「不」出頭(打一字)',
        'options': ['森', '丕', '林', '歪'],
        'answer': 0
    },
    {
        'quesion': '濕濕瀝瀝,連毛塞入;唔怕腰骨痛,只要子孫密(猜一勞作行為)',
        'options': ['鑿井', '耕田', '插秧', '撈魚'],
        'answer': 2
    },
    {
        'quesion': '闔盅合(蓋)闔盅,裡而有個豆皮翁。(打一植物果實)',
        'options': ['核桃', '花生', '荷蘭豆', '榴蓮'],
        'answer': 0
    },
    {
        'quesion': '艇仔合(蓋)艇仔,裡面有兩個孖仔。(打一農作物)',
        'options': ['荷蘭豆', '黃豆', '花生', '菱角'],
        'answer': 2
    },
    {
        'quesion': '主人微笑(打一地名)',
        'options': ['嘉興', '安徽', '東京', '東莞'],
        'answer': 3
    },
    {
        'quesion': '鍵盤入面邊個掣最靚仔?',
        'options': ['8', 'F8', 'F12', 'F4'],
        'answer': 3
    },
    {
        'quesion': '咩豬系冇腳?',
        'options': ['蜘蛛', '存錢豬', '珍珠', '羅志祥'],
        'answer': 2
    },
    {
        'quesion': '爺爺的兒子(打一種食物)',
        'options': ['包子', '椰子', '車仔面', '芭樂'],
        'answer': 1
    },
    {
        'quesion': '一間屋,三個門,裡面只住半個人。(猜一用品)',
        'options': ['T-恤', '手套', '褲子', '襪子'],
        'answer': 2
    },
    {
        'quesion': '拱豬入門(打一字)',
        'options': ['間', '閡', '闔', '閉'],
        'answer': 1
    },
    {
        'quesion': '皇帝新衣。(打一字)',
        'options': ['無', '假', '襲', '謊'],
        'answer': 2
    },
    {
        'quesion': '香港的肥仔多數姓什乜?',
        'options': ['肥', '胖', '大', '死'],
        'answer': 3
    }
]

'''按钮类'''


class Button(pygame.sprite.Sprite):
    def __init__(self, **kwargs):
        pygame.sprite.Sprite.__init__(self)
        if kwargs.get('font') is None:
            self.font = pygame.font.Font(kwargs.get('font_path'), kwargs.get('font_size'))
        else:
            self.font = kwargs.get('font')
        self.black = (0, 0, 0)
        self.white = (255, 255, 255)
        self.red = (255, 0, 0)
        self.green = (0, 255, 0)
        self.blue = (0, 0, 255)
        self.cyan = (0, 255, 255)
        self.text = kwargs.get('text')
        self.image = self.font.render(self.text, True, self.white)
        self.rect = self.image.get_rect()
        self.rect.left, self.rect.top = kwargs.get('position')

    '''画到屏幕上'''

    def draw(self, screen):
        screen.blit(self.image, self.rect)

    '''更新'''

    def update(self):
        mouse_pos = pygame.mouse.get_pos()
        if self.rect.collidepoint(mouse_pos):
            self.image = self.font.render(self.text, True, self.cyan)
        else:
            self.image = self.font.render(self.text, True, self.white)


'''定义一些常量'''
DeepSkyBlue = (0, 191, 255)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
MediumOrchid = (186, 85, 211)
riddles_list = data
random.shuffle(riddles_list)
font_path = os.path.join(os.getcwd(), 'simfang.ttf')

'''开始界面'''


class startInterface():
    def __init__(self, screen, **kwargs):
        self.text1 = '猜 灯 谜'
        self.text2 = '开始游戏'
        self.text3 = '退出游戏'
        self.screen = screen

    def start(self):
        button_groups = pygame.sprite.Group()
        button_start = Button(font_path=font_path, font_size=24, text=self.text2, position=(236, 300))
        button_quit = Button(font_path=font_path, font_size=24, text=self.text3, position=(464, 300))
        button_groups.add(button_start)
        button_groups.add(button_quit)
        font = pygame.font.Font(font_path, 48)
        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.MOUSEBUTTONDOWN:
                    if event.button == 1:
                        mouse_pos = pygame.mouse.get_pos()
                        if button_start.rect.collidepoint(mouse_pos):
                            return
                        elif button_quit.rect.collidepoint(mouse_pos):
                            pygame.quit()
                            sys.exit()
            self.screen.fill((0, 0, 0))
            title = font.render(self.text1, True, DeepSkyBlue)
            self.screen.blit(title, (302, 150))
            button_groups.update()
            button_groups.draw(self.screen)
            pygame.display.update()
            clock.tick(60)


'''结束界面'''


class endInterface():
    def __init__(self, screen, num_correct, num_total, **kwargs):
        self.text1 = '恭喜你猜完了所有灯谜'
        self.text2 = '答对的灯谜数量: %s' % num_correct
        self.text3 = '灯谜总数量: %s' % num_total
        self.text4 = '正确率: %.2f%%' % (num_correct * 100 / num_total)
        self.screen = screen

    def start(self):
        button_groups = pygame.sprite.Group()
        button_restart = Button(font_path=font_path, font_size=24, text='重新开始', position=(236, 400))
        button_quit = Button(font_path=font_path, font_size=24, text='退出游戏', position=(464, 400))
        button_groups.add(button_restart)
        button_groups.add(button_quit)
        font_big = pygame.font.Font(font_path, 32)
        font = pygame.font.Font(font_path, 24)
        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.MOUSEBUTTONDOWN:
                    if event.button == 1:
                        mouse_pos = pygame.mouse.get_pos()
                        if button_restart.rect.collidepoint(mouse_pos):
                            startGuess()
                        elif button_quit.rect.collidepoint(mouse_pos):
                            pygame.quit()
                            sys.exit()
            self.screen.fill((0, 0, 0))
            text1_render = font_big.render(self.text1, True, DeepSkyBlue)
            text2_render = font.render(self.text2, True, DeepSkyBlue)
            text3_render = font.render(self.text3, True, DeepSkyBlue)
            text4_render = font.render(self.text4, True, DeepSkyBlue)
            self.screen.blit(text1_render, (250, 100))
            self.screen.blit(text2_render, (250, 200))
            self.screen.blit(text3_render, (250, 240))
            self.screen.blit(text4_render, (250, 280))
            button_groups.update()
            button_groups.draw(self.screen)
            pygame.display.update()
            clock.tick(60)


'''获得一个灯谜'''


def getRiddle(riddle_idx):
    if riddle_idx == len(riddles_list):
        return None
    return riddles_list[riddle_idx]


'''开始猜灯谜'''


def startGuess():
    pygame.init()
    pygame.font.init()
    pygame.mixer.init()
    screen = pygame.display.set_mode((800, 600))
    pygame.display.set_caption('猜灯谜-微信公众号: Charles的皮卡丘')
    # pygame.mixer.music.load((os.path.join(os.getcwd(), 'bg.mp3')))
    # pygame.mixer.music.set_volume(0.4)
    # pygame.mixer.music.play(-1)
    clock = pygame.time.Clock()
    startInterface(screen).start()
    riddle_idx = 0
    one_riddle = getRiddle(riddle_idx)
    num_correct = 0
    font = pygame.font.Font(font_path, 24)
    font_big = pygame.font.Font(font_path, 32)
    flag = False
    time_count = 0
    while True:
        button_choice1 = Button(font=font, text='A. ' + one_riddle.get('options')[0], position=(100, 250))
        button_choice2 = Button(font=font, text='B. ' + one_riddle.get('options')[1], position=(100, 290))
        button_choice3 = Button(font=font, text='C. ' + one_riddle.get('options')[2], position=(100, 330))
        button_choice4 = Button(font=font, text='D. ' + one_riddle.get('options')[3], position=(100, 370))
        button_groups = pygame.sprite.Group()
        button_groups.add(button_choice1, button_choice2, button_choice3, button_choice4)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:
                    if not flag:
                        mouse_pos = pygame.mouse.get_pos()
                        answer = one_riddle.get('answer')
                        if button_choice1.rect.collidepoint(mouse_pos):
                            flag = True
                            if answer == 0:
                                text = '恭喜你, 答对了本题'
                                num_correct += 1
                            else:
                                text = '很遗憾, 答错了本题'
                        elif button_choice2.rect.collidepoint(mouse_pos):
                            flag = True
                            if answer == 1:
                                text = '恭喜你, 答对了本题'
                                num_correct += 1
                            else:
                                text = '很遗憾, 答错了本题'
                        elif button_choice3.rect.collidepoint(mouse_pos):
                            flag = True
                            if answer == 2:
                                text = '恭喜你, 答对了本题'
                                num_correct += 1
                            else:
                                text = '很遗憾, 答错了本题'
                        elif button_choice4.rect.collidepoint(mouse_pos):
                            flag = True
                            if answer == 3:
                                text = '恭喜你, 答对了本题'
                                num_correct += 1
                            else:
                                text = '很遗憾, 答错了本题'
        screen.fill((0, 0, 0))
        if not flag:
            riddle_content1 = '灯谜: '
            riddle_content2_1 = one_riddle.get('quesion')[:len(one_riddle.get('quesion')) // 2]
            riddle_content2_2 = one_riddle.get('quesion')[len(one_riddle.get('quesion')) // 2:]
            riddle_content3 = '选项: '
            riddle_content1_render = font.render(riddle_content1, True, MediumOrchid)
            riddle_content2_1_render = font.render(riddle_content2_1, True, MediumOrchid)
            riddle_content2_2_render = font.render(riddle_content2_2, True, MediumOrchid)
            riddle_content3_render = font.render(riddle_content3, True, MediumOrchid)
            screen.blit(riddle_content1_render, (60, 80))
            screen.blit(riddle_content2_1_render, (60, 120))
            screen.blit(riddle_content2_2_render, (60, 150))
            screen.blit(riddle_content3_render, (60, 210))
            button_groups.update()
            button_groups.draw(screen)
        else:
            time_count += 1
            if time_count > 60:
                flag = False
                time_count = 0
                riddle_idx += 1
                one_riddle = getRiddle(riddle_idx)
                if one_riddle is None:
                    endInterface(screen, num_correct, len(riddles_list)).start()
            else:
                text_render = font_big.render(text, True, RED)
                screen.blit(text_render, (160, 250))
        pygame.draw.line(screen, WHITE, (600, 0), (600, 600), 5)
        score_text = '答对灯谜数: %s' % num_correct
        score_text_render = font.render(score_text, True, WHITE)
        screen.blit(score_text_render, (620, 100))
        pygame.display.update()
        clock.tick(60)


if __name__ == '__main__':
    startGuess()


参考:Charles的皮卡丘

 

目录

 

import os
import sys
import random
import pygame

'''显示字'''
def showText(screen, text, color, font, x, y):
	text = font.render(text, True, color)
	screen.blit(text, (x, y))


'''显示与生命值等数量的飞船(右上角)'''
def showLife(screen, num_life, color):
	cell = [2, 2]
	num_cols = 15
	filled_cells = [7,21,22,23,36,37,38,46,47,48,49,50,51,52,53,54,55,56,57,58,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119]
	for i in range(num_life):
		position = [750-35*i, 8]
		for i in range(0, len(filled_cells)):
			y = filled_cells[i] // num_cols
			x = filled_cells[i] % num_cols
			rect = [x * cell[0] + position[0], y * cell[1] + position[1], cell[0], cell[1]]
			pygame.draw.rect(screen, color, rect)


'''结束界面'''
def endInterface(screen, color, is_win):
	screen.fill(color)
	clock = pygame.time.Clock()
	if is_win:
		text = 'VICTORY'
	else:
		text = 'FAILURE'
	font = pygame.font.SysFont('arial', 30)
	text_render = font.render(text, 1, (255, 255, 255))
	while True:
		for event in pygame.event.get():
			if event.type == pygame.QUIT:
				pygame.quit()
				sys.exit()
			if (event.type == pygame.KEYDOWN) or (event.type == pygame.MOUSEBUTTONDOWN):
				return
		screen.blit(text_render, (350, 300))
		clock.tick(60)
		pygame.display.update()


'''我方飞船类'''
class aircraftSprite(pygame.sprite.Sprite):
	def __init__(self, color, bullet_color, **kwargs):
		pygame.sprite.Sprite.__init__(self)
		# 生命值
		self.num_life = 3
		self.max_num_life = 5
		# 最小单元
		self.cell = [3, 3]
		self.num_cols = 15
		self.num_rows = 8
		# 用于碰撞检测
		self.rect = pygame.Rect(0, 550, self.cell[0]*self.num_cols, self.cell[0]*self.num_rows)
		# 填充颜色区域
		self.filled_cells = [7,21,22,23,36,37,38,46,47,48,49,50,51,52,53,54,55,56,57,58,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119]
		# 飞船颜色
		self.color = color
		# 飞船子弹颜色
		self.bullet_color = bullet_color
		# 子弹是否在冷却中
		self.is_cooling = False
		self.init_count = 35
		self.cooling_count = self.init_count
		# 得分
		self.score = 0
		# 	避免重复增加生命值
		self.old_score = -1
		self.resetBoom()
	'''射击'''
	def shot(self):
		if self.is_cooling:
			return None
		self.is_cooling = True
		self.cooling_count = self.init_count
		return myBulletSprite(self.rect.x + self.rect.width // 2, self.rect.y, self.bullet_color)
	'''在屏幕上画出来'''
	def draw(self, screen):
		for i in range(0, len(self.filled_cells)):
			y = self.filled_cells[i] // self.num_cols
			x = self.filled_cells[i] % self.num_cols
			rect = [x * self.cell[0] + self.rect[0], y * self.cell[1] + self.rect[1], self.cell[0], self.cell[1]]
			pygame.draw.rect(screen, self.color, rect)
	'''更新飞船位置等信息'''
	def update(self, WIDTH):
		# 位置信息
		x = pygame.mouse.get_pos()[0] - (self.rect.width // 2)
		if x < 0:
			x = pygame.mouse.get_pos()[0]
		elif x > WIDTH - self.rect.width:
			x = WIDTH - self.rect.width
		self.rect.x = x
		# 子弹信息
		if self.is_cooling:
			self.cooling_count -= 1
			if self.cooling_count == 0:
				self.is_cooling = False
	'''被击中后爆炸'''
	def boom(self, screen):
		self.boomed_rect.x = self.rect.x
		self.boomed_rect.y = self.rect.y
		self.boomed_count += 1
		if self.boomed_count % 1 == 0:
			self.boomed_frame += 1
			for i in range(0, len(self.boomed_filled_cells)):
				y = self.boomed_filled_cells[i] // self.boomed_num_cols
				x = self.boomed_filled_cells[i] % self.boomed_num_cols
				rect = [x * self.boomed_cell[0] + self.boomed_rect[0], y * self.boomed_cell[1] + self.boomed_rect[1], self.boomed_cell[0], self.boomed_cell[1]]
				pygame.draw.rect(screen, self.color, rect)
		if self.boomed_frame > 4:
			return True
		else:
			return False
	'''重置爆炸所用到的数据'''
	def resetBoom(self):
		# 被击中爆炸时用
		# 	死一条命的时候需要播放一次死亡特效
		self.one_dead = False
		self.boomed_filled_cells = [3,7,12,15,17,20,24,30,36,40,44,45,53,54,58,62,68,74,78,81,83,86,91,95]
		self.boomed_cell = [3, 3]
		self.boomed_num_cols = 11
		self.boomed_num_rows = 9
		self.boomed_rect = pygame.Rect(0, 0, self.boomed_num_cols*self.boomed_cell[0], self.boomed_num_rows*self.boomed_cell[1])
		# 	控制每帧的时间
		self.boomed_count = 0
		#	爆炸特效当前帧
		self.boomed_frame = 0


'''ufo类'''
class ufoSprite(pygame.sprite.Sprite):
	def __init__(self, color, **kwargs):
		pygame.sprite.Sprite.__init__(self)
		# 击中该类获得的奖励
		self.reward = 200
		self.color = color
		self.reset()
	'''在屏幕上画出来'''
	def draw(self, screen):
		if self.is_dead:
			return None
		for i in range(0, len(self.filled_cells)):
			y = self.filled_cells[i] // self.num_cols
			x = self.filled_cells[i] % self.num_cols
			rect = [x * self.cell[0] + self.rect[0], y * self.cell[1] + self.rect[1], self.cell[0], self.cell[1]]
			pygame.draw.rect(screen, self.color, rect)
	'''更新UFO位置等信息'''
	def update(self, WIDTH):
		if self.rect.x + self.rect.width < 0 or self.rect.x > WIDTH:
			self.rect.x += self.low_speed
		else:
			self.rect.x += self.high_speed
		if self.rect.x > WIDTH + 500:
			self.reset()
	'''被击中后爆炸'''
	def boom(self, screen):
		self.boomed_rect.x = self.rect.x
		self.boomed_rect.y = self.rect.y
		self.boomed_count += 1
		if self.boomed_count % 1 == 0:
			self.boomed_frame += 1
			for i in range(0, len(self.boomed_filled_cells)):
				y = self.boomed_filled_cells[i] // self.boomed_num_cols
				x = self.boomed_filled_cells[i] % self.boomed_num_cols
				rect = [x * self.boomed_cell[0] + self.boomed_rect[0], y * self.boomed_cell[1] + self.boomed_rect[1], self.boomed_cell[0], self.boomed_cell[1]]
				pygame.draw.rect(screen, self.color, rect)
		if self.boomed_frame > 4:
			return True
		else:
			return False
	'''重置'''
	def reset(self):
		self.cell = [3, 3]
		self.num_cols = 16
		self.num_rows = 7
		self.rect = pygame.Rect(-500-self.num_cols*self.cell[0], 60, self.num_cols*self.cell[0], self.num_rows*self.cell[1])
		self.filled_cells = [5,6,7,8,9,10,19,20,21,22,23,24,25,26,27,28,34,35,36,37,38,39,40,41,42,43,44,45,49,50,52,53,55,56,58,59,61,62,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,82,83,84,87,88,91,92,93,99,108]
		self.low_speed = 1
		self.high_speed = 2
		self.is_dead = False
		# 被击中爆炸时用
		# 	是否已经显示了爆炸特效
		self.has_boomed = False
		self.boomed_filled_cells = [3,7,12,15,17,20,24,30,36,40,44,45,53,54,58,62,68,74,78,81,83,86,91,95]
		self.boomed_cell = [3, 3]
		self.boomed_num_cols = 11
		self.boomed_num_rows = 9
		self.boomed_rect = pygame.Rect(0, 0, self.boomed_num_cols*self.boomed_cell[0], self.boomed_num_rows*self.boomed_cell[1])
		self.boomed_count = 0
		self.boomed_frame = 0


'''敌方类'''
class enemySprite(pygame.sprite.Sprite):
	def __init__(self, category, number, color, bullet_color, **kwargs):
		pygame.sprite.Sprite.__init__(self)
		self.cell = [3, 3]
		# 编号
		self.number = number
		# 种类
		self.category = category
		if category == 'small':
			self.reward = 20
			self.num_cols = 8
			self.num_rows = 8
			self.rect = pygame.Rect(0, 0, self.num_cols*self.cell[0], self.num_rows*self.cell[1])
			self.filled_cells = [[3,4,10,11,12,13,17,18,19,20,21,22,24,25,27,28,30,31,32,33,34,35,36,37,38,39,42,45,49,51,52,54,56,58,61,63], 
								 [3,4,10,11,12,13,17,18,19,20,21,22,24,25,27,28,30,31,32,33,34,35,36,37,38,39,41,43,44,46,48,55,57,62]]
		elif category == 'medium':
			self.reward = 15
			self.num_cols = 11
			self.num_rows = 8
			self.rect = pygame.Rect(0, 0, self.num_cols*self.cell[0], self.num_rows*self.cell[1])
			self.filled_cells = [[2,8,11,14,18,21,22,24,25,26,27,28,29,30,32,33,34,35,37,38,39,41,42,43,44,45,46,47,48,49,50,51,52,53,54,56,57,58,59,60,61,62,63,64,68,74,78,86], 
								 [2,8,14,18,24,25,26,27,28,29,30,34,35,37,38,39,41,42,44,45,46,47,48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,65,66,68,74,76,80,81,83,84]]
		elif category == 'large':
			self.reward = 10
			self.num_cols = 12
			self.num_rows = 8
			self.rect = pygame.Rect(0, 0, self.num_cols*self.cell[0], self.num_rows*self.cell[1])
			self.filled_cells = [[4,5,6,7,13,14,15,16,17,18,19,20,21,22,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,41,42,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,62,63,64,67,68,69,73,74,77,78,81,82,86,87,92,93], 
								 [4,5,6,7,13,14,15,16,17,18,19,20,21,22,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,41,42,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,63,64,67,68,74,75,77,78,80,81,84,85,94,95]]
		self.color = color
		self.bullet_color = bullet_color
		self.speed = [8, 20]
		self.change_count = 0
		self.change_flag = False
		# 被击中爆炸时用
		self.boomed_filled_cells = [3,7,12,15,17,20,24,30,36,40,44,45,53,54,58,62,68,74,78,81,83,86,91,95]
		self.boomed_cell = [3, 3]
		self.boomed_num_cols = 11
		self.boomed_num_rows = 9
		self.boomed_rect = pygame.Rect(0, 0, self.boomed_num_cols*self.boomed_cell[0], self.boomed_num_rows*self.boomed_cell[1])
		self.boomed_count = 0
		self.boomed_frame = 0
	'''射击'''
	def shot(self):
		return enemyBulletSprite(self.rect.x + self.rect.width // 2, self.rect.y, self.bullet_color)
	'''在屏幕上画出来'''
	def draw(self, screen):
		if self.change_count > 50:
			self.change_count = 0
			self.change_flag = not self.change_flag
		if self.change_flag:
			for i in range(0, len(self.filled_cells[0])):
				y = self.filled_cells[0][i] // self.num_cols
				x = self.filled_cells[0][i] % self.num_cols
				rect = [x * self.cell[0] + self.rect[0], y * self.cell[1] + self.rect[1], self.cell[0], self.cell[1]]
				pygame.draw.rect(screen, self.color, rect)
		else:
			for i in range(0, len(self.filled_cells[1])):
				y = self.filled_cells[1][i] // self.num_cols
				x = self.filled_cells[1][i] % self.num_cols
				rect = [x * self.cell[0] + self.rect[0], y * self.cell[1] + self.rect[1], self.cell[0], self.cell[1]]
				pygame.draw.rect(screen, self.color, rect)
	'''更新敌方位置等信息'''
	def update(self, direction, HEIGHT):
		# 用于改变形状
		self.change_count += 1
		# 更新位置信息
		if direction == 'right':
			self.rect.x += self.speed[0]
		elif direction == 'left':
			self.rect.x -= self.speed[0]
		elif direction == 'down':
			self.rect.y += self.speed[1]
		if self.rect.y >= HEIGHT - self.rect.height:
			return True
		else:
			return False
	'''被击中后爆炸'''
	def boom(self, screen):
		self.boomed_rect.x = self.rect.x
		self.boomed_rect.y = self.rect.y
		self.boomed_count += 1
		if self.boomed_count % 1 == 0:
			self.boomed_frame += 1
			for i in range(0, len(self.boomed_filled_cells)):
				y = self.boomed_filled_cells[i] // self.boomed_num_cols
				x = self.boomed_filled_cells[i] % self.boomed_num_cols
				rect = [x * self.boomed_cell[0] + self.boomed_rect[0], y * self.boomed_cell[1] + self.boomed_rect[1], self.boomed_cell[0], self.boomed_cell[1]]
				pygame.draw.rect(screen, self.color, rect)
		if self.boomed_frame > 4:
			return True
		else:
			return False


'''我方子弹精灵类'''
class myBulletSprite(pygame.sprite.Sprite):
	def __init__(self, x, y, color, **kwargs):
		pygame.sprite.Sprite.__init__(self)
		self.cell = [2, 2]
		self.num_cols = 1
		self.num_rows = 4
		self.rect = pygame.Rect(x, y, self.num_cols*self.cell[0], self.num_rows*self.cell[1])
		self.filled_cells = [0,1,2,3]
		self.speed = 8
		self.color = color
	'''在屏幕上画出来'''
	def draw(self, screen):
		for i in range(0, len(self.filled_cells)):
			y = self.filled_cells[i] // self.num_cols
			x = self.filled_cells[i] % self.num_cols
			rect = [x * self.cell[0] + self.rect[0], y * self.cell[1] + self.rect[1], self.cell[0], self.cell[1]]
			pygame.draw.rect(screen, self.color, rect)
	'''更新子弹位置等信息'''
	def update(self):
		self.rect.y -= self.speed
		if self.rect.y + self.rect.height < 0:
			return True
		else:
			return False


'''敌方子弹精灵类'''
class enemyBulletSprite(pygame.sprite.Sprite):
	def __init__(self, x, y, color):
		pygame.sprite.Sprite.__init__(self)
		self.cell = [3, 3]
		self.num_cols = 3
		self.num_rows = 7
		self.rect = pygame.Rect(x, y, self.num_cols*self.cell[0], self.num_rows*self.cell[1])
		self.filled_cells = [[0,4,8,10,12,16,20], 
							 [2,4,6,10,14,16,18]]
		self.change_count = 0
		self.change_flag = False
		self.speed = 4
		self.color = color
	'''在屏幕上画出来'''
	def draw(self, screen):
		if self.change_count > 2:
			self.change_count = 0
			self.change_flag = not self.change_flag
		if self.change_flag:
			for i in range(0, len(self.filled_cells[0])):
				y = self.filled_cells[0][i] // self.num_cols
				x = self.filled_cells[0][i] % self.num_cols
				rect = [x * self.cell[0] + self.rect[0], y * self.cell[1] + self.rect[1], self.cell[0], self.cell[1]]
				pygame.draw.rect(screen, self.color, rect)
		else:
			for i in range(0, len(self.filled_cells[1])):
				y = self.filled_cells[1][i] // self.num_cols
				x = self.filled_cells[1][i] % self.num_cols
				rect = [x * self.cell[0] + self.rect[0], y * self.cell[1] + self.rect[1], self.cell[0], self.cell[1]]
				pygame.draw.rect(screen, self.color, rect)
	'''更新子弹位置等信息'''
	def update(self, HEIGHT):
		# 用于改变子弹形状的计数
		self.change_count += 1
		# 位置信息
		self.rect.y += self.speed
		if self.rect.y > HEIGHT:
			return True
		else:
			return False




'''一些常量'''
WIDTH = 800
HEIGHT = 600
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GREEN = (50, 250, 5)
RED = (255, 0, 0)
FPS = 60


'''
Function:
	开始游戏
'''
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, WHITE, WHITE)
		elif i < 33:
			enemy = enemySprite('medium', i, WHITE, WHITE)
		else:
			enemy = enemySprite('large', i, WHITE, 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=RED)
	# 我方
	myaircraft = aircraftSprite(color=GREEN, bullet_color=WHITE)
	my_bullets_group = pygame.sprite.Group()
	# 用于控制敌方位置更新
	# 	移动一行
	enemy_move_count = 24
	enemy_move_interval = 24
	enemy_move_flag = False
	# 	改变移动方向(改变方向的同时集体下降一次)
	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
	# 用于控制敌方发射子弹
	enemy_shot_interval = 100
	enemy_shot_count = 0
	enemy_shot_flag = False
	# 游戏进行中
	running = True
	is_win = False
	# 主循环
	while running:
		screen.fill(BLACK)
		for event in pygame.event.get():
			# 点右上角的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
		# 	敌方移动
		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
				# 每次下降提高移动和射击速度
				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', HEIGHT)
					else:
						enemy.update('left', HEIGHT)
			else:
				enemy.update(None, HEIGHT)
			if enemy_need_down:
				if enemy.update('down', HEIGHT):
					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(WIDTH)
			# 画飞船
			myaircraft.draw(screen)
		if (not ufo.has_boomed) and (ufo.is_dead):
			if ufo.boom(screen):
				ufo.has_boomed = True
		else:
			# 更新UFO
			ufo.update(WIDTH)
			# 画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(HEIGHT):
				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
		# 显示文字
		# 	当前得分
		showText(screen, 'SCORE: ', WHITE, font, 200, 8)
		showText(screen, str(myaircraft.score), WHITE, font, 200, 24)
		# 	敌人数量
		showText(screen, 'ENEMY: ', WHITE, font, 370, 8)
		showText(screen, str(len(enemies_group)), WHITE, font, 370, 24)
		# 	历史最高分
		showText(screen, 'HIGHEST: ', WHITE, font, 540, 8)
		showText(screen, str(highest_score), WHITE, font, 540, 24)
		# 	FPS
		showText(screen, 'FPS: ' + str(int(clock.get_fps())), RED, font, 8, 8)
		# 显示剩余生命值
		showLife(screen, myaircraft.num_life, GREEN)
		pygame.display.update()
		clock.tick(FPS)
	with open('score', 'w') as f:
		f.write(str(highest_score))
	return is_win


'''主函数'''
def main():
	# 初始化
	pygame.init()
	pygame.display.set_caption(u'外星人入侵-Charles的皮卡丘')
	screen = pygame.display.set_mode([WIDTH, HEIGHT])
	pygame.mixer.init()
	pygame.mixer.music.load('./music/bg.mp3')
	pygame.mixer.music.set_volume(0.4)
	pygame.mixer.music.play(-1)
	while True:
		is_win = startGame(screen)
		endInterface(screen, BLACK, is_win)


if __name__ == '__main__':
	main()

参考:[Charles的皮卡丘](https://mp.weixin.qq.com/s?__biz=MzU2NDI1MjkwNA==&mid=2247485617&idx=1&sn=0ae8c372c8aa4b14d8ab9a72d6f97791&chksm=fc4c9136cb3b182025cf19e5121ef846cb14718e81b99fd395145f7881d80cb48a2f9abc89aa&scene=0&xtrack=1&key=788e29d0e375da2204cb0df7a45d748d868ef6216447a0b2a9f25fc7d831489fa694458268174868dc65000c12257c0633d59e773607a1fcb515e243e1c8ed01a7ed6856c4c1e6b63bdddb7bd75eeb6c&ascene=1&uin=MjMwMTIwNjM0NA%3D%3D&devicetype=Windows+10&version=62060720&lang=zh_CN&pass_ticket=DZ8ZqOq7KqJ6WBGD69pdmnaqHsRf7kAUfX%2FsEpbys4hjndQTsX2yvMeTHvD2TRZt)

 

 

效果预览

代码示例

import pygame
import sys

file_path = r'./turtle.jpg'   # # 这里是你的图片路径

pygame.init()

size = width, height = 600, 400
speed = [-2, 1]
bg = (255, 255, 255)

screen = pygame.display.set_mode(size)

pygame.display.set_caption("初次见面大家多多关照!")

turtle = pygame.image.load(file_path)   

position = turtle.get_rect()  

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    position = position.move(speed)

    if position.left < 0 or position.right > width:
        turtle = pygame.transform.flip(turtle, True, False)

        speed[0] = -speed[0]

    if position.top < 0 or position.bottom > height:
        speed[1] = -speed[1]

    screen.fill(bg)

    screen.blit(turtle, position)

    pygame.display.flip()  

    pygame.time.delay(10)

代码由黑科技的孙凯同学提供。


欢迎斧正,that's all

 

 

效果

代码示例

import turtle
import time

turtle.pensize(5)
turtle.pencolor("yellow")
turtle.fillcolor("red")

turtle.begin_fill()

for _ in range(5):
    turtle.forward(200)
    turtle.right(144)
turtle.end_fill()
time.sleep(2)

turtle.penup()
turtle.goto(-150, -120)
turtle.color("violet")
turtle.write("Done", font=('Arial', 40, 'normal'))
time.sleep(2)

that's all, see also:

10分钟轻松学会 Python turtle 绘图

 

 

效果

示例代码

import turtle as t
import time
t.color("red", "yellow")
t.speed(10)
t.begin_fill()
for _ in range(50):
    t.forward(200)
    t.left(170)
t.end_fill()
time.sleep(1)

参考:[10分钟轻松学会 Python turtle 绘图](https://www.cnblogs.com/nowgood/p/turtle.html)

 

 

效果

额!这个蟒蛇不太凶!

代码示例

import turtle
import time


def drawSnake(rad, angle, len, neckrad):
    for _ in range(len):
        turtle.circle(rad, angle)
        turtle.circle(-rad, angle)
    turtle.circle(rad, angle / 2)
    turtle.forward(rad / 2)  # 直线前进
    turtle.circle(neckrad, 180)
    turtle.forward(rad / 4)


if __name__ == "__main__":
    turtle.setup(1500, 1400, 0, 0)
    turtle.pensize(30)  # 画笔尺寸
    turtle.pencolor("green")
    turtle.seth(-40)  # 前进的方向
    drawSnake(70, 80, 2, 15)
    time.sleep(2)

that's all, see also:

10分钟轻松学会 Python turtle 绘图

 

 

效果

代码示例

import turtle


# 画鼻子
def drawNose():
	turtle.penup()
	turtle.seth(90)
	turtle.fd(100)
	turtle.pendown()
	turtle.begin_fill()
	turtle.fillcolor('black')
	turtle.seth(45)
	turtle.fd(25)
	turtle.seth(135)
	turtle.circle(25, 95)
	turtle.seth(315)
	turtle.fd(25)
	turtle.end_fill()


# 画眼睛
def drawEyes(seth, fd, r):
	turtle.penup()
	turtle.seth(seth)
	turtle.fd(fd)
	turtle.pendown()
	turtle.begin_fill()
	turtle.fillcolor('black')
	turtle.circle(50)
	turtle.end_fill()
	turtle.penup()
	turtle.circle(50, r)
	turtle.pendown()
	turtle.begin_fill()
	turtle.fillcolor('white')
	turtle.circle(20)
	turtle.end_fill()


# 画脸
def drawFace(seth, fd):
	turtle.penup()
	turtle.seth(seth)
	turtle.fd(fd)
	turtle.pendown()
	turtle.begin_fill()
	turtle.fillcolor('red')
	turtle.circle(70)
	turtle.end_fill()


# 画嘴巴
def drawLip():
	turtle.penup()
	turtle.seth(135)
	turtle.fd(250)
	turtle.pendown()
	turtle.seth(-300)
	turtle.circle(30, -65)
	turtle.begin_fill()
	turtle.fillcolor('Firebrick')
	turtle.seth(165)
	turtle.fd(140)
	turtle.seth(195)
	turtle.fd(140)
	turtle.seth(-360)
	turtle.circle(30, -65)
	turtle.penup()
	turtle.seth(-60)
	turtle.circle(30, 65)
	turtle.pendown()
	turtle.seth(-70)
	turtle.fd(240)
	turtle.circle(55, 140)
	turtle.seth(70)
	turtle.fd(240)
	turtle.end_fill()
	turtle.seth(-110)
	turtle.fd(80)
	turtle.begin_fill()
	turtle.fillcolor('Firebrick')
	turtle.seth(120)
	turtle.circle(120, 123)
	turtle.seth(-70)
	turtle.fd(165)
	turtle.circle(55, 140)
	turtle.seth(72)
	turtle.fd(165)
	turtle.end_fill()


# 主函数
def main():
	turtle.pensize(4)
	turtle.hideturtle()
	turtle.setup(1000, 600)
	turtle.speed(10)
	turtle.screensize(bg='yellow')
	drawNose()
	drawEyes(160, 250, 60)
	drawEyes(-9.5, 530, 230)
	drawFace(195, 600)
	drawFace(-11, 720)
	drawLip()
	turtle.done()


if __name__ == '__main__':
	main()

参考:[Charles的皮卡丘](https://mp.weixin.qq.com/s?__biz=MzU2NDI1MjkwNA==&mid=2247485551&idx=1&sn=65ecb00d1ea29c1c91d4d468cbc2244f&chksm=fc4c91e8cb3b18fe61e516c22ee4ea95dbb01f9d0ace2f2d5c69322c4b747b9e919a6c9c8d90&scene=0&xtrack=1&key=1f3fd4f811b89077b8733eba44108bc197ac1f828c753a6f3c893b1e2962d5503a415f70a26239c94d55c512f35c77099870fbeafd52d0aee8bbb89bbbb401ceb46f702754934c30b368720f1531bce8&ascene=1&uin=MjMwMTIwNjM0NA%3D%3D&devicetype=Windows+10&version=62060720&lang=zh_CN&pass_ticket=DZ8ZqOq7KqJ6WBGD69pdmnaqHsRf7kAUfX%2FsEpbys4hjndQTsX2yvMeTHvD2TRZt)

 

 

效果

代码示例

import turtle as t

# 绘制小猪佩奇
# =======================================

t.pensize(4)
t.hideturtle()
t.colormode(255)
t.color((255, 155, 192), "pink")
t.setup(840, 500)
t.speed(10)

# 鼻子
t.pu()
t.goto(-100, 100)
t.pd()
t.seth(-30)
t.begin_fill()
a = 0.4
for i in range(120):
    if 0 <= i < 30 or 60 <= i < 90:
        a = a + 0.08
        t.lt(3)  # 向左转3度
        t.fd(a)  # 向前走a的步长
    else:
        a = a - 0.08
        t.lt(3)
        t.fd(a)
        t.end_fill()

t.pu()
t.seth(90)
t.fd(25)
t.seth(0)
t.fd(10)
t.pd()
t.pencolor(255, 155, 192)
t.seth(10)
t.begin_fill()
t.circle(5)
t.color(160, 82, 45)
t.end_fill()

t.pu()
t.seth(0)
t.fd(20)
t.pd()
t.pencolor(255, 155, 192)
t.seth(10)
t.begin_fill()
t.circle(5)
t.color(160, 82, 45)
t.end_fill()

# 头
t.color((255, 155, 192), "pink")
t.pu()
t.seth(90)
t.fd(41)
t.seth(0)
t.fd(0)
t.pd()
t.begin_fill()
t.seth(180)
t.circle(300, -30)
t.circle(100, -60)
t.circle(80, -100)
t.circle(150, -20)
t.circle(60, -95)
t.seth(161)
t.circle(-300, 15)
t.pu()
t.goto(-100, 100)
t.pd()
t.seth(-30)
a = 0.4
for i in range(60):
    if 0 <= i < 30 or 60 <= i < 90:
        a = a + 0.08
        t.lt(3)  # 向左转3度
        t.fd(a)  # 向前走a的步长
    else:
        a = a - 0.08
        t.lt(3)
        t.fd(a)
        t.end_fill()

# 耳朵
t.color((255, 155, 192), "pink")
t.pu()
t.seth(90)
t.fd(-7)
t.seth(0)
t.fd(70)
t.pd()
t.begin_fill()
t.seth(100)
t.circle(-50, 50)
t.circle(-10, 120)
t.circle(-50, 54)
t.end_fill()

t.pu()
t.seth(90)
t.fd(-12)
t.seth(0)
t.fd(30)
t.pd()
t.begin_fill()
t.seth(100)
t.circle(-50, 50)
t.circle(-10, 120)
t.circle(-50, 56)
t.end_fill()

# 眼睛
t.color((255, 155, 192), "white")
t.pu()
t.seth(90)
t.fd(-20)
t.seth(0)
t.fd(-95)
t.pd()
t.begin_fill()
t.circle(15)
t.end_fill()

t.color("black")
t.pu()
t.seth(90)
t.fd(12)
t.seth(0)
t.fd(-3)
t.pd()
t.begin_fill()
t.circle(3)
t.end_fill()

t.color((255, 155, 192), "white")
t.pu()
t.seth(90)
t.fd(-25)
t.seth(0)
t.fd(40)
t.pd()
t.begin_fill()
t.circle(15)
t.end_fill()

t.color("black")
t.pu()
t.seth(90)
t.fd(12)
t.seth(0)
t.fd(-3)
t.pd()
t.begin_fill()
t.circle(3)
t.end_fill()

# 腮
t.color((255, 155, 192))
t.pu()
t.seth(90)
t.fd(-95)
t.seth(0)
t.fd(65)
t.pd()
t.begin_fill()
t.circle(30)
t.end_fill()

# 嘴
t.color(239, 69, 19)
t.pu()
t.seth(90)
t.fd(15)
t.seth(0)
t.fd(-100)
t.pd()
t.seth(-80)
t.circle(30, 40)
t.circle(40, 80)

# 身体
t.color("red", (255, 99, 71))
t.pu()
t.seth(90)
t.fd(-20)
t.seth(0)
t.fd(-78)
t.pd()
t.begin_fill()
t.seth(-130)
t.circle(100, 10)
t.circle(300, 30)
t.seth(0)
t.fd(230)
t.seth(90)
t.circle(300, 30)
t.circle(100, 3)
t.color((255, 155, 192), (255, 100, 100))
t.seth(-135)
t.circle(-80, 63)
t.circle(-150, 24)
t.end_fill()

# 手
t.color((255, 155, 192))
t.pu()
t.seth(90)
t.fd(-40)
t.seth(0)
t.fd(-27)
t.pd()
t.seth(-160)
t.circle(300, 15)
t.pu()
t.seth(90)
t.fd(15)
t.seth(0)
t.fd(0)
t.pd()
t.seth(-10)
t.circle(-20, 90)

t.pu()
t.seth(90)
t.fd(30)
t.seth(0)
t.fd(237)
t.pd()
t.seth(-20)
t.circle(-300, 15)
t.pu()
t.seth(90)
t.fd(20)
t.seth(0)
t.fd(0)
t.pd()
t.seth(-170)
t.circle(20, 90)

# 脚
t.pensize(10)
t.color((240, 128, 128))
t.pu()
t.seth(90)
t.fd(-75)
t.seth(0)
t.fd(-180)
t.pd()
t.seth(-90)
t.fd(40)
t.seth(-180)
t.color("black")
t.pensize(15)
t.fd(20)

t.pensize(10)
t.color((240, 128, 128))
t.pu()
t.seth(90)
t.fd(40)
t.seth(0)
t.fd(90)
t.pd()
t.seth(-90)
t.fd(40)
t.seth(-180)
t.color("black")
t.pensize(15)
t.fd(20)

# 尾巴
t.pensize(4)
t.color((255, 155, 192))
t.pu()
t.seth(90)
t.fd(70)
t.seth(0)
t.fd(95)
t.pd()
t.seth(0)
t.circle(70, 20)
t.circle(10, 330)
t.circle(70, 30)
t.done()

参考:10分钟轻松学会 Python turtle 绘图

from random import shuffle

# 买牌环节
tf = ["\u2665", "\u2660", "\u2666", "\u2663"]
num = [3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K", "A", 2]
poke_dict_a = {}
poke_dict_b = {}
poke_list = []
player_dict = {}
qdz_dict = {}
l = []
a = []
b = []


def maipai():
    global poke_list, poke_dict_a, poke_dict_b
    for j in num:
        for k in tf:
            poke_list.append(str(j) + k)
    poke_list.append("XXW")
    poke_list.append("DDW")
    print(len(poke_list), poke_list)
    for i in range(0, 54):
        poke_dict_a[poke_list[i]] = i + 1
        poke_dict_b[i + 1] = poke_list[i]
    print(poke_dict_a)  # 买牌结束


# 洗牌
# shuffle(poke_list)
# print(poke_list)


# 发牌
def fapai():
    global player_dict
    player_dict = {
        "player1": [poke_list[0:17], []],
        "player2": [poke_list[17:34], []],
        "player3": [poke_list[34:51], []],
        "dp": [poke_list[-3:], []]
    }
    print(player_dict)


# 码牌
def mapai():
    global player_dict, poke_dict_b, poke_dict_a
    for k, v in player_dict.items():
        l = []
        for i in v[0]:
            v[1].append(poke_dict_a[i])
            v[1] = sorted(v[1])
        for j in v[1]:
            l.append(poke_dict_b[j])
        player_dict[k] = l
    print(player_dict)


# 抢地主
def qdz():
    global qdz_dict, l, player_dict
    qdz_dict = {
        input("玩家1请下注:"): player_dict["player1"],
        input("玩家2请下注:"): player_dict["player2"],
        input("玩家3请下注:"): player_dict["player3"]
    }

    for i in qdz_dict:
        l.append(int(i))
    l = sorted(l)
    qdz_dict[str(l[-1])] += player_dict['dp']
    print(qdz_dict)


# 地主牌排序
def zpx():
    global a, b, poke_dict_a, poke_dict_b, qdz_dict
    for i in qdz_dict[str(l[-1])]:
        a.append(poke_dict_a[i])
    for i in sorted(a):
        b.append(poke_dict_b[i])
    qdz_dict[str(l[-1])] = b
    print(qdz_dict)

# 出牌

maipai()
shuffle(poke_list)
fapai()
mapai()
qdz()
zpx()
posted @ 2023-12-21 00:48  silencio。  阅读(4)  评论(0编辑  收藏  举报