- 论坛徽章:
- 0
|
是一个抽牌的游戏,是用链表实现的。
大致意思是:一开始输入一个parfait的数(就像10=1+2+3+4,或者15=1+2+3+4+5等等)
然后把牌分开想这样运算
例如总数是10
我第一次是(6,4)
然后(2,5,3) //每次都抽出一张牌放到一个第一位
就这样依次循环下去,如果抽到0张牌了就删除这个结点。
所以么后面就是(3,1,4,2)->(4,2,3,1)->(4,3,1,2)->(4,3,2,1)
直到最后能排成一个递减数列就完成了。
我写了个小原代码,是在LIUNX下的GCC编译通过的,可是出现死循环,不知道为什么,请高手们帮忙看看
学C++没多久还是个菜鸟,程序哪里要改进的地方请大家提出来,谢谢了。
Game.h:
#ifndef GAME_H
#define GAME_H
#include <iostream>
using namespace std;
struct tas
{
int iNbcartes;
struct tas *suivant;
};
struct jeu
{
int iNbTas;
tas *pPremier;
};
int verifie2 (int);
int saisir1 (void);
int saisir2 (int &);
void AjoutTas(jeu *,int);
void CreationJeu (jeu *,int);
int Affiche(jeu *);
int enlever(jeu *);
void FonctionMystere(jeu *);
bool verifier (jeu *);
void supprimer (tas *);
#endif
#include "Game.h"
int verifie2 (int iArg)
{
int iTmp=iArg;
int iIndice=1;
while (iTmp>0)
{
iTmp-=iIndice;
iIndice++;
}
if (iTmp==0)
return iArg;
else
return (iArg+1-iTmp-iIndice);
}
int saisir1 ()
{
int i;
cout <<"Entrez un nombre entier compris entre 0 et 10000:" <<endl;
do
{
cin >>i;
}
while ((i<0)||(i>10000));
i=verifie2(i);
return i;
}
int saisir2 (int &iArg)
{
int i;
cout <<"Entrez un nombre entier compris entre 0 et " <<iArg <<endl;
do
{
cin >>i;
}
while ((i<0)||(i>iArg));
iArg-=i;
return i;
}
void AjoutTas(jeu *pJeu,int iNbcartes)
{
tas *nouv;
nouv=new tas;
nouv->iNbcartes=iNbcartes;
pJeu->iNbTas++;
nouv->suivant=pJeu->pPremier;
pJeu->pPremier=nouv;
}
void CreationJeu (jeu *pJeu,int iN)
{
int iNbcartes;
while (iN>0)
{
iNbcartes=saisir2(iN);
AjoutTas(pJeu,iNbcartes);
}
}
int Affiche(jeu *pJeu)
{
tas *tmp;
tmp=new tas;
tmp=pJeu->pPremier;
cout <<"( ";
while (tmp!=NULL)
{
cout <<tmp->iNbcartes <<" ";
tmp=tmp->suivant;
}
cout <<")" <<endl;
delete tmp;
return 0;
}
int enlever(jeu *pJeu)
{
int i=0;
tas *tmp;
tmp=new tas;
tmp=pJeu->pPremier;
while (tmp!=NULL)
{
cout <<"abcd" <<endl;
tmp->iNbcartes--;
cout <<tmp->iNbcartes <<endl;
tmp=tmp->suivant;
i++;
}
cout <<i <<endl;
delete tmp;
return i;
}
void FonctionMystere(jeu *pJeu)
{
tas *pTas,*pTasBis;
pTas=pJeu->pPremier;
while (pTas!=NULL)
{
while (pTas->iNbcartes==0)
{
pJeu->pPremier=pTas->suivant;
pJeu->iNbTas--;
delete pTas;
pTas=pJeu->pPremier;
}
pTasBis=pTas->suivant;
if ((pTasBis!=NULL)&&(pTasBis->iNbcartes==0))
{
pTas->suivant=pTasBis->suivant;
pJeu->iNbTas--;
delete pTasBis;
}
else
pTas=pTasBis;
}
}
bool verifier (jeu *pJeu)
{
tas *tmp,*tmp1;
tmp=new tas;
tmp1=new tas;
tmp=pJeu->pPremier;
tmp1=pJeu->pPremier->suivant;
cout <<"dajkjda " <<endl;
while (tmp1!=NULL)
{
//cout <<"dajkjda " <<endl;
if (tmp->iNbcartes != tmp1->iNbcartes+1)
break;
else
{
tmp1=tmp1->suivant;
tmp=tmp->suivant;
}
}
if (tmp1==NULL)
return true;
else
return false;
}
void supprimer (tas *t)
{
tas *tmp;
while (t!=NULL)
{
tmp=new tas;
tmp=t;
t=t->suivant;
delete tmp;
}
}
main.cpp:
#include "Game.h"
int main()
{
int i,j,nombre;
jeu *pJeu1;
pJeu1=new jeu;
pJeu1->pPremier=NULL;
pJeu1->iNbTas=0;
i=saisir1();
CreationJeu(pJeu1,i);
j=Affiche(pJeu1);
while (verifier(pJeu1)==false);
{
nombre=enlever(pJeu1);
cout <<nombre <<endl;
FonctionMystere(pJeu1);
AjoutTas(pJeu1,nombre);
j=Affiche(pJeu1);
}
supprimer(pJeu1->pPremier);
delete pJeu1;
return 0;
} |
|