结对项目名称:黄金分割点游戏(单机)

运行环境:vs

编译语言:c语言

项目分析:

实现的功能:用户可以选择继续游戏并且可以保存之前获得的分数,但是为了游戏的公平性,游戏的参数人数一开始用户确定以后就不能够改变。

Github地址:http://github.com/Yu0Ci/Project/blob/master/结对项目(陈香宇&蔡春燕).txt

总结与心得:此次项目主要是由玩家先输入游戏人数n,然后再由玩家输入自己理想的数字,同时再由电脑随机产生n-1个数字,这样可以很好的避免保持先后的顺序从而导致的不公平。通过此次项目感觉自己的逻辑能力变得更强了,对于指针的用法也很熟悉了,以及数字的简单存储之类的,从中也锻炼了与伙伴结对合作的能力,希望下次可以再接再厉做得更好。

代码:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
struct Grade
{
   int grade;
   struct Grade * next;
};
struct Figure
{
  int figure;
  struct Figure * next;
};
struct Grade * point(int N,int n,char name[50],int count,struct Grade *head);
void main()
{ 
    //count 统计玩家游戏的次数
    int c, N,n,count;
    struct Grade *head_g,*x,*y;
    char name[50];
    count=0;
    int i;
    head_g=NULL;
    x=NULL;
    printf("**************************欢迎来到黄金点游戏直播现场**************************\n");
    printf("规则是这样的,\nN位玩家,\n每位请写出1-100间的整数,\n提交的数字最靠近G点(黄金点)的人得N分\n\n\n\n");
    printf("**************************      请输入玩家姓名:     **************************\n");
    scanf("%s",name);
     
    printf("**************************      请输入游戏人数:     **************************\n");
    scanf("%d",&N);
    if(!(N>=1))
    {
      printf("%s玩家输入错误\n",name);
      exit(1);
    }
    do
    {
    printf("请%s玩家输入你想输入的数字(1~100)\n",name);
    scanf("%d",&n);
    if((n>=1)&&(n<=100))
    {  
        if(count==0)
        {  
            for(i=0;i<N;i++)
            {
            y=(struct Grade*)malloc(sizeof(struct Grade));
            y->grade=0;
            y->next=NULL;
            if(head_g==NULL)
            {head_g=y; x=y;}
            else
            {x->next=y;x=y;}
            }
         
        }
        count=count+1;
        head_g=point(N,n,name,count,head_g);
    }
    else
    exit(1);
    printf("^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ 诸位客官要不要继续玩?^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ \n");
    printf("继续请扣1,反之退出游戏\n");
    scanf("%d",&c);
    }while(c==1);
           
}
struct Grade * point(int N,int n,char name[50],int count,struct Grade *head_g)
{  
    struct Figure *head_p,*q,*p;
    struct Grade *x;
    double G,ave,amax,amin;
    srand(unsigned(time(NULL)));
    int i;
    ave=n;
    head_p=NULL;
    p=NULL;
    q=(struct Figure*)malloc(sizeof(struct Figure));
    q->figure=n;
    q->next=NULL;
    head_p=q;
    p=q;
    for(i=1;i<N;i++)
    {   
         
        q=(struct Figure*)malloc(sizeof(struct Figure));
        q->figure=rand()%101;
        q->next=NULL;
        if((p->figure)==0)
        {
            p->figure=1;
        }
        if(head_p==NULL)
        {
          q->figure=n;
          head_p=q;
          p=q;
        }
         
          p->next=q;
          p=q;
         
        ave=ave+(p->figure);
        printf("第%d号玩家的数字是%d\n",i+1,p->figure);
    }
    ave=ave/N;
    G=0.618*ave;
    printf("该组数据的平均值%lf:\n",ave);
    printf("该组数据的黄金点为%lf:\n",G);
    p=head_p;
    amin=fabs((p->figure)-G);
    amax=fabs((p->figure)-G);
    p=p->next;
    while(p!=NULL)//找到amax amin
    {
        if(fabs((p->figure)-G)<amax)
        {
            amax=fabs((p->figure)-G);
        }
        if(fabs((p->figure)-G)>amin)
        {  
            amin=fabs((p->figure)-G);
        }
            p=p->next;
    }
    p=head_p;
    x=head_g;
    while(p!=NULL)//打分
    {      
            if(amax==fabs((p->figure)-G))
            {  
                    x->grade=(x->grade)+2;
            }
            if(amin==fabs((p->figure)-G))
            {  
                x->grade=(x->grade)-1;
            }
            p=p->next;
            x=x->next;
          
    }
    x=head_g;
    printf("%s玩家的得分为%d(即第1号玩家的得分)\n",name,x->grade);
    x=x->next;
    for(i=1;i<N;i++)
    {
      if((x->grade)!=0)
      {
          printf("第%d号玩家的得分为%d\n",i+1,x->grade);
      }
      x=x->next;
    }
    printf("其余客官得分为0分。\n");
 
    return head_g;
     
     
 
}