游戏幸存者学习VC源码

#include <ctime>
#include <easyx.h>
#include <list>
#include <stdio.h>
#include "header.h"

// 初始化
void InitGame();
// 绘制
void DrawGame();
// 更新
void UpdateGame();

// 定义武器的对象
struct FWeapon
{
    // 旋转角度
    float angle;
    // 旋转速度
    float speed;
    // 半径
    float radius;
    // 位置
    FVector location;
};

// 定义敌人对象
struct FEnemy
{
    // 移动速度
    float speed;
    // 方向
    int direction;
    // 位置
    FVector location;
    // 动画当前帧
    int current_anim;
};

// 背景图片
IMAGE bg_img;
// 玩家图片
IMAGE player_left[6];
IMAGE player_right[6];
// 定义玩家位置
FVector player_location;
// 定义玩家当前帧
int player_current_anim;
// 定义玩家当前方向
int player_direction;
// 定义玩家速度
float player_speed;

// 定义一个武器链表
std::list<FWeapon> weapon_list;

// 定义敌人图片
IMAGE enemy_left[6];
IMAGE enemy_right[6];
// 定义敌人链表
std::list<FEnemy> enemy_list;

FRectangle weapon_getBoundingBox(FWeapon weapon)
{
    return FRectangle(weapon.location.x - weapon.radius, weapon.location.y - weapon.radius, weapon.radius * 2, weapon.radius * 2);
}

FRectangle enemy_getBoundingBox(FEnemy enemy)
{
    return FRectangle(enemy.location.x, enemy.location.y, enemy_left[0].getwidth(), enemy_left->getheight());
}

int main()
{
    // 初始化随机数种子
    srand(time(NULL));

    initgraph(1280, 720, EX_SHOWCONSOLE);

    float FPS = 1000 / 60;
    InitGame();
    bool is_run = true;
    while (true)
    {
        DWORD start_time = GetCurrentTime();

        if (is_run == true)
        {
            DrawGame();
            UpdateGame();
        }

        DWORD end_time = GetCurrentTime();
        DWORD delay_time = end_time - start_time;

        if (delay_time < FPS)
        {
            Sleep(FPS - delay_time);
        }
    }

    return 0;
}

void InitGame()
{
    // 加载背景图片
    loadimage(&bg_img, TEXT("img/Background.png"));
    // 加载玩家图片
    for (int i = 0; i < 6; i++)
    {
        TCHAR player_left_path[MAX_PATH] = { 0 };
        TCHAR player_right_path[MAX_PATH] = { 0 };
        wsprintf(player_left_path, TEXT("img/player_left_%d.png"), i);
        wsprintf(player_right_path, TEXT("img/player_right_%d.png"), i);
        loadimage(&player_left[i], player_left_path);
        loadimage(&player_right[i], player_right_path);
    }
    // 初始化玩家的位置
    player_location = FVector(500, 500);
    // 初始化玩家当前帧
    player_current_anim = 0;
    // 初始化玩家当前方向
    player_direction = 0;// 0表示左 1表示右
    // 初始化玩家速度
    player_speed = 5;

    // 初始化一个武器
    FWeapon weapon;
    weapon.angle = 0;
    weapon.speed = 5;
    weapon.radius = 20;
    FVector player_center = player_location + FVector(player_left[0].getwidth() * 0.5, player_left[0].getheight() * 0.5);
    weapon.location = rotatePoint(FVector(player_center.x, player_center.y - 100), player_center, weapon.angle);
    weapon_list.push_back(weapon);

    // 加载敌人图片
    for (int i = 0; i < 6; i++)
    {
        TCHAR enemy_left_path[MAX_PATH] = { 0 };
        TCHAR enemy_right_path[MAX_PATH] = { 0 };
        wsprintf(enemy_left_path, TEXT("img/enemy_left_%d.png"), i);
        wsprintf(enemy_right_path, TEXT("img/enemy_right_%d.png"), i);
        loadimage(&enemy_left[i], enemy_left_path);
        loadimage(&enemy_right[i], enemy_right_path);
    }

    // 初始化敌人
    for (int i = 0; i < 10; i++)
    {
        FEnemy enemy;
        enemy.speed = 2;
        enemy.direction = 0;
        enemy.location.x = rand() % 1280;
        enemy.location.y = rand() % 720;
        enemy.current_anim = 0;
        enemy_list.push_back(enemy);
    }
}

