cruise_available = False count = max(1, len(enemies) - 2) targets = random.sample(enemies, min(count, len(enemies))) for t in targets: cruise_missiles.append([player_x, player_y, t])
# HEAL BUTTON if heal_btn.collidepoint(mx, my) and heal_available: heal_available = False player_hp = player_max_hp heal_timer = 0
# EAT BUTTON if eat_btn.collidepoint(mx, my): if food_storage > 0: food_storage -= 1 food = food_max
if event.type == pygame.MOUSEBUTTONUP: joy_active = False joy_knob_x, joy_knob_y = joy_base_x, joy_base_y attack_pressed = False
# ---------------- JOYSTICK MOVEMENT ---------------- move_x = move_y = 0 if joy_active: mx, my = pygame.mouse.get_pos() dx = mx - joy_base_x dy = my - joy_base_y dist = math.hypot(dx, dy) if dist < joy_radius: joy_knob_x, joy_knob_y = mx, my else: joy_knob_x = joy_base_x + dx / dist joy_radius
joy_knob_y = joy_base_y + dy / dist joy_radius if dist > 0: move_x = dx / dist player_speed
move_y = dy / dist player_speed attack_angle = math.degrees(math.atan2(dy, dx))
player_x += move_x player_y += move_y player_x = max(40, min(WIDTH - 40, player_x)) player_y = max(40, min(HEIGHT - 40, player_y))
# ---------------- ENEMY MOVEMENT ---------------- if night: for e in enemies: dx = player_x - e[0] dy = player_y - e[1] dist = math.hypot(dx, dy) if dist > 1: e[0] += dx / dist enemy_speed
e[1] += dy / dist enemy_speed if dist < 20: player_hp -= 0.15 if player_hp < 0: player_hp = 0
# ---------------- FOOD SYSTEM --------------------- food -= food_loss_rate if food < 0: food = 0
if food == 0: player_hp -= food_damage if player_hp < 0: player_hp = 0
# ---------------- MISSILE MOVEMENT ---------------- for m in missiles[:]: x, y, tx, ty = m dx = tx - x dy = ty - y dist = math.hypot(dx, dy)
hit = False for e in enemies[:]: if math.hypot(e[0] - x, e[1] - y) < 15: explosions.append(Explosion(e[0], e[1])) enemies.remove(e)
# ---------------- DROP MEAT ---------------- if food_storage < food_storage_max: r = random.random() if r < 0.8: food_storage += 1 else: food_storage += 2 food_storage = min(food_storage, food_storage_max)
hit = True break
if hit: missiles.remove(m) continue
if dist < 10: explosions.append(Explosion(tx, ty)) for e in enemies[:]: if math.hypot(e[0] - tx, e[1] - ty) < 50: enemies.remove(e)
# DROP MEAT if food_storage < food_storage_max: r = random.random() if r < 0.8: food_storage += 1 else: food_storage += 2 food_storage = min(food_storage, food_storage_max)
missiles.remove(m) continue
speed = 12 m[0] += dx / dist speed
m[1] += dy / dist speed
# ---------------- CRUISE MISSILE MOVEMENT ---------------- for cm in cruise_missiles[:]: x, y, target_enemy = cm if
# HEAL BUTTON if heal_btn.collidepoint(mx, my) and heal_available: heal_available = False player_hp = player_max_hp heal_timer = 0
# EAT BUTTON if eat_btn.collidepoint(mx, my): if food_storage > 0: food_storage -= 1 food = food_max
if event.type == pygame.MOUSEBUTTONUP: joy_active = False joy_knob_x, joy_knob_y = joy_base_x, joy_base_y attack_pressed = False
# ---------------- JOYSTICK MOVEMENT ---------------- move_x = move_y = 0 if joy_active: mx, my = pygame.mouse.get_pos() dx = mx - joy_base_x dy = my - joy_base_y dist = math.hypot(dx, dy) if dist < joy_radius: joy_knob_x, joy_knob_y = mx, my else: joy_knob_x = joy_base_x + dx / dist joy_radius
joy_knob_y = joy_base_y + dy / dist joy_radius if dist > 0: move_x = dx / dist player_speed
move_y = dy / dist player_speed attack_angle = math.degrees(math.atan2(dy, dx))
player_x += move_x player_y += move_y player_x = max(40, min(WIDTH - 40, player_x)) player_y = max(40, min(HEIGHT - 40, player_y))
# ---------------- ENEMY MOVEMENT ---------------- if night: for e in enemies: dx = player_x - e[0] dy = player_y - e[1] dist = math.hypot(dx, dy) if dist > 1: e[0] += dx / dist enemy_speed
e[1] += dy / dist enemy_speed if dist < 20: player_hp -= 0.15 if player_hp < 0: player_hp = 0
# ---------------- FOOD SYSTEM --------------------- food -= food_loss_rate if food < 0: food = 0
if food == 0: player_hp -= food_damage if player_hp < 0: player_hp = 0
# ---------------- MISSILE MOVEMENT ---------------- for m in missiles[:]: x, y, tx, ty = m dx = tx - x dy = ty - y dist = math.hypot(dx, dy)
hit = False for e in enemies[:]: if math.hypot(e[0] - x, e[1] - y) < 15: explosions.append(Explosion(e[0], e[1])) enemies.remove(e)
# ---------------- DROP MEAT ---------------- if food_storage < food_storage_max: r = random.random() if r < 0.8: food_storage += 1 else: food_storage += 2 food_storage = min(food_storage, food_storage_max)
hit = True break
if hit: missiles.remove(m) continue
if dist < 10: explosions.append(Explosion(tx, ty)) for e in enemies[:]: if math.hypot(e[0] - tx, e[1] - ty) < 50: enemies.remove(e)
# DROP MEAT if food_storage < food_storage_max: r = random.random() if r < 0.8: food_storage += 1 else: food_storage += 2 food_storage = min(food_storage, food_storage_max)
missiles.remove(m) continue
speed = 12 m[0] += dx / dist speed
m[1] += dy / dist speed
# ---------------- CRUISE MISSILE MOVEMENT ---------------- for cm in cruise_missiles[:]: x, y, target_enemy = cm if
۱۶:۵۷
target_enemy not in enemies: cruise_missiles.remove(cm) continue tx, ty = target_enemy dx = tx - x dy = ty - y dist = math.hypot(dx, dy) if dist < 10: explosions.append(Explosion(tx, ty)) if target_enemy in enemies: enemies.remove(target_enemy)
# DROP MEAT if food_storage < food_storage_max: r = random.random() if r < 0.8: food_storage += 1 else: food_storage += 2 food_storage = min(food_storage, food_storage_max)
cruise_missiles.remove(cm) continue speed = 10 cm[0] += dx / dist speed
cm[1] += dy / dist speed if math.hypot(target_enemy[0] - cm[0], target_enemy[1] - cm[1]) < 15: explosions.append(Explosion(target_enemy[0], target_enemy[1])) if target_enemy in enemies: enemies.remove(target_enemy)
# DROP MEAT if food_storage < food_storage_max: r = random.random() if r < 0.8: food_storage += 1 else: food_storage += 2 food_storage = min(food_storage, food_storage_max)
cruise_missiles.remove(cm)
# ---------------- ATTACK ---------------- if attack_pressed: sx = player_x + math.cos(math.radians(attack_angle)) attack_range
sy = player_y + math.sin(math.radians(attack_angle)) attack_range for e in enemies[:]: if math.hypot(e[0] - sx, e[1] - sy) < 35: explosions.append(Explosion(e[0], e[1])) enemies.remove(e)
# DROP MEAT if food_storage < food_storage_max: r = random.random() if r < 0.8: food_storage += 1 else: food_storage += 2 food_storage = min(food_storage, food_storage_max)
# ---------------- DRAW ---------------- screen.fill(GREEN)
# DAY TEXT txt = font.render(f"DAY {day_number}", True, WHITE) screen.blit(txt, (WIDTH // 2 - txt.get_width() // 2, 20))
# HP BAR hp_width = 200 hp_ratio = player_hp / player_max_hp pygame.draw.rect(screen, RED, (20, 20, hp_width, 25)) pygame.draw.rect(screen, YELLOW, (20, 20, hp_width hp_ratio, 25))
# FOOD BAR
fw = 200
fratio = food / food_max
pygame.draw.rect(screen, (120, 60, 0), (20, 55, fw, 20))
pygame.draw.rect(screen, (255, 180, 60), (20, 55, fw fratio, 20))
# FOOD STORAGE TEXT fs_txt = small_font.render(f"{food_storage}/5 MEAT", True, WHITE) screen.blit(fs_txt, (WIDTH - fs_txt.get_width() - 20, 20))
# FIRE pygame.draw.circle(screen, (255, 130, 30), (fire_x, fire_y), 40) pygame.draw.circle(screen, (255, 200, 60), (fire_x, fire_y), 20)
# PLAYER pygame.draw.circle(screen, WHITE, (int(player_x), int(player_y)), player_radius)
# SWORD if attack_pressed: sx = player_x + math.cos(math.radians(attack_angle)) attack_range
sy = player_y + math.sin(math.radians(attack_angle)) attack_range pygame.draw.line(screen, RED, (player_x, player_y), (sx, sy), 12) pygame.draw.circle(screen, RED, (int(sx), int(sy)), 12)
# ENEMIES for e in enemies: pygame.draw.circle(screen, BLACK, (int(e[0]), int(e[1])), enemy_radius)
# انفجار قوی if explosion_circle_active: pygame.draw.circle(screen, (255, 80, 80), (int(player_x), int(player_y)), int(explosion_circle_radius), 3) if explosion_circle_radius < explosion_circle_max: explosion_circle_radius += explosion_circle_speed else: explosion_circle_active = False
#
# DROP MEAT if food_storage < food_storage_max: r = random.random() if r < 0.8: food_storage += 1 else: food_storage += 2 food_storage = min(food_storage, food_storage_max)
cruise_missiles.remove(cm) continue speed = 10 cm[0] += dx / dist speed
cm[1] += dy / dist speed if math.hypot(target_enemy[0] - cm[0], target_enemy[1] - cm[1]) < 15: explosions.append(Explosion(target_enemy[0], target_enemy[1])) if target_enemy in enemies: enemies.remove(target_enemy)
# DROP MEAT if food_storage < food_storage_max: r = random.random() if r < 0.8: food_storage += 1 else: food_storage += 2 food_storage = min(food_storage, food_storage_max)
cruise_missiles.remove(cm)
# ---------------- ATTACK ---------------- if attack_pressed: sx = player_x + math.cos(math.radians(attack_angle)) attack_range
sy = player_y + math.sin(math.radians(attack_angle)) attack_range for e in enemies[:]: if math.hypot(e[0] - sx, e[1] - sy) < 35: explosions.append(Explosion(e[0], e[1])) enemies.remove(e)
# DROP MEAT if food_storage < food_storage_max: r = random.random() if r < 0.8: food_storage += 1 else: food_storage += 2 food_storage = min(food_storage, food_storage_max)
# ---------------- DRAW ---------------- screen.fill(GREEN)
# DAY TEXT txt = font.render(f"DAY {day_number}", True, WHITE) screen.blit(txt, (WIDTH // 2 - txt.get_width() // 2, 20))
# HP BAR hp_width = 200 hp_ratio = player_hp / player_max_hp pygame.draw.rect(screen, RED, (20, 20, hp_width, 25)) pygame.draw.rect(screen, YELLOW, (20, 20, hp_width hp_ratio, 25))
# FOOD BAR
fw = 200
fratio = food / food_max
pygame.draw.rect(screen, (120, 60, 0), (20, 55, fw, 20))
pygame.draw.rect(screen, (255, 180, 60), (20, 55, fw fratio, 20))
# FOOD STORAGE TEXT fs_txt = small_font.render(f"{food_storage}/5 MEAT", True, WHITE) screen.blit(fs_txt, (WIDTH - fs_txt.get_width() - 20, 20))
# FIRE pygame.draw.circle(screen, (255, 130, 30), (fire_x, fire_y), 40) pygame.draw.circle(screen, (255, 200, 60), (fire_x, fire_y), 20)
# PLAYER pygame.draw.circle(screen, WHITE, (int(player_x), int(player_y)), player_radius)
# SWORD if attack_pressed: sx = player_x + math.cos(math.radians(attack_angle)) attack_range
sy = player_y + math.sin(math.radians(attack_angle)) attack_range pygame.draw.line(screen, RED, (player_x, player_y), (sx, sy), 12) pygame.draw.circle(screen, RED, (int(sx), int(sy)), 12)
# ENEMIES for e in enemies: pygame.draw.circle(screen, BLACK, (int(e[0]), int(e[1])), enemy_radius)
# انفجار قوی if explosion_circle_active: pygame.draw.circle(screen, (255, 80, 80), (int(player_x), int(player_y)), int(explosion_circle_radius), 3) if explosion_circle_radius < explosion_circle_max: explosion_circle_radius += explosion_circle_speed else: explosion_circle_active = False
#
۱۶:۵۷
JOYSTICK pygame.draw.circle(screen, WHITE, (joy_base_x, joy_base_y), joy_radius, 3) pygame.draw.circle(screen, WHITE, (int(joy_knob_x), int(joy_knob_y)), knob_radius)
# ATTACK BUTTON pygame.draw.circle(screen, RED, attack_btn.center, 55) at = small_font.render("ATTACK", True, WHITE) screen.blit(at, (attack_btn.centerx - at.get_width() // 2, attack_btn.centery - at.get_height() // 2))
# MISSILE BUTTON pygame.draw.circle(screen, WHITE, missile_btn.center, 55) if missile_available: mt = small_font.render("MISSILE", True, BLACK) else: mt = small_font.render(str(int(MISSILE_COOLDOWN - missile_timer)), True, BLACK) screen.blit(mt, (missile_btn.centerx - mt.get_width() // 2, missile_btn.centery - mt.get_height() // 2))
# CRUISE MISSILE BUTTON pygame.draw.circle(screen, (0, 180, 180), cruise_btn.center, 55) if cruise_available: ct = small_font.render("CRUISE", True, WHITE) else: ct = small_font.render(str(int(CRUISE_COOLDOWN - cruise_timer)), True, WHITE) screen.blit(ct, (cruise_btn.centerx - ct.get_width() // 2, cruise_btn.centery - ct.get_height() // 2))
# STRONG HIT pygame.draw.circle(screen, (120, 0, 0), strong_btn.center, 55) if strong_available: text = small_font.render("STRONG", True, WHITE) else: left = int(STRONG_COOLDOWN - strong_timer) text = small_font.render(str(left), True, WHITE) screen.blit(text, (strong_btn.centerx - text.get_width() // 2, strong_btn.centery - text.get_height() // 2))
# HEAL BUTTON pygame.draw.circle(screen, (0, 200, 0), heal_btn.center, 55) if heal_available: ht = small_font.render("HEAL", True, WHITE) else: ht = small_font.render(str(int(HEAL_COOLDOWN - heal_timer)), True, WHITE) screen.blit(ht, (heal_btn.centerx - ht.get_width() // 2, heal_btn.centery - ht.get_height() // 2))
# EAT BUTTON pygame.draw.circle(screen, (200, 150, 0), eat_btn.center, 55) et = small_font.render("EAT", True, BLACK) screen.blit(et, (eat_btn.centerx - et.get_width() // 2, eat_btn.centery - et.get_height() // 2))
# DRAW MISSILES for m in missiles: pygame.draw.circle(screen, YELLOW, (int(m[0]), int(m[1])), 8)
# DRAW CRUISE MISSILES for cm in cruise_missiles: pygame.draw.circle(screen, (0, 255, 255), (int(cm[0]), int(cm[1])), 8)
# EXPLOSIONS for ex in explosions: ex.update() ex.draw(screen) explosions = [ex for ex in explosions if len(ex.particles) > 0]
# GAME OVER if player_hp <= 0: go_txt = font.render("GAME OVER", True, RED) screen.blit(go_txt, (WIDTH // 2 - go_txt.get_width() // 2, HEIGHT // 2)) pygame.display.update() pygame.time.wait(3000) pygame.quit() sys.exit()
pygame.display.update()
# ATTACK BUTTON pygame.draw.circle(screen, RED, attack_btn.center, 55) at = small_font.render("ATTACK", True, WHITE) screen.blit(at, (attack_btn.centerx - at.get_width() // 2, attack_btn.centery - at.get_height() // 2))
# MISSILE BUTTON pygame.draw.circle(screen, WHITE, missile_btn.center, 55) if missile_available: mt = small_font.render("MISSILE", True, BLACK) else: mt = small_font.render(str(int(MISSILE_COOLDOWN - missile_timer)), True, BLACK) screen.blit(mt, (missile_btn.centerx - mt.get_width() // 2, missile_btn.centery - mt.get_height() // 2))
# CRUISE MISSILE BUTTON pygame.draw.circle(screen, (0, 180, 180), cruise_btn.center, 55) if cruise_available: ct = small_font.render("CRUISE", True, WHITE) else: ct = small_font.render(str(int(CRUISE_COOLDOWN - cruise_timer)), True, WHITE) screen.blit(ct, (cruise_btn.centerx - ct.get_width() // 2, cruise_btn.centery - ct.get_height() // 2))
# STRONG HIT pygame.draw.circle(screen, (120, 0, 0), strong_btn.center, 55) if strong_available: text = small_font.render("STRONG", True, WHITE) else: left = int(STRONG_COOLDOWN - strong_timer) text = small_font.render(str(left), True, WHITE) screen.blit(text, (strong_btn.centerx - text.get_width() // 2, strong_btn.centery - text.get_height() // 2))
# HEAL BUTTON pygame.draw.circle(screen, (0, 200, 0), heal_btn.center, 55) if heal_available: ht = small_font.render("HEAL", True, WHITE) else: ht = small_font.render(str(int(HEAL_COOLDOWN - heal_timer)), True, WHITE) screen.blit(ht, (heal_btn.centerx - ht.get_width() // 2, heal_btn.centery - ht.get_height() // 2))
# EAT BUTTON pygame.draw.circle(screen, (200, 150, 0), eat_btn.center, 55) et = small_font.render("EAT", True, BLACK) screen.blit(et, (eat_btn.centerx - et.get_width() // 2, eat_btn.centery - et.get_height() // 2))
# DRAW MISSILES for m in missiles: pygame.draw.circle(screen, YELLOW, (int(m[0]), int(m[1])), 8)
# DRAW CRUISE MISSILES for cm in cruise_missiles: pygame.draw.circle(screen, (0, 255, 255), (int(cm[0]), int(cm[1])), 8)
# EXPLOSIONS for ex in explosions: ex.update() ex.draw(screen) explosions = [ex for ex in explosions if len(ex.particles) > 0]
# GAME OVER if player_hp <= 0: go_txt = font.render("GAME OVER", True, RED) screen.blit(go_txt, (WIDTH // 2 - go_txt.get_width() // 2, HEIGHT // 2)) pygame.display.update() pygame.time.wait(3000) pygame.quit() sys.exit()
pygame.display.update()
۱۶:۵۷
گفتم
۱۶:۵۹
اینم از کد ما اگه سوالی داشتید بیاد به هم بگید@parsa_pad
۱۶:۵۹
سلام دوستان #parsa_pad هستم
۱۵:۰۹
دارم روی همون کد طولانی که فرستادم کار می کنم وقتی که کارش تمام شه اون کد ۱۵۰۰ خطی رو براتون می فرستم.اون رو نمی گم، اونی رو می گم که دارم می سازم رو میگم الان دیگه ۱۵۰۰ خط شد🫡
۱۵:۱۲
سلام #parsa_pad هستم
۱۱:۳۶
آمده ام یک مود خفن و یک بازی براتون بفرستم
۱۱:۳۶
اول از مود شروع می کنم
۱۱:۳۶
مود تبدیل شدن به ماب ها و تبدیل شدن به بلاکمن خودم این مود رو بازی کردم و کار می کنه و این مود رو من توی بدراک امتحان کردم نمی دونم حالا توی جاوا هم کار می کنه یا نه ولی توی بدراک کار می کنه حتی قابلیت هاشونتوضیح مود:ببین من که برای اینکه تبدیل به ماب ها شید نباید هیچ آرموری تنتون باشه مخصوصا کلاه خود. اول شما طبق دفترچه ی راهنما باید یک عصا داشته باشید. عصا رو توی دست تون بگیرید و دکمه ی نشستن رو بزنید و اگه می خواهید به ماب تبدیل شوید روی ماب مورد نظر نگه دارید و اگه می خواهید تبدیل به بلاک شوید همین کار رو کنید ولی یک بار روی بلاک مورد نظر بزنید و برای انگشتر هم باید اسن کار رو کنید و برای انجام قابلیت هاشون باید عصا توی دست تون باشه و روی صفحه نگه دارید#مود#تبدیل_شدن_به_ماب_ها#مود_تبدیل_شدن_به_ماب_ها
۱۱:۴۹
و اما بازی:
۱۱:۵۰
# World War - Economic War Game# 2-4 Players, 7 Cities Each
import pygameimport mathimport random
pygame.init()
# ========== تنظیمات صفحه نمایش ==========info = pygame.display.Info()WIDTH, HEIGHT = info.current_w, info.current_h
if WIDTH > HEIGHT: WIDTH, HEIGHT = HEIGHT, WIDTH
screen = pygame.display.set_mode((WIDTH, HEIGHT))pygame.display.set_caption("World War")clock = pygame.time.Clock()
# ========== فاکتور مقیاس ==========BASE_WIDTH = 1080BASE_HEIGHT = 1920SCALE_X = WIDTH / BASE_WIDTHSCALE_Y = HEIGHT / BASE_HEIGHT
def scale_x(value): return int(value SCALE_X)
def scale_y(value):
return int(value SCALE_Y)
# ========== رنگها ==========WHITE = (255, 255, 255)BLACK = (0, 0, 0)RED = (255, 0, 0)BLUE = (0, 0, 255)GREEN = (0, 255, 0)YELLOW = (255, 255, 0)PURPLE = (128, 0, 128)GRAY = (128, 128, 128)BROWN = (139, 69, 19)GOLD = (255, 215, 0)ORANGE = (255, 165, 0)CYAN = (0, 255, 255)DARK_GREEN = (0, 100, 0) # سبز پررنگ
PLAYER_COLORS = { 0: RED, 1: BLUE, 2: GREEN, 3: YELLOW}
# ========== فونتها ==========def get_font(size): return pygame.font.Font(None, int(size min(SCALE_X, SCALE_Y)))
title_font = get_font(90)
font = get_font(60)
medium_font = get_font(50)
small_font = get_font(40)
tiny_font = get_font(30)
# ========== کلاس شهر ==========
class City:
def __init__(self, name, x, y, owner=None):
self.name = name[:4] + "."
self.x = x
self.y = y
self.owner = owner
self.hp = 250
self.max_hp = 250
self.radius = scale_x(30)
self.mine = None
def draw(self):
color = PLAYER_COLORS[self.owner] if self.owner is not None else GRAY
# سایه
pygame.draw.circle(screen, (50, 50, 50),
(self.x + 3, self.y + 3), self.radius)
# دایره اصلی
pygame.draw.circle(screen, BLACK, (self.x, self.y), self.radius + 1)
pygame.draw.circle(screen, color, (self.x, self.y), self.radius)
# اسم شهر
name_text = tiny_font.render(self.name, True, WHITE)
screen.blit(name_text, (self.x - name_text.get_width()//2,
self.y - self.radius - 25))
# عدد جون
hp_text = font.render(str(self.hp), True, WHITE)
screen.blit(hp_text, (self.x - hp_text.get_width()//2,
self.y - hp_text.get_height()//2))
# آیکون معدن
if self.mine:
mine_symbols = {
"coal": "
",
"fossil": "
",
"emerald": "
",
"gold": "
"
}
symbol = mine_symbols.get(self.mine, "
")
mine_text = tiny_font.render(symbol, True, GOLD)
screen.blit(mine_text, (self.x + self.radius - 10, self.y - self.radius + 10))
# شماره بازیکن
if self.owner is not None:
owner_text = tiny_font.render(f"P{self.owner + 1}", True, WHITE)
screen.blit(owner_text, (self.x - owner_text.get_width()//2,
self.y + self.radius + 10))
# ========== کلاس موشک ==========
class Missile:
def __init__(self, x, y, target_city, damage):
self.x = x
self.y = y
self.target = target_city
self.damage = damage
self.progress = 0
self.speed = 0.03
def update(self):
self.progress += self.speed
if self.progress >= 1:
return True
self.x = self.x + (self.target.x - self.x) self.progress self.y = self.y + (self.target.y - self.y) * self.progress return False
def draw(self): pygame.draw.circle(screen, ORANGE, (int(self.x), int(self.y)), scale_x(8)) pygame.draw.circle(screen, YELLOW, (int(self.x), int(self.y)), scale_x(4))
# ========== کلاس بازیکن ==========class Player: def __init__(self, player_id): self.id = player_id self.cities = [] self.coins = 100 self.alive = True
import pygameimport mathimport random
pygame.init()
# ========== تنظیمات صفحه نمایش ==========info = pygame.display.Info()WIDTH, HEIGHT = info.current_w, info.current_h
if WIDTH > HEIGHT: WIDTH, HEIGHT = HEIGHT, WIDTH
screen = pygame.display.set_mode((WIDTH, HEIGHT))pygame.display.set_caption("World War")clock = pygame.time.Clock()
# ========== فاکتور مقیاس ==========BASE_WIDTH = 1080BASE_HEIGHT = 1920SCALE_X = WIDTH / BASE_WIDTHSCALE_Y = HEIGHT / BASE_HEIGHT
def scale_x(value): return int(value SCALE_X)
def scale_y(value):
return int(value SCALE_Y)
# ========== رنگها ==========WHITE = (255, 255, 255)BLACK = (0, 0, 0)RED = (255, 0, 0)BLUE = (0, 0, 255)GREEN = (0, 255, 0)YELLOW = (255, 255, 0)PURPLE = (128, 0, 128)GRAY = (128, 128, 128)BROWN = (139, 69, 19)GOLD = (255, 215, 0)ORANGE = (255, 165, 0)CYAN = (0, 255, 255)DARK_GREEN = (0, 100, 0) # سبز پررنگ
PLAYER_COLORS = { 0: RED, 1: BLUE, 2: GREEN, 3: YELLOW}
# ========== فونتها ==========def get_font(size): return pygame.font.Font(None, int(size min(SCALE_X, SCALE_Y)))
title_font = get_font(90)
font = get_font(60)
medium_font = get_font(50)
small_font = get_font(40)
tiny_font = get_font(30)
# ========== کلاس شهر ==========
class City:
def __init__(self, name, x, y, owner=None):
self.name = name[:4] + "."
self.x = x
self.y = y
self.owner = owner
self.hp = 250
self.max_hp = 250
self.radius = scale_x(30)
self.mine = None
def draw(self):
color = PLAYER_COLORS[self.owner] if self.owner is not None else GRAY
# سایه
pygame.draw.circle(screen, (50, 50, 50),
(self.x + 3, self.y + 3), self.radius)
# دایره اصلی
pygame.draw.circle(screen, BLACK, (self.x, self.y), self.radius + 1)
pygame.draw.circle(screen, color, (self.x, self.y), self.radius)
# اسم شهر
name_text = tiny_font.render(self.name, True, WHITE)
screen.blit(name_text, (self.x - name_text.get_width()//2,
self.y - self.radius - 25))
# عدد جون
hp_text = font.render(str(self.hp), True, WHITE)
screen.blit(hp_text, (self.x - hp_text.get_width()//2,
self.y - hp_text.get_height()//2))
# آیکون معدن
if self.mine:
mine_symbols = {
"coal": "
"fossil": "
"emerald": "
"gold": "
}
symbol = mine_symbols.get(self.mine, "
mine_text = tiny_font.render(symbol, True, GOLD)
screen.blit(mine_text, (self.x + self.radius - 10, self.y - self.radius + 10))
# شماره بازیکن
if self.owner is not None:
owner_text = tiny_font.render(f"P{self.owner + 1}", True, WHITE)
screen.blit(owner_text, (self.x - owner_text.get_width()//2,
self.y + self.radius + 10))
# ========== کلاس موشک ==========
class Missile:
def __init__(self, x, y, target_city, damage):
self.x = x
self.y = y
self.target = target_city
self.damage = damage
self.progress = 0
self.speed = 0.03
def update(self):
self.progress += self.speed
if self.progress >= 1:
return True
self.x = self.x + (self.target.x - self.x) self.progress self.y = self.y + (self.target.y - self.y) * self.progress return False
def draw(self): pygame.draw.circle(screen, ORANGE, (int(self.x), int(self.y)), scale_x(8)) pygame.draw.circle(screen, YELLOW, (int(self.x), int(self.y)), scale_x(4))
# ========== کلاس بازیکن ==========class Player: def __init__(self, player_id): self.id = player_id self.cities = [] self.coins = 100 self.alive = True
۱۱:۵۰
def add_city(self, city): self.cities.append(city) city.owner = self.id
def remove_city(self, city): if city in self.cities: self.cities.remove(city)
def get_income(self): income = 0 mine_income = { "coal": 2, "fossil": 6, "emerald": 20, "gold": 20 } for city in self.cities: if city.mine: income += mine_income.get(city.mine, 0) return income
# ========== کلاس دکمه ==========class Button: def __init__(self, x, y, w, h, text, color): self.rect = pygame.Rect(scale_x(x), scale_y(y), scale_x(w), scale_y(h)) self.text = text self.color = color
def draw(self): pygame.draw.rect(screen, self.color, self.rect, border_radius=10) pygame.draw.rect(screen, BLACK, self.rect, 2, border_radius=10)
if len(self.text) > 10: text_surf = medium_font.render(self.text, True, WHITE) else: text_surf = font.render(self.text, True, WHITE)
text_rect = text_surf.get_rect(center=self.rect.center) screen.blit(text_surf, text_rect)
def click(self, pos): return self.rect.collidepoint(pos)
# ========== کلاس اصلی بازی ==========class Game: def __init__(self): self.state = "menu" self.players = [] self.cities = [] self.missiles = [] self.num_players = 2 self.current_player = 0 self.selected_city = None self.winner = None self.show_shop = False self.shop_type = None self.waiting_for_city = False self.selected_item = None
# اطلاعات موشکها self.missiles_data = [ {"name": "Rocket 1", "damage": 10, "cost": 20, "color": GRAY}, {"name": "Rocket 2", "damage": 20, "cost": 30, "color": CYAN}, {"name": "Rocket 3", "damage": 50, "cost": 45, "color": ORANGE}, {"name": "Rocket 4", "damage": 60, "cost": 55, "color": RED} ]
# اطلاعات معادن self.mines_data = [ {"name": "Coal", "type": "coal", "income": 2, "cost": 20, "color": BROWN}, {"name": "Fossil", "type": "fossil", "income": 6, "cost": 40, "color": ORANGE}, {"name": "Emerald", "type": "emerald", "income": 20, "cost": 65, "color": GREEN}, {"name": "Gold", "type": "gold", "income": 20, "cost": 85, "color": GOLD} ]
self.create_buttons()
def create_buttons(self): # دکمههای منو - وسط صفحه center_x = 340 self.menu_buttons = [] for i in range(2, 5): btn = Button(center_x, 500 + i * 100, 400, 80, f"{i} Players", BLUE) self.menu_buttons.append((btn, i))
self.start_btn = Button(center_x, 1100, 400, 80, "Start Game", RED)
# دکمههای بازی - پایین صفحه btn_y = 1700 self.missile_btn = Button(50, btn_y, 250, 80, "Missile", PURPLE) self.mine_btn = Button(350, btn_y, 250, 80, "Mine", BROWN) self.end_btn = Button(650, btn_y, 250, 80, "End Turn", GREEN)
self.game_buttons = [self.missile_btn, self.mine_btn, self.end_btn]
# دکمه بستن فروشگاه self.close_btn = Button(center_x, 1500, 400, 80, "Close", RED)
def setup_game(self): self.players = [] self.cities = [] self.missiles = [] self.current_player = 0 self.selected_city = None self.show_shop = False self.waiting_for_city = False self.selected_item = None
for i in range(self.num_players): self.players.append(Player(i))
# اسم شهرها city_names = [ "Tehr.", "Mash.", "Isfa.", "Shir.", "Tabr.", "Kerm.", "Ahva.", "Berl.", "Muni.", "Hamb.", "Colo.", "Fran.", "Stut.", "Dres.", "Lond.", "Manc.", "Live.", "Birm.", "Leed.",
def remove_city(self, city): if city in self.cities: self.cities.remove(city)
def get_income(self): income = 0 mine_income = { "coal": 2, "fossil": 6, "emerald": 20, "gold": 20 } for city in self.cities: if city.mine: income += mine_income.get(city.mine, 0) return income
# ========== کلاس دکمه ==========class Button: def __init__(self, x, y, w, h, text, color): self.rect = pygame.Rect(scale_x(x), scale_y(y), scale_x(w), scale_y(h)) self.text = text self.color = color
def draw(self): pygame.draw.rect(screen, self.color, self.rect, border_radius=10) pygame.draw.rect(screen, BLACK, self.rect, 2, border_radius=10)
if len(self.text) > 10: text_surf = medium_font.render(self.text, True, WHITE) else: text_surf = font.render(self.text, True, WHITE)
text_rect = text_surf.get_rect(center=self.rect.center) screen.blit(text_surf, text_rect)
def click(self, pos): return self.rect.collidepoint(pos)
# ========== کلاس اصلی بازی ==========class Game: def __init__(self): self.state = "menu" self.players = [] self.cities = [] self.missiles = [] self.num_players = 2 self.current_player = 0 self.selected_city = None self.winner = None self.show_shop = False self.shop_type = None self.waiting_for_city = False self.selected_item = None
# اطلاعات موشکها self.missiles_data = [ {"name": "Rocket 1", "damage": 10, "cost": 20, "color": GRAY}, {"name": "Rocket 2", "damage": 20, "cost": 30, "color": CYAN}, {"name": "Rocket 3", "damage": 50, "cost": 45, "color": ORANGE}, {"name": "Rocket 4", "damage": 60, "cost": 55, "color": RED} ]
# اطلاعات معادن self.mines_data = [ {"name": "Coal", "type": "coal", "income": 2, "cost": 20, "color": BROWN}, {"name": "Fossil", "type": "fossil", "income": 6, "cost": 40, "color": ORANGE}, {"name": "Emerald", "type": "emerald", "income": 20, "cost": 65, "color": GREEN}, {"name": "Gold", "type": "gold", "income": 20, "cost": 85, "color": GOLD} ]
self.create_buttons()
def create_buttons(self): # دکمههای منو - وسط صفحه center_x = 340 self.menu_buttons = [] for i in range(2, 5): btn = Button(center_x, 500 + i * 100, 400, 80, f"{i} Players", BLUE) self.menu_buttons.append((btn, i))
self.start_btn = Button(center_x, 1100, 400, 80, "Start Game", RED)
# دکمههای بازی - پایین صفحه btn_y = 1700 self.missile_btn = Button(50, btn_y, 250, 80, "Missile", PURPLE) self.mine_btn = Button(350, btn_y, 250, 80, "Mine", BROWN) self.end_btn = Button(650, btn_y, 250, 80, "End Turn", GREEN)
self.game_buttons = [self.missile_btn, self.mine_btn, self.end_btn]
# دکمه بستن فروشگاه self.close_btn = Button(center_x, 1500, 400, 80, "Close", RED)
def setup_game(self): self.players = [] self.cities = [] self.missiles = [] self.current_player = 0 self.selected_city = None self.show_shop = False self.waiting_for_city = False self.selected_item = None
for i in range(self.num_players): self.players.append(Player(i))
# اسم شهرها city_names = [ "Tehr.", "Mash.", "Isfa.", "Shir.", "Tabr.", "Kerm.", "Ahva.", "Berl.", "Muni.", "Hamb.", "Colo.", "Fran.", "Stut.", "Dres.", "Lond.", "Manc.", "Live.", "Birm.", "Leed.",
۱۱:۵۰
"Glas.", "Edin.", "Rome", "Mila.", "Napl.", "Turi.", "Pale.", "Geno.", "Bolo." ]
# شهرها بالای صفحه start_x = scale_x(150) start_y = scale_y(200) # بالا spacing_x = (WIDTH - 2 start_x) // (self.num_players - 1) if self.num_players > 1 else 300
spacing_y = (HEIGHT - start_y - scale_y(300)) // 6
index = 0
for row in range(7):
for col in range(self.num_players):
if index < len(city_names):
x = start_x + col spacing_x y = start_y + row spacing_y
city = City(city_names[index], x, y, col)
self.players[col].add_city(city)
self.cities.append(city)
index += 1
def handle_touch(self, pos):
if self.state == "menu":
for btn, num in self.menu_buttons:
if btn.click(pos):
self.num_players = num
if self.start_btn.click(pos):
self.state = "playing"
self.setup_game()
elif self.state == "playing":
# اگه منتظر انتخاب شهر هستیم
if self.waiting_for_city:
for city in self.cities:
dx = pos[0] - city.x
dy = pos[1] - city.y
dist = math.hypot(dx, dy)
if dist < city.radius:
self.apply_shop_item(city)
break
return
# اگه فروشگاه بازه
if self.show_shop:
if self.close_btn.click(pos):
self.show_shop = False
self.shop_type = None
else:
self.handle_shop_touch(pos)
return
# دکمههای بازی
if self.missile_btn.click(pos):
self.show_shop = True
self.shop_type = "missile"
elif self.mine_btn.click(pos):
self.show_shop = True
self.shop_type = "mine"
elif self.end_btn.click(pos):
self.end_turn()
else:
# انتخاب شهر
for city in self.cities:
dx = pos[0] - city.x
dy = pos[1] - city.y
dist = math.hypot(dx, dy)
if dist < city.radius:
self.selected_city = city
break
elif self.state == "gameover":
self.state = "menu"
def handle_shop_touch(self, pos):
current = self.players[self.current_player]
if self.shop_type == "missile":
for i, missile in enumerate(self.missiles_data):
btn_rect = pygame.Rect(
scale_x(340),
scale_y(400 + i 100), scale_x(400), scale_y(70) ) if btn_rect.collidepoint(pos): if current.coins >= missile["cost"]: self.selected_item = missile self.waiting_for_city = True self.show_shop = False
elif self.shop_type == "mine": for i, mine in enumerate(self.mines_data): btn_rect = pygame.Rect( scale_x(340), scale_y(400 + i * 100), scale_x(400), scale_y(70) ) if btn_rect.collidepoint(pos): if current.coins >= mine["cost"]: self.selected_item = mine self.waiting_for_city = True self.show_shop = False
def apply_shop_item(self, city): current = self.players[self.current_player]
if self.selected_item: if "damage" in sel
# شهرها بالای صفحه start_x = scale_x(150) start_y = scale_y(200) # بالا spacing_x = (WIDTH - 2 start_x) // (self.num_players - 1) if self.num_players > 1 else 300
spacing_y = (HEIGHT - start_y - scale_y(300)) // 6
index = 0
for row in range(7):
for col in range(self.num_players):
if index < len(city_names):
x = start_x + col spacing_x y = start_y + row spacing_y
city = City(city_names[index], x, y, col)
self.players[col].add_city(city)
self.cities.append(city)
index += 1
def handle_touch(self, pos):
if self.state == "menu":
for btn, num in self.menu_buttons:
if btn.click(pos):
self.num_players = num
if self.start_btn.click(pos):
self.state = "playing"
self.setup_game()
elif self.state == "playing":
# اگه منتظر انتخاب شهر هستیم
if self.waiting_for_city:
for city in self.cities:
dx = pos[0] - city.x
dy = pos[1] - city.y
dist = math.hypot(dx, dy)
if dist < city.radius:
self.apply_shop_item(city)
break
return
# اگه فروشگاه بازه
if self.show_shop:
if self.close_btn.click(pos):
self.show_shop = False
self.shop_type = None
else:
self.handle_shop_touch(pos)
return
# دکمههای بازی
if self.missile_btn.click(pos):
self.show_shop = True
self.shop_type = "missile"
elif self.mine_btn.click(pos):
self.show_shop = True
self.shop_type = "mine"
elif self.end_btn.click(pos):
self.end_turn()
else:
# انتخاب شهر
for city in self.cities:
dx = pos[0] - city.x
dy = pos[1] - city.y
dist = math.hypot(dx, dy)
if dist < city.radius:
self.selected_city = city
break
elif self.state == "gameover":
self.state = "menu"
def handle_shop_touch(self, pos):
current = self.players[self.current_player]
if self.shop_type == "missile":
for i, missile in enumerate(self.missiles_data):
btn_rect = pygame.Rect(
scale_x(340),
scale_y(400 + i 100), scale_x(400), scale_y(70) ) if btn_rect.collidepoint(pos): if current.coins >= missile["cost"]: self.selected_item = missile self.waiting_for_city = True self.show_shop = False
elif self.shop_type == "mine": for i, mine in enumerate(self.mines_data): btn_rect = pygame.Rect( scale_x(340), scale_y(400 + i * 100), scale_x(400), scale_y(70) ) if btn_rect.collidepoint(pos): if current.coins >= mine["cost"]: self.selected_item = mine self.waiting_for_city = True self.show_shop = False
def apply_shop_item(self, city): current = self.players[self.current_player]
if self.selected_item: if "damage" in sel
۱۱:۵۰
f.selected_item: # موشک if city.owner != self.current_player: # شهر دشمن current.coins -= self.selected_item["cost"] new_missile = Missile( city.x, city.y - 50, city, self.selected_item["damage"] ) self.missiles.append(new_missile) else: # معدن if city.owner == self.current_player and city.mine is None: current.coins -= self.selected_item["cost"] city.mine = self.selected_item["type"]
self.waiting_for_city = False self.selected_item = None self.selected_city = None
def end_turn(self): current = self.players[self.current_player] current.coins += current.get_income()
self.current_player = (self.current_player + 1) % self.num_players
while not self.players[self.current_player].alive: self.current_player = (self.current_player + 1) % self.num_players
self.selected_city = None self.show_shop = False self.waiting_for_city = False self.selected_item = None
alive = [p for p in self.players if p.alive] if len(alive) == 1: self.winner = alive[0] self.state = "gameover"
def update(self): if self.state != "playing": return
for missile in self.missiles[:]: if missile.update(): missile.target.hp -= missile.damage
if missile.target.hp <= 0: old_owner = missile.target.owner missile.target.hp = 250 missile.target.owner = self.current_player
self.players[self.current_player].coins += 30
if old_owner is not None: self.players[old_owner].remove_city(missile.target) self.players[self.current_player].add_city(missile.target) missile.target.mine = None
self.missiles.remove(missile)
for player in self.players: if len(player.cities) == 0: player.alive = False
def draw_menu(self): screen.fill(DARK_GREEN)
title = title_font.render("WORLD WAR", True, GOLD) screen.blit(title, (WIDTH//2 - title.get_width()//2, 200))
for btn, _ in self.menu_buttons: btn.draw()
self.start_btn.draw()
def draw_game(self): screen.fill(DARK_GREEN)
# خطوط بین شهرها for player in self.players: if len(player.cities) > 1: color = PLAYER_COLORS[player.id] for i in range(len(player.cities)): for j in range(i+1, len(player.cities)): c1 = player.cities[i] c2 = player.cities[j] pygame.draw.line(screen, color, (c1.x, c1.y), (c2.x, c2.y), 2)
# شهرها for city in self.cities: city.draw()
# موشکها for missile in self.missiles: missile.draw()
# اطلاعات بازیکن current = self.players[self.current_player]
# P1 بالا چپ player_text = font.render(f"P{self.current_player + 1}", True, PLAYER_COLORS[self.current_player]) screen.blit(player_text, (30, 30))
# سکه coin_text = font.render(str(current.coins), True, GOLD) screen.blit(coin_text, (30, 90))
# تعداد شهر city_count = font.render(str(len(current.cities)), True, WHITE) screen.blit(city_count, (30, 150))
# دکمههای بازی for btn in self.game_buttons: btn.draw()
# فروشگاه
self.waiting_for_city = False self.selected_item = None self.selected_city = None
def end_turn(self): current = self.players[self.current_player] current.coins += current.get_income()
self.current_player = (self.current_player + 1) % self.num_players
while not self.players[self.current_player].alive: self.current_player = (self.current_player + 1) % self.num_players
self.selected_city = None self.show_shop = False self.waiting_for_city = False self.selected_item = None
alive = [p for p in self.players if p.alive] if len(alive) == 1: self.winner = alive[0] self.state = "gameover"
def update(self): if self.state != "playing": return
for missile in self.missiles[:]: if missile.update(): missile.target.hp -= missile.damage
if missile.target.hp <= 0: old_owner = missile.target.owner missile.target.hp = 250 missile.target.owner = self.current_player
self.players[self.current_player].coins += 30
if old_owner is not None: self.players[old_owner].remove_city(missile.target) self.players[self.current_player].add_city(missile.target) missile.target.mine = None
self.missiles.remove(missile)
for player in self.players: if len(player.cities) == 0: player.alive = False
def draw_menu(self): screen.fill(DARK_GREEN)
title = title_font.render("WORLD WAR", True, GOLD) screen.blit(title, (WIDTH//2 - title.get_width()//2, 200))
for btn, _ in self.menu_buttons: btn.draw()
self.start_btn.draw()
def draw_game(self): screen.fill(DARK_GREEN)
# خطوط بین شهرها for player in self.players: if len(player.cities) > 1: color = PLAYER_COLORS[player.id] for i in range(len(player.cities)): for j in range(i+1, len(player.cities)): c1 = player.cities[i] c2 = player.cities[j] pygame.draw.line(screen, color, (c1.x, c1.y), (c2.x, c2.y), 2)
# شهرها for city in self.cities: city.draw()
# موشکها for missile in self.missiles: missile.draw()
# اطلاعات بازیکن current = self.players[self.current_player]
# P1 بالا چپ player_text = font.render(f"P{self.current_player + 1}", True, PLAYER_COLORS[self.current_player]) screen.blit(player_text, (30, 30))
# سکه coin_text = font.render(str(current.coins), True, GOLD) screen.blit(coin_text, (30, 90))
# تعداد شهر city_count = font.render(str(len(current.cities)), True, WHITE) screen.blit(city_count, (30, 150))
# دکمههای بازی for btn in self.game_buttons: btn.draw()
# فروشگاه
۱۱:۵۰
if self.show_shop: # صفحه سیاه overlay = pygame.Surface((WIDTH, HEIGHT)) overlay.set_alpha(200) overlay.fill((0, 0, 0)) screen.blit(overlay, (0, 0))
# پنجره فروشگاه shop_rect = pygame.Rect(scale_x(200), scale_y(200), scale_x(680), scale_y(1200)) pygame.draw.rect(screen, (50, 50, 80), shop_rect, border_radius=20) pygame.draw.rect(screen, GOLD, shop_rect, 5, border_radius=20)
title = font.render(f"{self.shop_type.upper()} SHOP", True, GOLD) screen.blit(title, (WIDTH//2 - title.get_width()//2, scale_y(250)))
coins_text = medium_font.render(f"Coins: {current.coins}", True, GOLD) screen.blit(coins_text, (WIDTH//2 - coins_text.get_width()//2, scale_y(320)))
if self.shop_type == "missile": for i, missile in enumerate(self.missiles_data): y_pos = 400 + i 100
btn_rect = pygame.Rect(
scale_x(340),
scale_y(y_pos),
scale_x(400),
scale_y(70)
)
if current.coins >= missile["cost"]:
color = missile["color"]
else:
color = GRAY
pygame.draw.rect(screen, color, btn_rect, border_radius=10)
pygame.draw.rect(screen, BLACK, btn_rect, 2, border_radius=10)
text = f"{missile['name']} - {missile['damage']} - {missile['cost']}
"
text_surf = medium_font.render(text, True, WHITE)
screen.blit(text_surf, (btn_rect.x + 30, btn_rect.y + 20))
elif self.shop_type == "mine":
for i, mine in enumerate(self.mines_data):
y_pos = 400 + i 100 btn_rect = pygame.Rect( scale_x(340), scale_y(y_pos), scale_x(400), scale_y(70) )
if current.coins >= mine["cost"]: color = mine["color"] else: color = GRAY
pygame.draw.rect(screen, color, btn_rect, border_radius=10) pygame.draw.rect(screen, BLACK, btn_rect, 2, border_radius=10)
text = f"{mine['name']} - +{mine['income']}
- {mine['cost']}
" text_surf = medium_font.render(text, True, WHITE) screen.blit(text_surf, (btn_rect.x + 30, btn_rect.y + 20))
self.close_btn.draw()
# پیام راهنما if self.waiting_for_city: if self.selected_item and "damage" in self.selected_item: msg = "Select enemy city" else: msg = "Select your city"
msg_text = font.render(msg, True, YELLOW) screen.blit(msg_text, (WIDTH//2 - msg_text.get_width()//2, HEIGHT//2 - 100))
def draw_gameover(self): screen.fill(BLACK) if self.winner: text = title_font.render(f"Player {self.winner.id + 1} Wins!", True, PLAYER_COLORS[self.winner.id]) screen.blit(text, (WIDTH//2 - text.get_width()//2, HEIGHT//2 - 50))
tap = font.render("Tap to continue", True, WHITE) screen.blit(tap, (WIDTH//2 - tap.get_width()//2, HEIGHT//2 + 50))
def draw(self): if self.state == "menu": self.draw_menu() elif self.state == "playing": self.draw_game() elif self.state == "gameover": self.draw_gameover()
pygame.display.update()
# ========== اجرا ==========game = Game()running =
# پنجره فروشگاه shop_rect = pygame.Rect(scale_x(200), scale_y(200), scale_x(680), scale_y(1200)) pygame.draw.rect(screen, (50, 50, 80), shop_rect, border_radius=20) pygame.draw.rect(screen, GOLD, shop_rect, 5, border_radius=20)
title = font.render(f"{self.shop_type.upper()} SHOP", True, GOLD) screen.blit(title, (WIDTH//2 - title.get_width()//2, scale_y(250)))
coins_text = medium_font.render(f"Coins: {current.coins}", True, GOLD) screen.blit(coins_text, (WIDTH//2 - coins_text.get_width()//2, scale_y(320)))
if self.shop_type == "missile": for i, missile in enumerate(self.missiles_data): y_pos = 400 + i 100
btn_rect = pygame.Rect(
scale_x(340),
scale_y(y_pos),
scale_x(400),
scale_y(70)
)
if current.coins >= missile["cost"]:
color = missile["color"]
else:
color = GRAY
pygame.draw.rect(screen, color, btn_rect, border_radius=10)
pygame.draw.rect(screen, BLACK, btn_rect, 2, border_radius=10)
text = f"{missile['name']} - {missile['damage']} - {missile['cost']}
text_surf = medium_font.render(text, True, WHITE)
screen.blit(text_surf, (btn_rect.x + 30, btn_rect.y + 20))
elif self.shop_type == "mine":
for i, mine in enumerate(self.mines_data):
y_pos = 400 + i 100 btn_rect = pygame.Rect( scale_x(340), scale_y(y_pos), scale_x(400), scale_y(70) )
if current.coins >= mine["cost"]: color = mine["color"] else: color = GRAY
pygame.draw.rect(screen, color, btn_rect, border_radius=10) pygame.draw.rect(screen, BLACK, btn_rect, 2, border_radius=10)
text = f"{mine['name']} - +{mine['income']}
self.close_btn.draw()
# پیام راهنما if self.waiting_for_city: if self.selected_item and "damage" in self.selected_item: msg = "Select enemy city" else: msg = "Select your city"
msg_text = font.render(msg, True, YELLOW) screen.blit(msg_text, (WIDTH//2 - msg_text.get_width()//2, HEIGHT//2 - 100))
def draw_gameover(self): screen.fill(BLACK) if self.winner: text = title_font.render(f"Player {self.winner.id + 1} Wins!", True, PLAYER_COLORS[self.winner.id]) screen.blit(text, (WIDTH//2 - text.get_width()//2, HEIGHT//2 - 50))
tap = font.render("Tap to continue", True, WHITE) screen.blit(tap, (WIDTH//2 - tap.get_width()//2, HEIGHT//2 + 50))
def draw(self): if self.state == "menu": self.draw_menu() elif self.state == "playing": self.draw_game() elif self.state == "gameover": self.draw_gameover()
pygame.display.update()
# ========== اجرا ==========game = Game()running =
۱۱:۵۰
True
while running: clock.tick(60)
for event in pygame.event.get(): if event.type == pygame.QUIT: running = False
if event.type == pygame.MOUSEBUTTONDOWN: game.handle_touch(event.pos)
game.update() game.draw()
pygame.quit()
while running: clock.tick(60)
for event in pygame.event.get(): if event.type == pygame.QUIT: running = False
if event.type == pygame.MOUSEBUTTONDOWN: game.handle_touch(event.pos)
game.update() game.draw()
pygame.quit()
۱۱:۵۰
شاید زیاد جالب نباشهولی خب نسخه ی اولش هست
۱۱:۵۰