游戏棋-模拟题

游戏棋

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 4
描述

相信大家都听说过大富翁这个游戏,一个不断进行色子抛出和买卖的格子游戏。在这个游戏中我们可以对于自己财产进行买卖。并且按照自己策略不断积攒财富。而且,在不同的地主对于玩家还有相应的惩罚机制。这都给这个汉诺带来了极大的趣味性。

郑州大学ACM实验室中最近这个游戏相当之流行。可以说大富翁的重要程度已经仅仅排在了训练的后面。但是网络中所能提供的地图是有限的,所以实验室的同学玩的时间长了之后就感觉非常无聊。可恶的开发团队并没有给出地图设计的软件。这个让整个实验室的同学们很纠结。所以他们最终决定自己开发一大套自己的大富翁游戏软件。在这个游戏内部测试版本中色子的功能被取消。每次一个人向前走一步。并且按照设定好的方式进行游戏。

在整个过程中,我们只有一种商品:房子。而且在整个过程中只有4种操作,分别是价格上升,价格下降,买房子,卖掉所有的房子。在游戏开始的时候我们会给予你一定的启动资金。

当你的资产大于原来的二倍的时候。(包括你的现金和房子数量乘以当前的价格,也就是说房子即使不卖出,也可以算做资产的部分)你就赢得了游戏。如果你的资产在某个时刻达到了原来的1/2之下。那你将失败。如果你在300次操作过程内没有结束游戏,那么就说明游戏本身设计的是有问题的。毕竟我们不能让我们的ACMer们过于沉迷于此。而且因为游戏是前期产品,如果游戏要求你买的房子超过你的现有资金或者要求你卖出的房子超过你的现有的房子数量。那么游戏将直接报错。

输入
输入分两部分:
第一部分 有一个整数T(1<=T<=10)表示测试组数。
第二部分 共T组,对于每组数据:
第一行有三个个数字X,Y和Z,表示整个游戏棋的大小,房子的初始价格,以及你的初始资产0<N<100,0<Y<50,5<Z<1000。
第二行到第N+1行是N个格子中的内容。你将顺次从第一个格子走到最后一个,然后再从第一个开始。四种内容分别是"price_up x","price_down x","sell x houses","buy x houses"其分别表示房子的价格上升x元,房子价格下降x元,卖掉x个房子,买入x个房子。
输出
如果你在300步之内赢得比赛那么输出"win",如果300步内输掉了比赛,那么输出"lose",如果你走到301步,那么直接输出"bad game"。
如果游戏报错了,直接输出"error"
样例输入
1
4 3 100
buy 30 houses
price_up 1000
sell 30 houses
price_down 100
样例输出
win

代码:

#include<stdio.h>
#include<string.h>
char s[15], house[15];
typedef struct
{
    int flag;
    int x;
}S;
S d[110];
int main()
{
    int tcases;
    int X, i, housenum, Y, Z, x, FM, len;
    int m, count, over;
    scanf("%d", &tcases);
    while(tcases--)
    {
        scanf("%d%d%d", &X, &Y, &Z);
        FM = Z;
        for(i = 0; i < X; i++)
        {
            scanf("%s", s);    
            len = strlen(s);
            if(len == 8)
            {
                scanf("%d", &x);
                d[i].flag = 0;
                d[i].x = x;
            }
            else if(len == 10)
            {
                scanf("%d", &x);
                d[i].flag = 1;
                d[i].x = x;
            }
            else if(len == 3)
            {
                scanf("%d", &x);
                scanf("%s", house);
                d[i].flag = 2;
                d[i].x = x;
            }
            else if(len == 4)
            {
                scanf("%d", &x);
                scanf("%s", house);
                d[i].flag = 3;
                d[i].x = x;
            }
        }
        count = 0; over = 0; housenum = 0;
        while(count < 300 && !over)
        {
            if( Z + housenum * Y > FM * 2)
            {
                over = 1;
                printf("win\n");
                continue;
            }
            if(Z + housenum * Y < FM / 2)
            {
                over = 1;
                printf("lose\n");
                continue;
            }
            m = count % X;
            count++;
            if(d[m].flag == 0)
            {
                 Y += d[m].x;
                 continue;
            }
            if(d[m].flag == 1)
            {
                Y -= d[m].x; 
                continue;
            }
            if(d[m].flag == 2)
            {
                if(d[m].x * Y > Z)
                {
                    over = 1;
                    printf("error\n");
                    continue;
                }
                Z = Z - d[m].x * Y;
                housenum += d[m].x;
                continue;
            }
            if(d[m].flag == 3)
            {
                if(housenum < d[m].x)
                {
                    over = 1;
                    printf("error\n");
                    continue;
                }
                housenum -= d[m].x;
                Z = Z + d[m].x * Y;
                continue;
            }
        }
        if(!over)
            printf("bad game\n");
    }
    return 0;
}

 
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>

