Python练习题(二)

练习一: 思聪爱吃热狗游戏

游戏介绍:
一款单人版的思聪吃热狗游戏,你可以自己调节思聪的位置, 移动时会消耗能量 10, 游戏中吃到热狗分数加1, 能量加20,最后的目标就是称霸世界咯, 吃掉 所有的热狗即游戏胜利。王思聪能量消耗完毕即游戏失败。
如何开始:
玩家:键盘方向键↑↓←→控制王思聪的移动。
游戏目标: 不断的吃掉热狗,不断的强大起来吧!
游戏素材
在这里插入图片描述
在这里插入图片描述

游戏要求: 1. 游戏背景可以为黑色或者其他图片(自定义即可); 2. 王思聪可以上下左右移动, 热狗只能向左移动, 当移动到最左边时, 穿越屏幕,到达最右端,继续向左移动。 3. 王思聪默认能量值(power)为200,每移动一次消耗能量值10, 当吃到一个热 狗, 能量值增加20。 4. 王思聪只有一个, 而热狗的个数是随机的(10~40个之间)。 5. 当热狗被彻底消灭掉或者思聪毫无能量值时,游戏结束。

**游戏进阶要求:**能否实现一个双人版吃热狗游戏?
在这大千世界里,现在的所有物种都是通过自身群体间的相互竞争进化而生存下来,
物竞天择这个词就是这样的由来,生存环境发生了变化,要么尝试地去改变去适应
它,要么就被无情地淘汰,最终陈列在博物馆内。我们的祖先经过几亿年的演变,
适应了一个又一个的极端环境,才有了现在的我们,他们的坚韧体现的淋漓尽致。 emmmmmm,我貌似扯远了…双人游戏很好的诠释了物竞天择这一点,

我们刚开始是两个人物, 一个玩家是你, 一个玩家是王思聪,周围都是仅剩无 几的热狗食物,为了生存两个玩家必须争夺仅有的热狗。 当热狗吃完时, 谁的得 分高, 谁就是最终的赢家。 或者其中一方玩家体力消耗仅剩0, 另外一方玩家即 为赢家。
玩家1:键盘方向键↑↓←→控制移动。
玩家2:键盘WSAD控制控制移动。

代码部分

import random
import pygame
import sys
from pygame.locals import *
	
width = 800
height = 500
pygame.init()

screen = pygame.display.set_mode([width, height])
pygame.display.set_caption('恰热狗')
# 定义窗口标题
background = pygame.image.load('./bj.jpg').convert()
# 导入背景
RegouImg = pygame.image.load("./regou.jpg").convert_alpha()
WscImg = pygame.image.load('./wsc.jpg').convert_alpha()
igImg = pygame.image.load('./wsc2.jpg').convert_alpha()
# 背景音乐
pygame.mixer.music.load('./yinpin.mp3')
pygame.mixer.music.play(loops=0, start=0.0)

p1count = 0
p2count = 0
font = pygame.font.SysFont("arial", 40)
p1score = font.render("score %d" % p1count, True, (255, 255, 255))
p2score = font.render("score %d" % p2count, True, (255, 255, 255))

w_width = WscImg.get_width() - 5
w_height = WscImg.get_height() - 5

y_width = RegouImg.get_width() - 5
y_height = RegouImg.get_height() - 5

z_width = igImg.get_width() - 5
z_height = igImg.get_height() - 5

fpsClock = pygame.time.Clock()


class Wangsicong:
    def __init__(self):  # Wsc的属性(生命值,所在横坐标,所在纵坐标)
        self.p1power = 200
        self.x = random.randint(0, (width - w_width))
        self.y = random.randint(0, (height - w_height))
        # Wsc移动的方向,方法均为随机

    def move(self, new_x, new_y):
        # 判断移动后是否超出边界
        if new_x < 0:
            self.x = 800
        elif new_x > width:
            self.x = 0
        else:
            # 不越界则移动wsc的位置
            self.x = new_x
        if new_y < 0:
            self.y = 500
        elif new_y > height:
            self.y = 0
        else:
            self.y = new_y
        self.p1power -= 20

    def eat(self):
        self.p1power += 20  # Wsc吃热狗,生命加20
        if self.p1power > 200:
            self.p1power = 200  # wsc的体力上限


class IG:
    def __init__(self):  # 玩家2的属性(生命值,所在横坐标,所在纵坐标)
        self.p2power = 200
        self.x = random.randint(0, (width - z_width))
        self.y = random.randint(0, (height - z_height))
        # 玩家二移动的方向,方法均为随机

    def move(self, new_x, new_y):
        # 判断移动后是否超出边界
        if new_x < 0:
            self.x = 800
        elif new_x > width:
            self.x = 0
        else:
            # 不越界则移动玩家2的位置
            self.x = new_x
        if new_y < 0:
            self.y = 500
        elif new_y > height:
            self.y = 0
        else:
            self.y = new_y
        self.p2power -= 20

    def eat(self):
        self.p2power += 20  # 玩家2吃热狗,生命加20
        if self.p2power > 200:
            self.p2power = 200  # 玩家2的体力上限