void DrawGame()
{
    BeginBatchDraw();

    // 输出背景图片
    putimage(0, 0, &bg_img);
    // 输出玩家图片
    if (player_direction == 0)putimage_alpha(player_location.x, player_location.y, &player_left[player_current_anim]);
    else putimage_alpha(player_location.x, player_location.y, &player_right[player_current_anim]);

    // 输出武器
    setfillcolor(RED);
    for (FWeapon weapon : weapon_list)
        fillcircle(weapon.location.x, weapon.location.y, weapon.radius);

    // 显示敌人
    for (FEnemy enemy : enemy_list)
    {
        if (enemy.direction == 0)putimage_alpha(enemy.location.x, enemy.location.y, &enemy_left[enemy.current_anim]);
        else putimage_alpha(enemy.location.x, enemy.location.y, &enemy_right[enemy.current_anim]);
    }

    EndBatchDraw();
}

void UpdateGame()
{
    // 玩家的动画
    player_current_anim++;
    if (player_current_anim >= 6)
        player_current_anim = 0;
    // 敌人的动画
    for (FEnemy& enemy : enemy_list)
    {
        enemy.current_anim++;
        if (enemy.current_anim >= 6)
            enemy.current_anim = 0;
    }

    // 玩家的移动
    if (GetAsyncKeyState('W'))player_location.y -= player_speed;
    if (GetAsyncKeyState('S'))player_location.y += player_speed;
    if (GetAsyncKeyState('A')) { player_location.x -= player_speed; player_direction = 0; }
    if (GetAsyncKeyState('D')) { player_location.x += player_speed; player_direction = 1; }

    FVector player_center = player_location + FVector(player_left[0].getwidth() * 0.5, player_left[0].getheight() * 0.5);
    // 武器围绕主角旋转
    for (FWeapon& weapon : weapon_list)
    {
        weapon.angle += weapon.speed;
        weapon.location = rotatePoint(FVector(player_center.x, player_center.y - 100), player_center, weapon.angle);
    }

    // 敌人的移动
    for (FEnemy& enemy : enemy_list)
    {
        FVector enemy_center = enemy.location + FVector(enemy_left[0].getwidth() * 0.5, enemy_left[0].getheight() * 0.5);
        FVector enemy_move_direction = FVector::unitization(player_center - enemy_center);
        if (enemy_move_direction.dot(FVector(1, 0)) > 0)enemy.direction = 1;
        else enemy.direction = 0;
        enemy.location += enemy_move_direction * enemy.speed;
    }

    // 攻击敌人
    std::list<FEnemy>::iterator enemy_list_iterator, temp;
    int weapon_num = weapon_list.size();
    for (FWeapon weapon : weapon_list)
    {
        FRectangle weapon_BoundingBox = weapon_getBoundingBox(weapon);
        for (enemy_list_iterator = enemy_list.begin(); enemy_list_iterator != enemy_list.end(); )
        {
            if (weapon_BoundingBox.isOverlay(enemy_getBoundingBox(*enemy_list_iterator)))
            {
                temp = enemy_list_iterator;
                enemy_list_iterator++;
                enemy_list.erase(temp);
                if (weapon_num < 5)
                    weapon_num++;
            }
            else
            {
                enemy_list_iterator++;
            }
        }
    }
    int need_weapon_num = weapon_num - weapon_list.size();
    bool is = false;
    for (int i = 0; i < need_weapon_num; i++)
    {
        FWeapon weapon;
        weapon.angle = 0;
        weapon.speed = 5;
        weapon.radius = 20;
        weapon_list.push_back(weapon);
        is = true;
    }

    if (is)
    {
        int j = 0;
        for (FWeapon& weapon : weapon_list)
        {
            weapon.angle = j * (360 / weapon_list.size());
            FVector player_center = player_location + FVector(player_left[0].getwidth() * 0.5, player_left[0].getheight() * 0.5);
            weapon.location = rotatePoint(FVector(player_center.x, player_center.y - 100), player_center, weapon.angle);
            j++;
        }
    }


    // 补充敌人
    int need_enemy_num = 10 - enemy_list.size();
    for (int i = 0; i < need_enemy_num; i++)
    {
        FEnemy enemy;
        enemy.speed = 2;
        enemy.direction = 0;

        enemy.location.x = (rand() % 2) ? (-rand() % 400) : (1280 + rand() % 400);
        enemy.location.y = (rand() % 2) ? (-rand() % 200) : (720 + rand() % 200);
        enemy.current_anim = 0;
        enemy_list.push_back(enemy);
    }
}

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
幸存者游戏是一种非常有趣的游戏。下面是一个简单的幸存者游戏的Tkinter代码实现,具体规则如下: 1. 游戏开始时,有10个玩家,每个玩家有100点生命值。 2. 每个回合开始时,每个玩家都要扣除1~10点生命值,生命值为0的玩家被淘汰。 3. 在每个回合结束时,生命值最高的玩家获得10分,生命值第二高的玩家获得5分,其他玩家没有得分。 4. 游戏一直进行到最后只剩下一个玩家为止,该玩家获得胜利。 代码如下: ```python import random import tkinter as tk class SurvivorGame: def __init__(self): self.players = [] self.turn = 1 self.winner = None # 创建玩家 for i in range(10): self.players.append({ "name": f"Player {i + 1}", "health": 100, "score": 0 }) def play_turn(self): self.log(f"Turn {self.turn} begins.") # 每个玩家扣除生命值 for player in self.players: damage = random.randint(1, 10) player["health"] -= damage if player["health"] <= 0: self.log(f"{player['name']} gets eliminated!") # 计算得分 sorted_players = sorted(self.players, key=lambda x: x["health"], reverse=True) sorted_players[0]["score"] += 10 sorted_players[1]["score"] += 5 # 判断是否结束游戏 alive_players = [p for p in self.players if p["health"] > 0] if len(alive_players) == 1: self.winner = alive_players[0] self.log(f"{self.winner['name']} wins the game!") return # 打印玩家状态 for player in self.players: self.log(f"{player['name']} - health: {player['health']}, score: {player['score']}") self.turn += 1 def log(self, message): textbox.insert(tk.END, f"{message}\n") textbox.see(tk.END) # 创建游戏实例 game = SurvivorGame() # 创建窗口 window = tk.Tk() window.title("Survivor Game") # 创建游戏日志文本框 textbox = tk.Text(window) textbox.pack() # 创建开始游戏按钮 start_button = tk.Button(window, text="Start Game", command=game.play_turn) start_button.pack() window.mainloop() ``` 在上面的代码中,我们首先创建了一个 `SurvivorGame` 类,该类包含了游戏中的所有逻辑。在 `__init__` 方法中,我们创建了10个玩家,每个玩家有100点生命值和0分得分。在 `play_turn` 方法中,我们模拟了每个回合的游戏逻辑。首先,每个玩家会扣除1~10点生命值,如果生命值变为0或更低,该玩家将被淘汰。然后,我们计算生命值最高的两个玩家的得分,并打印每个玩家的状态。最后,我们检查是否只剩下一个玩家,如果是,该玩家将获得胜利。在 `log` 方法中,我们将游戏日志输出到文本框中。在代码的最后,我们创建了一个Tkinter窗口,并在窗口中添加了一个文本框和一个开始游戏按钮。当玩家点击开始游戏按钮时,游戏将开始运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

!chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值