Beispiel #1
0
int main(int argc, char *argv[])
{
   NODEPTR headBone = NULL, tailBone = NULL;
   NODEPTR headUser = NULL, tailUser = NULL;
   NODEPTR headSystem = NULL, tailSystem = NULL;
   NODEPTR headTrain = NULL, tailTrain = NULL; 
   NODEPTR curr = NULL, choice = NULL;
   LIST *boneyard, *user, *system, *train;
   FILE *ifp;
   int numDom, menu, turn = CONTINUE, status;
   int player = CONTINUE;
   
   /* check for correct number of arguments */
   if(argc != 3)
   {
      /* print message to standard error */
      fprintf(stderr, "incorrect number of arguments.\n");
      fprintf(stderr, "enter a.out, name of file, and number of starting\n");
      fprintf(stderr, "dominoes.\n");

      exit(-1);
   }

   int handSize = atoi(argv[2]);
   char *fileName = argv[1];
   
   ifp = fopen(fileName, "r");

   /* check if the file opened correctly */
   if(ifp  == NULL)
   {
      fprintf(stderr, "%s is incorrect\n", fileName);

      exit (-2);
   }

   /* makes sure num dominoes is positive */
   if(atoi(argv[2]) <= 0)
   {
      /* print message to standard error */
      fprintf(stderr, "number of dominoes must be positive\n");

      exit(-3);
   }

   /* gather necessary memory for the LIST structs */
   boneyard = (LIST *) malloc(sizeof(LIST));

   if(boneyard == NULL)
   {
      fprintf(stderr, "Out of Memory - boneyard\n");

      exit(-6);
   }

   user = (LIST *) malloc(sizeof(LIST));

   if(user == NULL)
   {
      fprintf(stderr, "Out of Memory - user\n");

      exit(-7);
   }

   system   = (LIST *) malloc(sizeof(LIST));

   if(system == NULL)
   {
      fprintf(stderr, "Out of Memory - system\n");
   
      exit(-8);
   }

   train    = (LIST *) malloc(sizeof(LIST));

   if(train == NULL)
   {
      fprintf(stderr, "Out of Memory - train\n");
      
      exit(-9);
   }

   /* point the head and tail to the list struct */
   boneyard->head = headBone;
   boneyard->tail = tailBone;
   boneyard->nrNodes = 0; 
   
   user->head = headUser;
   user->tail = tailUser;
   headUser = user->head;
   tailUser = user->head;
   user->nrNodes = 0;

   system->head = headSystem;
   system->tail = tailSystem;
   system->nrNodes = 0;

   train->head = headTrain;
   train->tail = tailTrain;
   train->nrNodes = 0;
      
   /* Creates the boneyard which holds all dominoes in the beginning */
   numDom = CreateBoneyard(boneyard, ifp);
  
   /* calculates max hand size for game of dominoes */
   if(handSize >= (numDom - 1) / 2)
   {
      fprintf(stderr, "%d is too large for number of dominoes\n", handSize);
      fprintf(stderr, "largest number of dominoes is %d\n", (numDom - 1) / 2);

      exit(-4);
   }

   /* prints greeting to the user */
   PrintGreeting();
   
   /* prints program instructions */
   PrintInstructions();
   
   /* gives the user a linked list of dominoes */
   DealUser(boneyard, user, handSize);
   
   /* gives the system a linked list of dominoes */
   DealSystem(boneyard, system, handSize);
   /* takes the first node from the boneyard to be used as the train */
   curr = boneyard->head;
   boneyard->head = boneyard->head->next;
   InsertLeft(train, curr);
  
   /* prints the menu for user interface */
   PrintMenu();

 
   /* Game Loop */  
   while(player == CONTINUE)
   {
      /* player turn loop */
      while(turn != OVER)
      {
	 printf("The train (%d): ", train->nrNodes);
	 PrintList(train->head);
	 printf("\n\n");
	 
	 printf("Your turn...(enter six for menu)\n");	 
	 menu = GetValidInt(); /* int used for menu nav */
	 
	 switch(menu)
	 {
	    case PRINTDOMINO:
	       printf("Your Dominoes: ");
	       PrintList(user->head);
	       printf("\n");
	       turn = CONTINUE; /* print domino doesnt use up your turn */
	       break;
	    case INSERTLEFT:
	       /* selects a domino to play */
	       choice = SelectDominoLeft(train, user);
	       if(choice != NULL)
	       {
		  InsertLeft(train, choice);
		  turn = OVER;
	       } else {
		  turn = CONTINUE; /* if can't play, turn isnt lost */
	       }
	       break;
	    case INSERTRIGHT:
	       /* selects a domino to play */
	       choice = SelectDominoRight(train, user);
	       if(choice != NULL)
	       {
		  choice->next = NULL;
		  InsertRight(train, choice);
		 
		  turn = OVER;
	       } else {
		  turn = CONTINUE;
	       }
	       break;
	    case DRAWDOMINO:
	       /* checks if boneyard is empty */
	       if(IsEmpty(boneyard->head) == FALSE)
	       {
		  status = CheckDomino(train, user, USER);
		  if(status == TRUE)
		  {
		     DrawDomino(user, boneyard);
		     turn = OVER;
		  } else {
		     printf("\nYou had a domino to play\n\n");
		     turn = CONTINUE;
		  }
		  
	       } else {
		  printf("Boneyard is empty\n");
	       }
	       break;
	    case PASSTURN:
	       /* checks if you can play a domino and for empty boneyard */
	       if(CheckDomino(train, user, USER) == TRUE && 
		  IsEmpty(boneyard->head) == TRUE)
	       {
		  printf("\nuser passes his turn\n");
		  turn = OVER;
	       } else 
		  if(IsEmpty(boneyard->head) == FALSE)
		  {
		     printf("\nCant pass, you can draw from the boneyard\n\n");
		     turn = CONTINUE;
		  } else {
		     printf("Can't pass you still have a domino to play");
		  }
	       break;
	    case PRINTMENU:
	       PrintMenu();
	       turn = CONTINUE; 
	       break;
	    case QUIT:
	       turn = OVER;
	       player = QUIT;
	       break;
	    default:
	       printf("Dios Mios!!, esta numero no existan!!!\n");
	       break;
	 }
	 /* checks if player ran out of dominoes */
	 if(IsEmpty(user->head) == TRUE)
	 {
	    player = WIN;
	 } 
      }
      
      turn = CONTINUE;
      
      printf("The Train: ");
      PrintList(train->head);
      printf("\n");

      /* computers turn */
      if(player == CONTINUE)
      {
	 printf("System's Hand: ");
	 PrintList(system->head);
	 printf("\n");
	 printf("\nSystem's turn...");

	 /* tries to play a domino for the system */
	 if(CheckDomino(train, system, SYSTEM) == FALSE)
	 {
	    system->nrNodes--;
	    printf("System has %d dominoes left\n\n", system->nrNodes);
	 } else 
	    if(IsEmpty(boneyard->head) == FALSE) /* tries to draw domino */
	    {
	       DrawDomino(system, boneyard);
	       printf("System drew a domino from the boneyard\n");
	       printf("System has %d dominoes left\n\n", system->nrNodes);
	    } else {
	       /* last passes if can do neither of the above */
	       printf("System has passed this turn\n");
	       printf("System has %d dominoes left\n\n", system->nrNodes);
	    }
	 
	 /* checks for empty hand */
	 if(IsEmpty(system->head) == TRUE)
	 {
	    player = LOSE;
	 }
	 
      }
   }

   if(player == WIN)
   {
      printf("Player Wins!\n");
      /* destroys all linked lists */
      DestroyList(user);
      DestroyList(boneyard);
      DestroyList(system);
      DestroyList(train);
   } else 
      if(player == LOSE)
      {
	 /* destroys all linked lists */
	 printf("System Wins! You Lose!");
	 DestroyList(user);
	 DestroyList(boneyard);
	 DestroyList(system);
	 DestroyList(train);
      } else {
	 /* destroys all linked lists */
	 printf("Hope you had a good game, Play again soon!\n");
	 DestroyList(user);
         DestroyList(boneyard);
         DestroyList(system);
         DestroyList(train);
      }

   return 0;
}
Beispiel #2
0
/**
* @brief pos结算
* @param in cFlag 结算标识0正常结算    非0结算中断后的再次结算
* @return 
* @li APP_SUCC
* @li APP_FAIL
* @li APP_QUIT
*/
int Settle(char cFlag)
{	

	char *pszTitle="结算";
	STSYSTEM stSystem;
	STAMT_NUM_SETTLE stAmtNumSettle;
	STAMT_NUM_INFO_SETTLE stAmtNumInfo;

	int nRet = 0;
	char sPackBuf[MAX_PACK_SIZE]; 
	int nPackLen = 0;
	int nFieldLen = 0;
	char szSettleDateTime[5+1];
	char cProcStep = 0;
	int nTagSum=0;

	memset(&stSystem, 0, sizeof(STSYSTEM));

	/*
	* 检查POS限制,电量是否充足
	*/
	ASSERT_QUIT(DealPrintLimit()); 
	
	if (cFlag)
	{
		/*
		* 取原来结算中断的步骤
		*/
		if (YES == GetVarBatchHaltFlag())
		{
			cProcStep = 2;
		}
		else if (YES == GetVarPrintSettleHalt())
		{
			cProcStep = 3;
		}
		else if (YES == GetVarPrintDetialHalt())
		{
			cProcStep = 4;
		}
		else if (YES == GetVarClrSettleDataFlag())
		{
			cProcStep = 5;
		}
	}
	else
	{
		cProcStep = 0;
		/*
		* 将批上送中断标识的数置为1,从第一笔开始送
		*/
		SetVarBatchMagOfflineHaltFlag(1);
		SetVarFinanceHaltFlag(1);
		SetVarMessageHaltFlag(1);		
		SetVarEmvOfflineUpNum(1);
		SetVarEmvOnlineUpNum(1);
		SetVarEMVOfflineFailHaltFlag(1);
		SetVarEMVOnlineARPCErrHaltFlag(1);
		/*
		* 将批上送的笔数置为0,重新统计
		*/
		SetVarBatchSum(0);
	}	

	/**
	* 联机结算
	*/
	if (cProcStep <= 1)
	{
		/**
		* 检查是否签到
		*/
		ASSERT_QUIT(ChkLoginStatus());

		/**
		* 执行冲正
		*/
		ASSERT_HANGUP_QUIT(DoReversal());
		PubDisplayTitle(pszTitle);		
		/**
		* 再次判断拨号
		*/
		ASSERT_HANGUP_QUIT(CommConnect());
	
		/**
		* 采集数据
		*/
		DealSystem(&stSystem);
		CustodyTlvInit();

		DealSettle(&stAmtNumInfo);
		memset((char *)&stAmtNumSettle, 0, sizeof(stAmtNumSettle));
		PubHexToAsc(stAmtNumInfo.nDebitAmount_N.sSettleAmt, 12, 0,(uchar*)stAmtNumSettle.sDebitAmt_N);
		sprintf(stAmtNumSettle.sDebitNum_N, "%03ld", stAmtNumInfo.nDebitNum_N);		
		PubHexToAsc(stAmtNumInfo.nCreditAmount_N.sSettleAmt, 12, 0, (uchar*)stAmtNumSettle.sCreditAmt_N);
		sprintf(stAmtNumSettle.sCreditNum_N, "%03ld", stAmtNumInfo.nCreditNum_N);

#if 0
		stAmtNumSettle.cSettleCode_N = '0';
		PubHexToAsc(stAmtNumInfo.nDebitAmount_W.sSettleAmt, 12, 0, (uchar*)stAmtNumSettle.sDebitAmt_W);
		sprintf(stAmtNumSettle.sDebitNum_W, "%03ld", stAmtNumInfo.nDebitNum_W);	
		PubHexToAsc(stAmtNumInfo.nCreditAmount_W.sSettleAmt, 12, 0, (uchar*)stAmtNumSettle.sCreditAmt_W);
		sprintf(stAmtNumSettle.sCreditNum_W, "%03ld", stAmtNumInfo.nCreditNum_W);
		stAmtNumSettle.cSettleCode_W= '0';
#endif

		memcpy(stSystem.szTransCode, "200001", 6);
		memset(sPackBuf, 0, sizeof(sPackBuf));
		nPackLen =0;
		ASSERT_FAIL(CustodyTlvAddValue(1, stSystem.szTransCode, sPackBuf, &nPackLen, &nTagSum));
		ASSERT_FAIL(CustodyTlvAddValue(2, stSystem.szDate, sPackBuf, &nPackLen, &nTagSum));
		ASSERT_FAIL(CustodyTlvAddValue(3, stSystem.szTime, sPackBuf, &nPackLen, &nTagSum));
		ASSERT_FAIL(CustodyTlvAddValue(4, stSystem.szTrace, sPackBuf, &nPackLen, &nTagSum));
		ASSERT_FAIL(CustodyTlvAddValue(5, stSystem.szBatchNo, sPackBuf, &nPackLen, &nTagSum));
		ASSERT_FAIL(CustodyTlvAddValue(7,  stSystem.szPosID, sPackBuf, &nPackLen, &nTagSum));
		ASSERT_FAIL(CustodyTlvAddValue(8,  stSystem.szShopID, sPackBuf, &nPackLen, &nTagSum));
		ASSERT_FAIL(CustodyTlvAddValueLen(34, (char *)&stAmtNumSettle,36, sPackBuf, &nPackLen, &nTagSum));
		

		/**
		*拨号
		*/
		ASSERT_HANGUP_QUIT(CommConnect());
		ASSERT_HANGUP_FAIL(CustodyPack(sPackBuf, &nPackLen, nTagSum));

		IncVarTraceNo();
		ASSERT_HANGUP_FAIL(CommSend(sPackBuf, nPackLen));
		ASSERT_HANGUP_FAIL(CommRecv(sPackBuf, &nPackLen));
		
		ASSERT_HANGUP_FAIL(CustodyUpPack(sPackBuf, &nPackLen, &nTagSum));
		ASSERT_HANGUP_FAIL(CustodyChkRespon(&stSystem, sPackBuf, nPackLen));
		if (memcmp(stSystem.szResponse, "00", 2) != 0)
		{
			CommHangUp();
			CustoyDispResp(stSystem.szResponse, stSystem.szRespInfo);
			return APP_QUIT;
		}
	
		ASSERT_FAIL(CustodyGetField(34,  (char *)&stAmtNumSettle.cSettleCode_N, &nFieldLen));
		if(stAmtNumSettle.cSettleCode_N == '1' || stAmtNumSettle.cSettleCode_N == '2' || stAmtNumSettle.cSettleCode_N == '3')
		{
			SetVarCnCardFlag(stAmtNumSettle.cSettleCode_N);/*<内卡应答码*/
		}
		else
		{
			PubMsgDlg("结算", "内卡\n对帐应答代码错误", 3, 10);
			CommHangUp();
			return APP_FAIL;
		}
		/**
		* 保存结算日期时间
		*/
		PubAscToHex((uchar *)stSystem.szDate+4, 4, 0, (uchar *)szSettleDateTime);
		PubAscToHex((uchar *)stSystem.szTime, 6, 0, (uchar *)szSettleDateTime + 2);
		SetVarSettleDateTime(szSettleDateTime);
	}

	/**
	* 批上送
	*/
	if (cProcStep <= 2)
	{
		SetVarBatchHaltFlag(YES);
		/*银商要求除了通讯\打包问题,
		批上送应答只显示但是不失败,
		都强制成功*/
		
		//现在没有需要离线上送的交易
		//ASSERT_HANGUP_FAIL(DoBatchUp());
		SetVarBatchHaltFlag(NO);
	}

	CommHangUp();

	/**
	* 打印结算单
	*/
	if (cProcStep <= 3)
	{
		SetVarPrintSettleHalt(YES);
		PubClearAll();
		PubDisplayTitle("正在打印结算单");
		PubDisplayGen(3, "请稍候");
		PubUpdateWindow();
		nRet = PrintSettle(FIRSTPRINT);
		if (nRet == APP_FAIL)
		{
			return APP_FAIL;
		}
 		SetVarPrintSettleHalt(NO);
 	}
	
	/**
	* 打印明细单
	*/
	if (cProcStep <= 4)
	{
		SetVarPrintDetialHalt(YES);
		if (YES == GetVarIsPrintWaterRec())
		{
			int nSelect = 0;
			
			nRet = ProSelectList("0.否||1.是", "是否打印明细", 0xFF, &nSelect);
			if (nRet == APP_SUCC && nSelect == 1)
			{
				PubClear2To4();
				PubDisplayGen(3, "打印明细单");
				PubUpdateWindow();
				nRet = PrintAllWater();
				if (nRet == APP_FAIL)
				{
					return APP_FAIL;
				}
			}
		}

		SetVarPrintDetialHalt(YES);

		#if 0
		if(GetFailSendNum(0xFF) != 0)
		{
			PubClearAll();
			PubDisplayGen(3, "打印上送不成功的");
			PubDisplayGen(4, "交易明细");
			PubUpdateWindow();
	  		nRet = PrintFailWater(0xFF);
			if (nRet != APP_SUCC)
			{
				return APP_FAIL;
			}
		}
		if(GetFailSendNum(0xFE) != 0)
		{
			PubClearAll();
			PubDisplayGen(3, "打印上送被拒的");
			PubDisplayGen(4, "交易明细");
			PubUpdateWindow();
			nRet = PrintFailWater(0xFE);
			if (nRet != APP_SUCC)
			{
				return APP_FAIL;
			}
		}
		#endif
		SetVarPrintDetialHalt(NO);
	}

	/*
	* 清除结算数据流水等
	*/
	if (cProcStep <= 5)
	{
		SetVarClrSettleDataFlag(YES);
		PubClearAll();
		PubDisplayTitle(pszTitle);
		PubDisplayGen(2, "正在处理结算");
		PubUpdateWindow();
		nRet = InitWaterFile();/**<清除流水*/
		ASSERT(nRet);
		if (nRet != APP_SUCC)
		{
			InitWaterFile();/**<清除流水*/
		}
		ClearSettle();/**<清除结算数据*/
		IncVarBatchNo();/**<批次号加一*/
		SetVarClrSettleDataFlag(NO);
		SetVarOfflineUnSendNum(0);
	}
	PubClearAll();
	PubDisplayTitle(pszTitle);
	PubDisplayStrInline(DISPLAY_MODE_CENTER, 2, "结 算 成 功");
	PubUpdateWindow();
	return APP_SUCC;
}