幸存者游戏(类)

#include <iostream>
#include <graphics.h>
#include <stdio.h>
#include <conio.h>
#include <vector>
#include <string>
using namespace std;

int idx_player_anim = 0;
const int player_anim_num = 6;//这里要把动画帧数定位const int才能放入数组括号中,int不行
IMAGE img_player_left[player_anim_num];
IMAGE img_player_right[player_anim_num];
POINT player_pos = { 500,500 };
int player_speed = 10;

#pragma comment(lib,"MSIMG32.LIB")//putimage不能处理透明度,要弄个能处理透明度的putimage函数
inline void putimage_alpha(int x, int y, IMAGE* img)
{
    int w = img->getwidth();
    int h = img->getheight();
    AlphaBlend(GetImageHDC(NULL), x, y, w, h, GetImageHDC(img), 0, 0, w, h, { AC_SRC_OVER,0,255,AC_SRC_ALPHA });
}


class Animation
{
public:
    Animation(LPCTSTR path, int num, int interval)//构造函数实现loadimage
    {
        interval_ms = interval;

        TCHAR path_file[256];
        for (size_t i = 0; i < num; i++)
        {
            _stprintf_s(path_file, path, i);
            IMAGE* frame = new IMAGE();
            loadimage(frame, path_file);
            frame_list.push_back(frame);
        }
    }
    ~Animation()
    {
        for (size_t i = 0; i < frame_list.size(); i++)
            delete frame_list[i];
    }
    void play(int x, int y, int delta)//实现putiamge
    {
        timer += delta;
        if (timer > interval_ms)
        {
            idx_frame = (idx_frame + 1) % player_anim_num;
            timer = 0;
        }
        putimage_alpha(x, y, frame_list[idx_frame]);
    }
private:
    int timer = 0;
    int idx_frame = 0;
    int interval_ms = 0;
    vector<IMAGE*> frame_list;
};//别漏;
Animation anim_left_player(_T("img/player_left_%d.png"), 6, 45);
Animation anim_right_player(_T("img/player_right_%d.png"), 6, 45);


int main()
{
    initgraph(1280, 720);
    IMAGE img_background;
    loadimage(&img_background, _T("img/background.png"));
    

    bool running = true;
    bool is_up = false;
    bool is_down = false;
    bool is_left = false;
    bool is_right = false;
    bool turn_left = true;
    bool turn_right = false;

    ExMessage msg;
    BeginBatchDraw();
    while (running)
    {
        DWORD start_time = GetTickCount();
        while (peekmessage(&msg))
        {
            if (msg.message == WM_KEYDOWN)
            {
                switch (msg.vkcode)
                {
                case VK_UP:
                    is_up = true;
                    break;
                case VK_DOWN:
                    is_down = true;
                    break;
                case VK_LEFT:
                    is_left = true;
                    turn_left = true;
                    turn_right = false;
                    break;
                case VK_RIGHT:
                    is_right = true;
                    turn_left = false;
                    turn_right = true;
                    break;
                }
            }
            if (msg.message == WM_KEYUP)
            {
                switch (msg.vkcode)
                {
                case VK_UP:
                    is_up = false;
                    break;
                case VK_DOWN:
                    is_down = false;
                    break;
                case VK_LEFT:
                    is_left = false;
                    break;
                case VK_RIGHT:
                    is_right = false;
                    break;
                }
            }
        }
        if (is_up) player_pos.y -= player_speed;
        if (is_down) player_pos.y += player_speed;
        if (is_left) player_pos.x -= player_speed;
        if (is_right) player_pos.x += player_speed;

        cleardevice();

        static int counter = 0;
        if (++counter % 5 == 0)
            idx_player_anim++;
        idx_player_anim = idx_player_anim % player_anim_num;
        putimage_alpha(0, 0, &img_background);
        if(turn_left) anim_left_player.play(player_pos.x, player_pos.y, 10);
        if(turn_right)anim_right_player.play(player_pos.x, player_pos.y, 10);
        

        FlushBatchDraw();

        DWORD end_time = GetTickCount();
        DWORD delta_time = end_time - start_time;
        if (delta_time < 1000 / 144)
        {
            Sleep(1000 / 144 - delta_time);
        }
    }
    EndBatchDraw();

    return 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值