class Regou:
    # 定义热狗的属性,只有横坐标与纵坐标属性
    def __init__(self):
        # 随机生成热狗的坐标
        self.x = random.randint(0, width - y_width)
        self.y = random.randint(0, height - y_height)

    def move(self):
        new_x = self.x + random.choice([-10])
        if new_x < 0:
            self.x = width
        else:
            self.x = new_x


# 示例化
Wsc = Wangsicong()
ig = IG()
regou = [Regou() for i in range(random.randint(10, 40))]  # 生成随机只热狗

while True:  # 操作窗口
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == KEYDOWN:
        #将玩家一的操作导入到电脑中
            if event.key == pygame.K_LEFT:
                Wsc.move(Wsc.x - 10, Wsc.y)
            if event.key == pygame.K_RIGHT:
                Wsc.move(Wsc.x + 10, Wsc.y)
            if event.key == pygame.K_UP:
                Wsc.move(Wsc.x, Wsc.y - 10)
            if event.key == pygame.K_DOWN:
                Wsc.move(Wsc.x, Wsc.y + 10)
        if event.type == KEYDOWN:
       #将玩家二的操作导入至电脑中
            if event.key == pygame.K_a:
                ig.move(ig.x - 10, ig.y)
            if event.key == pygame.K_d:
                ig.move(ig.x + 10, ig.y)
            if event.key == pygame.K_w:
                ig.move(ig.x, ig.y - 10)
            if event.key == pygame.K_s:
                ig.move(ig.x, ig.y + 10)

    p1power = font.render("p1power %d" % Wsc.p1power, True, (255, 255, 255))
    p2power = font.render("p2power %d" % ig.p2power, True, (255, 255, 255))
    screen.blit(background, (0, 0))  # 更新背景
    screen.blit(p1score, (600, 20))  # 更新p1分数
    screen.blit(p1power, (600, 50))  # 更新p1体力
    screen.blit(p2power, (0, 50))  # 更新p2体力
    screen.blit(p2score, (0, 20))  # 更新p1分数
    for i in regou:
        screen.blit(RegouImg, (i.x, i.y))
        i.move()
    screen.blit(WscImg, (Wsc.x, Wsc.y))
    
    if Wsc.p1power < 0 or ig.p2power < 0 or len(regou) == 0:
    #判定玩家是否吃到热狗
        print("Game Over")
        sys.exit()
    for i in regou:
        screen.blit(RegouImg, (i.x, i.y))
        i.move()
    screen.blit(igImg, (ig.x, ig.y))
    if Wsc.p1power < 0 or ig.p2power < 0 or len(regou) == 0:
        print("Game Over")
        sys.exit()
    for i in regou:
        if ((Wsc.x < i.x + y_width) and (Wsc.x + w_width > i.x) and (Wsc.y < i.y + y_height) and (
                w_height + Wsc.y > i.y)):
            Wsc.eat()
            regou.remove(i)
            p1count = p1count + 1
            p1score = font.render("score %d" % p1count, True, (255, 255, 255))
            #更新玩家一的分数并且显示在屏幕上
    for i in regou:
        if ((ig.x < i.x + y_width) and (ig.x + w_width > i.x) and (ig.y < i.y + y_height) and (
                w_height + ig.y > i.y)):
            ig.eat()
            regou.remove(i)
            p2count = p2count + 1
            p2score = font.render("score %d" % p2count, True, (255, 255, 255))
            #更新玩家二的分数,并且显示在屏幕上
    pygame.display.update()
    fpsClock.tick(10)

练习二.按照奇偶排序数组

Python练习题(二)_第1张图片

代码部分

import random
def ChangeLine():
    A = []
    B = []
    C = []
    for i in range(random.randint(5,10)):
        A.append(random.randint(0,10))
    for item in A:
        if item % 2 != 0:
            B.append(item)
        else:
            C.append(item)
        A = C + B
    print(A)
ChangeLine()

运行结果在这里插入图片描述

练习三.电话本号码组合

Python练习题(二)_第2张图片

代码部分:

import itertools
def PhoneKeyboard():
    b = []
    d = []
    e = []
    i = 0
    p = 0
    keyboard = {"2": "abc", "3": "def", "4": "ghi", "5": "jkl", "6": "mno", "7": "pqrs", "8": "tuv", "9": "wxyz"}
    a = keyboard.get(str(input("请输入第一个数:")))
    for item in range(len(a)):
        b.append(a[i])
        i += 1
    c = keyboard.get(str(input("请输入第二个数:")))
    for item in range(len(c)):
        d.append(c[p])
        p += 1
    print(b)
    print(d)
    print(list(itertools.product(b,d)))


PhoneKeyboard()

输出结果在这里插入图片描述

你可能感兴趣的:(技术类)