战棋游戏 {游戏模拟+spfa}

原创 2016年10月30日 00:28:26
  • 【题目描述】

这里写图片描述
这里写图片描述
这里写图片描述

  • 【Input Format】

这里写图片描述

  • 【Output Format】

这里写图片描述

  • 【Sample Input】
    5 5 4 12
    1 9 1 4 4
    1 9 1 2 4
    1 9 1 1 2
    2 9 2 7 3
    2 3 2 6 1
    10 5 8 1 3 1 1 0
    20 10 5 1 2 2 1 0
    19 10 5 1 2 5 2 1
    25 25 3 1 1 5 5 0
    Round of 0
    Action of character 2
    Move to (5,1)
    Attack 3
    Action of character 1
    Move to (3,1)
    Round of 1
    Action of character 3
    Drive out 1
    Round of 0
    Action of character 2
    Drive out 3

  • 【Sample Output】
    0
    9
    6
    INVALID
    -1

  • 【数据规模与约定】
    对于80%的数据,不存在不合法事件。
    对于100%的数据,参见输入输出格式中给定的范围与保证。


【题解】模拟啊模拟 // 近几年复赛喜欢出的模拟题QAQ
{细节一}死掉的角色必须将其所有信息清空好,以免干扰后续行动;
{细节二}图上的点相当于有点权,必须用spfa而非广搜;spfa时记得判断移动力清零情况及边界问题;
{细节三}C++读入时要格外小心,听说好多god直接用读入优化,我就默默写了个长长的读入QAQ;
{细节四}如果某角色移动前后位置不变,即使它旁边存在其他阵营角色,其剩余行动力为初始行动力;
{细节五}大概没了有了再说呗。。。
//还是看程序吧哎TAT


#include <cstdio>
#include <cstring>
#define N 105
#define inf 1000000000
const int fx[4][2]={{0,-1},{0,1},{-1,0},{1,0}};
int n,m,c,e,x,Gr,hp[N],at[N],mv[N],ad[N][2],st[N][2],gr[N],
    a[N][N],q[N*N*100][2],g[N][N],op[10005][2],f[N][N];
bool bo[N][N],die[N];char s[10005][3];
    int bfs(int sx,int sy,int tx,int ty,int be,int ss)
    {
        for (int i=1;i<=n;++i)
            for (int j=1;j<=m;++j) bo[i][j]=false;
        for (int i=1;i<=n;++i)
            for (int j=1;j<=m;++j) f[i][j]=-inf;
        int h=1,t=1;f[sx][sy]=ss;
        for (bo[q[1][0]=sx][q[1][1]=sy]=true;h<=t;bo[q[h][0]][q[h++][1]]=false)
            for (int i=0;i<4;++i)
            {
                int xx=q[h][0]+fx[i][0],
                    yy=q[h][1]+fx[i][1];
                if (!xx || !yy || xx>n || yy>m || a[xx][yy] || 
                    f[q[h][0]][q[h][1]]<g[xx][yy]) continue;
                if (f[xx][yy]>=f[q[h][0]][q[h][1]]-g[xx][yy]) continue;
                bool boo=true;
                for (int j=0;j<4;++j)
                {
                    int xxx=xx+fx[j][0],yyy=yy+fx[j][1];
                    if (!xxx || !yyy || xxx>n || yyy>m || !a[xxx][yyy]) continue;
                    if (gr[a[xxx][yyy]]==be) boo=false;
                }
                if (!boo)
                {
                    f[xx][yy]=0;continue;
                }
                f[xx][yy]=f[q[h][0]][q[h][1]]-g[xx][yy];
                if (!bo[xx][yy]) bo[q[++t][0]=xx][q[t][1]=yy]=true;
            }
        return f[tx][ty];
    }
    int abs(int x){ return x>=0?x:-x;}
