战棋游戏 {游戏模拟+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; 
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

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

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

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

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

基于HTML5的战棋游戏引擎

     出于对战棋游戏的喜爱,结合自己所学,闲来制作了基于HTML的战棋游戏引擎,现在还只是毛坯版本,只是能展示,角色可以移动而已:线上地址: http://slgengine.googlecode...
  • northwind_x
  • northwind_x
  • 2010年09月13日 10:24
  • 2323

(转)【Unity3D游戏开发】—— iTween笔记 一(战棋寻路)

iTween这个动画库非常好用,用 它可以轻松实现各种动画,晃动,旋转,移动,褪色,上色,控制音频等等效果。 iTween下载则在Asset Store上搜索iTween并下载iTween Visu...
  • liuchichi
  • liuchichi
  • 2017年11月15日 21:54
  • 330

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

酱油以前没有谢过博客,所以如果有
  • u010043901
  • u010043901
  • 2014年09月11日 20:08
  • 2611

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

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

一点思考,战棋类游戏地图核心应该有什么?

这个周末在家闷了一天,思考和编写战棋类游戏地图的核心功能。所谓核心功能我的理解就是抽象于具体游戏之上,引擎级别的东西。之前也没有参考过别人的代码,就按自己的构思和理解来吧。现在已经实现了如下功能1.逻...
  • rcfalcon
  • rcfalcon
  • 2010年01月28日 14:19
  • 1672

探索小游戏(三):A*算法实现自动寻路

关于A*算法,推荐一篇博客: 这里写链接内容博客中介绍了A*算法的原理,通过这个探索小游戏实现自动寻路,结合代码加深对A*算法的理解。首先定义了一个Point类:local Point = clas...
  • forestsenlin
  • forestsenlin
  • 2016年03月30日 21:00
  • 2176

【NOIP模拟赛】战棋游戏

战棋游戏 Description Rainbow擅长战棋类游戏。著名的战棋游戏有很多,例如《曹操传》、《瓦岗山异闻录》等。在本题中,我们考虑战棋游戏的一个简单版本,基于一下规则:地图地图是一个N行N列...
  • Bobby_Z
  • Bobby_Z
  • 2016年10月29日 16:58
  • 334

战棋系统的分析

战棋游戏的战棋系统是它的灵魂,由这个系统就可以看出一个战棋游戏的好坏。 一、参战人数要少。  参加战斗双方的人数要少,如果是一大群人在打群架的话,还不如做成即时战略游戏。  中国象棋每边只有十六个子,...
  • csdn_gamedev
  • csdn_gamedev
  • 2005年03月13日 11:14
  • 2598
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:战棋游戏 {游戏模拟+spfa}
举报原因:
原因补充:

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