using namespace std;

char gamecon[105][30];

int main()
{
    int i,t,gamestep,houseowned,winsig,scur;
	float oriprice,startmoney,orimoney,intinput;
	char temp1[30],temp2[30];
    //freopen("E:\\input.txt","r",stdin);
    scanf("%d",&t);
	while (t--)
	{
		winsig=0;
		houseowned=0;
        scanf("%d%f%f\n",&gamestep,&oriprice,&orimoney);
		startmoney=orimoney;
        for (i=0;i<gamestep;i++)
            gets(gamecon[i]);
        for (i=0;i<300;i++)
        {
			scur=i%gamestep;
			if (gamecon[scur][0]=='b')
			{
               sscanf(gamecon[scur],"%s%f%s",&temp1,&intinput,&temp2);
               orimoney-=intinput*oriprice;
			   houseowned+=intinput;
			   if (orimoney<0)
			   {
			      winsig=2;
			      break;
			   }
			}
			else if (gamecon[scur][0]=='s')
			{
			   sscanf(gamecon[scur],"%s%f%s",&temp1,&intinput,&temp2);
			   if (intinput>houseowned)
			   {
				   winsig=2;
			       break;
			   }
               orimoney+=intinput*oriprice;
			   houseowned-=intinput;
			}
			else
			{
			   sscanf(gamecon[scur],"%s%f",&temp1,&intinput);
			   if (strcmp(temp1,"price_up")==0)
			   {
				   oriprice+=intinput;
			       if (oriprice*houseowned+orimoney>2*startmoney)
			       {
					   winsig=1;
					   break;
			       }
			   }
			   else
			   {
				   oriprice-=intinput;
				   if (oriprice*houseowned+orimoney<startmoney/2)
				   {
					   winsig=4;
					   break;
			       }
			   }
			}
        }
		if (winsig==1)
			printf("win\n");
		else if (winsig==0)
			printf("bad game\n");
		else if (winsig==4)
            printf("lose\n");
		else
            printf("error\n");
	}
	return 0;
}        
                






数据结构习题:已知两人分别执白和黑一个棋盘上下五子,若同一颜色的棋子在同一条横行、纵行或斜线上连成5个棋子,则执该颜色棋子的人获胜。编写程序读入某一时刻下的状态,并判断是否有人即将获胜,即:同一颜色的棋子在同一条横行、纵列或斜线上连成4个棋子,且该4个棋子的两端至少有一端为空位置。 输入的棋盘大小是19×19,用数字0表示空位置(即没有棋子),用数字1表示该位置下了一白色棋子,用数字2表示该位置下了一黑色棋子。假设同一颜色的棋子在同一条横行、纵列或斜线上连成的棋子个数不会超过4个,并且最多有一人连成线的棋子个数为4。 【输入形式】 从控制台输入用来表示棋盘状态的数字0、1或2;每行输入19个数字,各数字之间以一个空格分隔,每行最后一个数字后没有空格;共输入19行表示棋盘状态的数字。 【输出形式】 若有人即将获胜,则先输出即将获胜人的棋子颜色(1表示白色棋子,2表示黑色棋子),然后输出英文冒号:,最后输出连成4个棋子连线的起始位置(棋盘横行自上往下、纵列自左往右从1开始计数,横行最小的棋子棋盘上的横行数和纵列数作为连线的起始位置,若在同一行上,则纵列数最小的棋子位置作为起始位置,两数字之间以一个英文逗号,作为分隔符)。 若没有人获胜,则输出英文字符串:No。 无论输出什么结果,最后都要有回车换行符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值