int main()
{
    scanf("%d%d%d%d\n",&n,&m,&c,&e);
    for (int i=1;i<=n;++i)
        for (int j=1;j<=m;++j) scanf("%d",&g[i][j]);
    for (int i=1;i<=n;++i)
        for (int j=1;j<=m;++j) a[i][j]=0;
    for (int i=1;i<=c;++i)
    {
        scanf("%d%d%d%d%d%d%d%d\n",&hp[i],&at[i],&mv[i],
            &ad[i][0],&ad[i][1],&st[i][0],&st[i][1],&gr[i]);
        a[st[i][0]][st[i][1]]=i;
    }
    for (int i=1;i<=e;++i) 
    {
        int len;
        scanf("%c",&s[i][1]);
        char ch=s[i][1];
        if (ch=='R') len=9;
        if (ch=='M') len=9;
        if (ch=='D') len=10;
        if (ch=='A')
        {
            scanf("%c",&s[i][2]);
            if (s[i][2]=='c') len=20;
            else len=7;
        }
        if (ch=='A') for (int j=3;j<=len;++j) scanf("%c",&ch);
        else for (int j=2;j<=len;++j) scanf("%c",&ch);
        if (s[i][1]=='M') 
        scanf("%d,%d)",&op[i][0],&op[i][1]);
        else scanf("%d",&op[i][0]);
        scanf("\n");
    }
    for (int i=1;i<=e;++i)
    {
        for (;i<=e && s[i][1]=='R';++i) Gr=op[i][0];
        for (;i<=e && s[i][1]=='A' && s[i][2]=='c';++i) x=op[i][0];
        if (i>e) break;
        if (x && s[i][1]=='R'){ --i;continue;}
        if (die[x]){ printf("INVALID\n");continue;} 
        if (x && s[i][1]=='M')
        {
            int xt=op[i][0],yt=op[i][1],j;
            if (xt==st[x][0] && yt==st[x][1]) 
            {
                printf("%d\n",mv[x]);continue;
            }
            int cost=bfs(st[x][0],st[x][1],xt,yt,1-Gr,mv[x]);
            if (cost<0) printf("INVALID\n");
            else 
            {
                printf("%d\n",cost);
                a[st[x][0]][st[x][1]]=0;
                a[st[x][0]=xt][st[x][1]=yt]=x;
            }
        }
        if (x && (s[i][1]=='A' || s[i][1]=='D'))
        {
            int y=op[i][0],dis=abs(st[x][0]-st[y][0])+abs(st[x][1]-st[y][1]);
            if (dis>=ad[x][0] && dis<=ad[x][1] && gr[y]!=gr[x])
            {
                int hpp=hp[y]-at[x];
                if ((hpp>0)==(s[i][1]=='A'))
                {
                    hp[y]-=at[x];
                    printf("%d\n",hp[y]);
                    if (hp[y]<=0)
                    {
                        a[st[y][0]][st[y][1]]=0;
                        die[y]=true;
                    } 
                }
                else printf("INVALID\n");
            }
            else printf("INVALID\n");
        }
    }
    return 0; 
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

策略战棋游戏开发计划

这个计划完全出于个人兴趣。我自己喜欢战棋游戏,但是现在好像完全没有新的此类游戏发布了,还我SSI!虽然网上有一些修改版在更新,比如曹操传,比如h3wog,但总是缺乏新意,也因为受到原来系统的限制无法搞...

从0开始搭建一个战棋游戏的AI(初级教程)

战棋类游戏一直以高策略性著称,其中不乏经典之作如“三国志英杰传”、“三国曹操传”、“炎龙骑士团”、“金庸群侠传”等等。今天,我们就如何一步步从0开始实现一个简单的战棋类游戏AI,概述一下此类游戏AI的...

《游戏脚本的设计与开发》-(战棋部分)2.3 战场上的寻路和移动

上次已经让我军,友军和敌军都出现在了战场上,本章来说说如何让一个部队在战场上进行移动。在战棋游戏中,我军回合行动的时候,点击我军的某一个部队,会出现选择列表,选择【部队移动】一项后,会出现该部队可能移...

酱油带你用cocos2dx3.0完成一款战棋游戏 (曹操传)(一)地图制作篇 1

酱油以前没有谢过博客,所以如果有

《游戏脚本的设计与开发》-(战棋部分)2.1 快速显示一张战场地图

今天开始脚本设计的第二部分,战棋游戏的开发。战棋游戏中我尤其喜爱光荣的英杰传和曹操传,我的多平台游戏三国记,也是以三国志曹操传为模板而开发的。本次也不例外,就从曹操传的移植为基础来开发,再进行扩展,从...

《游戏脚本的设计与开发》-(战棋部分)2.4 物理攻击

终于到了攻击部分了,战棋游戏中的攻击,主要分为物理攻击和法术攻击,本章就先从物理攻击讲起。物理攻击又分为普通攻击,连击(双击),以及致命攻击,再复杂一点的还有其他特殊攻击,比如我的《三国记-乱世群雄》...

《游戏脚本的设计与开发》-(战棋部分)2.2 军队降临战场

上次讲了如何快速显示一张战场地图,有了战场没有军队怎么行,本次来向战场上添加军队。一般战棋游戏中,战场上的军队有三种,我军,敌军和友军。我军是可操纵的,敌军是可攻击的,友军是不可操纵,也不可攻击的。敌...

④C语言,二维数组模拟井字棋游戏开发

#include int main(void) { int a[3][5];//定义一个三行五列的二维数组 //以下为二维数组的遍历 int p,x; for(p=0;p<3;p++){ ...

三子棋游戏C语言模拟实现

game.h #ifndef __ADD_H__ #define __ADD_H__ #include #include #include #include void game();...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)