C语言模拟双色球系统开发

前言

        近期有朋友双色球中了个小奖,所以临时兴起,写了个模拟双色球系统玩玩,购买规则、开奖以及中奖等级均模仿现实规则,小部分玩法自定。

        开发此系统需要熟悉 C 语言指针的使用、结构体的设计;如果能轻松的写出来,说明你C语言掌握的已经算是相对熟练了,工作中应对中小型项目已经足够了,话不多说,直接开整。

1.  设定系统架构

        首先,制定该系统需要实现的具体功能、玩法,初步制定好目标后,构思结构体如何设定才能更便捷的访问数据,把功能细分化,模块化,尽量减少重复代码,一个好的初步结构,会让整个过程事半功倍,所以必须构思好基本盘。

1.1 我的设计目标

菜单功能:1.买球        2.兑奖信息        3.开奖历史         4.查余额         5.退出;

玩法:①自选或者机选号码,

           ②红、蓝球复式购买或者正常飞复式购买,一注花费2rmb,

           ③购买倍数;

数据录入:自选的话需要使用键盘输入号码,第一次玩还需要输入购买者姓名;

                号码输入完成后,显示购买的组合信息以及购买金额;

                另外,还模拟了50个机器人购买;

开奖:购买完成后直接跳入开奖环节;

           开奖结束后会显示中奖人信息、中奖等级;

中奖等级:分为一到六级,一级最高;

兑奖信息:显示购买信息,以及中奖等级;

开奖历史:显示历史开奖号码;

余额查询:显示余额信息(开局送10W余额);

退出:释放申请的内存,并退出进程。

2. 系统程序设计

2.1 结构体设计

ROBOT_SIM:定义模拟机器人的数量;enum枚举中奖等级和复式买法;

struct _buy_method结构体汇总买法规则;

struct _data结构体存储号码数据,里面有个next指针变量,串联球号组合数据;

struct _message结构体表示个人购买的信息存储;

struct _win_mess结构体链接所有中奖者信息;

struct _shop_history 结构体表示开奖历史信息;

struct _shop_message结构体表示买球者以及系统的所有信息。

#define ROBOT_SIM  50   //模拟机器人

typedef enum _method {
    MUL_NONE = 0,
    MUL_RED  = 1,   //红球复式
    MUL_BLUE,       //蓝球复式
    MUL_ALL,        //红蓝复式
}method_t;

typedef enum _level {
    LEVEL_NONE = 0,
    LEVEL_ONE  = 1,     //6+1: 一等奖  
    LEVEL_TWO,          //6+0
    LEVEL_THREE,        //5+1
    LEVEL_FOUR,         //5+0 || 4+1
    LEVEL_FIVE,         //4+0 || 3+1
    LEVEL_SIX,          //>0
}level_t;

typedef enum _money {
    RMB_NONE    =0,
    RMB_5       =5,
    RMB_10      =10,
    RMB_200     = 200,
    RMB_3K      = 3000,
    RMB_500W    = 5000000,
    RMB_1KW     = 10000000,
}money_t;

typedef struct _buy_method {
    unsigned int select;         //0:机选  1:自选
    method_t mul;                //复式买法
    unsigned int num_count[3];   //[0]:红球数量,[1]:蓝球数量,[2]组合数量
    unsigned int bet;            //倍数
}buy_method_t;

typedef struct _data {
    unsigned int data[7];
    struct _data *next;
}data_t;

typedef struct _message {
    char *name;                 //购买者姓名
    buy_method_t method;        //玩法
    data_t data;                //购买号码数据
    unsigned int money;         //花费金额
    unsigned int remain_money;  //剩余金额
    level_t win_level;          //中奖等级
}message_t;

typedef struct _win_mess {
    char *win_name;             //中奖人名
    level_t win_level;          //中奖等级
    struct _win_mess *next;
}win_mess_t;

typedef struct _shop_history {
    unsigned int date_no;       //开奖期数
    unsigned int result[7];     //开奖结果
    win_mess_t win;             //中奖名单
    struct _shop_history *next;
}shop_history_t;

typedef struct _shop_message {
    message_t all_message[1+ROBOT_SIM];     //顾客购买信息,模拟50人购买
    shop_history_t history;                 //开奖历史
}shop_message_t;

2.1  main函数

定义一个struct _shop_message结构体变量,汇总所有信息,并初始化该变量;

menu_mode:通过键盘键入菜单功能,然后再进入功能函数去执行;

总之,main函数中不要篇幅太长,太乱,把功能细分化、模块化,就好处理了。

void main()
{
    char menu_mode ;
    shop_message_t message;
    shop_message_t *mess_p = &message;
    init_struct_data(mess_p);
    while(1)
    {
        menu_mode = system_menu();
        switch (menu_mode)
        {
            case 1:
                shop_guide_system(mess_p);
                break;

            case 2:
                show_self_ball_result(mess_p);
                break;

            case 3:
                show_ball_history(mess_p);
                break;

            case 4:
                exit_free_memory(mess_p);
                break;
        
            default:
                printf("error menu mode !\n");
                break;
        }
    }
}

2.2 功能函数

其实功能函数这块基本都是指针的运用,没啥好说的,懂的都懂,后面会附上所有代码(仅供参考);其中需要说的地方就是,复式买法会构成很多种组合,这些组合数据需要怎么去计算呢?

那么就涉及到组合算法了,这里讲解下我的基本思路:由于有红球复式和蓝球复式的组合买法,我采取分别计算组合数的方法,先计算红球复式的所有组合数据(使用到了递归函数),然后在红球的组合数据中添加蓝球数据。举例,假如10个红球复式,2个蓝球复式,红球组合数就是10个选6个组合数据,就有210组数据,然后每组红球添加一个蓝球数据,添加两组,总共就420组数据了。代码如下:

/*************   红球组合   ****************/
void red_data_comb(message_t *mess,int red_data[],int temp_data[],int top)
{
    data_t *data_p = NULL;
    data_t *data_p1 = NULL;
    int i = 0,j = 0;
    if(top > mess->method.num_count[0]) {
        return;
    }

    if(red_data_index == 6) {
        data_p = (data_t *)&mess->data;
        if(mess->data.data[0] == 0) {      
            for(i = 0; i < 6; i++){
                data_p->data[i] = temp_data[i];
            }
            data_p->next = NULL;
        }
        else {
            while(data_p->next != NULL) {
                data_p = data_p->next;             
            }
            data_p1 = data_p;
            data_p = (data_t *)malloc(sizeof(data_t));
            data_p1->next = data_p;
            for(j = 0; j < 6; j++) {
                data_p->data[j] = temp_data[j];
            }
            data_p->next = NULL;
        }
        return;
    }

    temp_data[red_data_index++] = red_data[top];
    red_data_comb(mess,red_data,temp_data,top+1);
    red_data_index--;
    red_data_comb(mess,red_data,temp_data,top+1);
}

/************   红+蓝组合   ************/
void blue_data_comb(message_t *mess,int blue_data[])
{
    data_t *data_p = NULL;
    data_t *data_p1 = NULL;
    data_t *data_p2 = NULL;
    int red_comb_count = 0;
    int j = 0;
    int k = 0;

    if(mess->data.data[0] == 0){
        return;
    }
    data_p = (data_t *)&mess->data;
    data_p2 = data_p;
    for(int i = 0; i < mess->method.num_count[1]; i++){
        if(i == 0) {
            while(data_p->next != NULL) {
                data_p->data[6] = blue_data[i];
                red_comb_count++;
                data_p = data_p->next;
            }
            data_p->data[6] = blue_data[i];
            red_comb_count++;
            data_p1 = data_p;
        }
        else {
            for(j = 0; j < red_comb_count; j++) {
                data_p = (data_t *)malloc(sizeof(data_t));
                data_p1->next = data_p;
                data_p1 = data_p;
                for(k = 0; k < 7; k++) {
                    if(k < 6){
                        data_p->data[k] = data_p2->data[k];
                    }
                    else {
                        data_p->data[k] = blue_data[i];
                        data_p->next = NULL;
                        data_p2 = data_p2->next;
                    }    
                }
            }
            data_p2 = (data_t *)&mess->data;
        }
    }
}

/***********   组合号码   ************/
void comb_data(message_t *mess,int red_data[],int blue_data[])
{
    int temp_data[6] = {0};
    red_data_comb(mess,red_data,temp_data,0);
    blue_data_comb(mess,blue_data);
}

2.2.1  组合算法参考

int cur_index = 0;
int array[7]={1,2,3,4,5,6,7};
int data[7];

void comb(int index, int n, int m)
{
    int i = 0;

    if (index > n)
       return;

    if (cur_index == m) {
        for (i = 0; i < m; i++) {
            printf("%d", data[i]);
        }
        printf("\t");
        return ;
    }
    data[cur_index++] = array[index];
    comb(index+1, n, m);
    cur_index--;
    comb(index+1, n, m);
}

2.3  数据链表

组合数据是通过链表的方式一组一组链接起来的,每当多一个组合数据,就需要为data申请内存空间。菜单功能选择 1,买球前,判断之前是否有为存储个人数据申请过内存,如果有就先释放之前申请的空间,重新初始化data数据;假如购买前不释放掉内存,多玩几次申请的内存将会逐渐庞大。

/************  初始化购买数据  *************/
void clean_self_ball_data(message_t *per_mess)
{
    int i = 0;
    data_t *data_p = NULL;
    data_t *data_p1 = NULL;

    data_p = (data_t *)&per_mess->data;
    while(1) {
        for(i = 0;i < 7; i++){
            data_p->data[i] = 0;
        }
        data_p = data_p->next;
        if(data_p == NULL) {
            break;
        }
        if(data_p->next != NULL) {
            data_p1 = data_p->next;
            free(data_p);
            data_p = data_p1;
        }
        else {
            free(data_p);    
            per_mess->data.next = NULL;
            break;
        }
    }
}

2.4 总代码示例

代码仅供参考,代码从0到1,花了周末两天寥寥草草赶出来的,可能存在着一些问题,有些重复性代码,不喜勿喷。

/*************************************
 * Fuction:模拟双色球彩票系统
 * Author:Qurry
 * Date:12/4/2022
 * ***********************************/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>

#define ROBOT_SIM  50   //模拟机器人

typedef enum _method {
    MUL_NONE = 0,
    MUL_RED  = 1,   //红球复式
    MUL_BLUE,       //蓝球复式
    MUL_ALL,        //红蓝复式
}method_t;

typedef enum _level {
    LEVEL_NONE = 0,
    LEVEL_ONE  = 1,     //6+1: 一等奖  
    LEVEL_TWO,          //6+0
    LEVEL_THREE,        //5+1
    LEVEL_FOUR,         //5+0 || 4+1
    LEVEL_FIVE,         //4+0 || 3+1
    LEVEL_SIX,          //>0
}level_t;

typedef enum _money {
    RMB_NONE    =0,
    RMB_5       =5,
    RMB_10      =10,
    RMB_200     = 200,
    RMB_3K      = 3000,
    RMB_500W    = 5000000,
    RMB_1KW     = 10000000,
}money_t;

typedef struct _buy_method {
    unsigned int select;         //0:机选  1:自选
    method_t mul;                //复式买法
    unsigned int num_count[3];   //[0]:红球数量,[1]:蓝球数量,[2]组合数量
    unsigned int bet;            //倍数
}buy_method_t;

typedef struct _data {
    unsigned int data[7];
    struct _data *next;
}data_t;

typedef struct _message {
    char *name;                 //购买者姓名
    buy_method_t method;        //玩法
    data_t data;                //购买号码数据
    unsigned int money;         //花费金额
    unsigned int remain_money;  //剩余金额
    level_t win_level;          //中奖等级
}message_t;

typedef struct _win_mess {
    char *win_name;             //中奖人名
    level_t win_level;          //中奖等级
    struct _win_mess *next;
}win_mess_t;

typedef struct _shop_history {
    unsigned int date_no;       //开奖期数
    unsigned int result[7];     //开奖结果
    win_mess_t win;             //中奖名单
    struct _shop_history *next;
}shop_history_t;

typedef struct _shop_message {
    message_t all_message[1+ROBOT_SIM];     //顾客购买信息,模拟50人购买
    shop_history_t history;                 //开奖历史
}shop_message_t;

int red_data_index = 0;     //红球数据索引

/************  选择购买方式-机选或自选  *************/
void select_buy_way(shop_message_t *per_mess)
{
    char select[6];
    printf("Please entry select buy way(0:Auto  1:Self): ");
    while(1)
    {
        scanf("%s",select);
        if (atoi(select) == 0) {
            per_mess->all_message[0].method.select = 0;
            break;
        }
        else if(atoi(select) == 1) {
            per_mess->all_message[0].method.select = 1;
            break;
        }
        else {
            printf("error,entry again!\n");
        }
    }
}

/************   选复式买法  **************/
void select_method(shop_message_t *per_mess)
{
    char method[6];
    printf("Please entry select method(0:Normal   1:Red-mul   2:Blue-mul    3:Red & Blue): ");
    while(1)
    {
        scanf("%s",method);
        if (atoi(method) == 0) {
            per_mess->all_message[0].method.mul = MUL_NONE;
            break;
        }
        else if(atoi(method) == 1) {
            per_mess->all_message[0].method.mul = MUL_RED;
            break;
        }
        else if(atoi(method) == 2) {
            per_mess->all_message[0].method.mul = MUL_BLUE;
            break;
        }
        else if(atoi(method) == 3) {
            per_mess->all_message[0].method.mul = MUL_ALL;
            break;
        }
        else {
            printf("error,entry again!\n");
        }
    }    
}

/*************   总组合数   **************/
void data_comb_count(buy_method_t *method)
{
    int i = 0;
    int count_1 = 1;
    int count_2 = 1;
    int count = 0;

    for(i = method->num_count[0]; i > method->num_count[0]-6; i--) {
        count_1 *= i;
    }
    for(i = 6; i > 0; i--) {
        count_2 *=i;
    }
    count = count_1/count_2;    //红球组合数
    count *= method->num_count[1];
    method->num_count[2] = count;   //红蓝总组合数
}

/*************  输入购买红、蓝球数  ******************/
void entry_ball_count(shop_message_t *per_mess)
{
    char ball_count[6];
    per_mess->all_message[0].method.num_count[0] = 6;
    per_mess->all_message[0].method.num_count[1] = 1;

    if(per_mess->all_message[0].method.mul == MUL_RED) {
        printf("Please entry red ball count (7~20): ");
        while(1)
        {
            scanf("%s",ball_count);
            if((atoi(ball_count)> 6)&&(atoi(ball_count)< 21)) {
                per_mess->all_message[0].method.num_count[0] = atoi(ball_count);
                break;
            }
            else {
                printf("error,entry again!\n");
            }
        }
    }
    else if(per_mess->all_message[0].method.mul == MUL_BLUE) {
        printf("Please entry blue ball count (2~16): ");
        while(1)
        {
            scanf("%s",ball_count);
            if((atoi(ball_count)> 1)&&(atoi(ball_count)< 17)) {
                per_mess->all_message[0].method.num_count[1] = atoi(ball_count);
                break;
            }
            else {
                printf("error,entry again!\n");
            }
        }            
    }
    else if(per_mess->all_message[0].method.mul == MUL_ALL) {
        printf("Please entry red ball count (7~20): ");
        while(1)
        {
            scanf("%s",ball_count);
            if((atoi(ball_count)> 6)&&(atoi(ball_count)< 21)){
                per_mess->all_message[0].method.num_count[0] = atoi(ball_count);
                break;
            }
            else{
                printf("error,entry again!\n");
            }
        }

        printf("Please entry blue ball count (2~16): ");
        while(1)
        {
            scanf("%s",ball_count);
            if((atoi(ball_count)> 1)&&(atoi(ball_count)< 17)){
                per_mess->all_message[0].method.num_count[1] = atoi(ball_count);
                break;
            }
            else{
                printf("error,entry again!\n");
            }
        }            
    }   
    data_comb_count((buy_method_t *)&per_mess->all_message[0].method);
}

/*************   购买倍数   **************/
void buy_bet(shop_message_t *per_mess)
{
    char bet[6];
    printf("Please entry need buy bet(1~9): ");
    while(1)
    {
        scanf("%s",bet);
        if((atoi(bet) > 0) &&(atoi(bet) < 10)) {
            per_mess->all_message[0].method.bet = atoi(bet);
            break;
        }        
        else {
            printf("error,entry again!\n");
        }
    }
    per_mess->all_message[0].money = per_mess->all_message[0].method.bet 
                                    * per_mess->all_message[0].method.num_count[2] * 2;
    if(per_mess->all_message[0].remain_money > 0){
        per_mess->all_message[0].remain_money -= per_mess->all_message[0].money;
    }
    else {
        per_mess->all_message[0].remain_money = 100000;
    }   
}

/*************   红球组合   ****************/
void red_data_comb(message_t *mess,int red_data[],int temp_data[],int top)
{
    data_t *data_p = NULL;
    data_t *data_p1 = NULL;
    int i = 0,j = 0;
    if(top > mess->method.num_count[0]) {
        return;
    }

    if(red_data_index == 6) {
        data_p = (data_t *)&mess->data;
        if(mess->data.data[0] == 0) {      
            for(i = 0; i < 6; i++){
                data_p->data[i] = temp_data[i];
            }
            data_p->next = NULL;
        }
        else {
            while(data_p->next != NULL) {
                data_p = data_p->next;             
            }
            data_p1 = data_p;
            data_p = (data_t *)malloc(sizeof(data_t));
            data_p1->next = data_p;
            for(j = 0; j < 6; j++) {
                data_p->data[j] = temp_data[j];
            }
            data_p->next = NULL;
        }
        return;
    }

    temp_data[red_data_index++] = red_data[top];
    red_data_comb(mess,red_data,temp_data,top+1);
    red_data_index--;
    red_data_comb(mess,red_data,temp_data,top+1);
}

/************   红+蓝组合   ************/
void blue_data_comb(message_t *mess,int blue_data[])
{
    data_t *data_p = NULL;
    data_t *data_p1 = NULL;
    data_t *data_p2 = NULL;
    int red_comb_count = 0;
    int j = 0;
    int k = 0;

    if(mess->data.data[0] == 0){
        return;
    }
    data_p = (data_t *)&mess->data;
    data_p2 = data_p;
    for(int i = 0; i < mess->method.num_count[1]; i++){
        if(i == 0) {
            while(data_p->next != NULL) {
                data_p->data[6] = blue_data[i];
                red_comb_count++;
                data_p = data_p->next;
            }
            data_p->data[6] = blue_data[i];
            red_comb_count++;
            data_p1 = data_p;
        }
        else {
            for(j = 0; j < red_comb_count; j++) {
                data_p = (data_t *)malloc(sizeof(data_t));
                data_p1->next = data_p;
                data_p1 = data_p;
                for(k = 0; k < 7; k++) {
                    if(k < 6){
                        data_p->data[k] = data_p2->data[k];
                    }
                    else {
                        data_p->data[k] = blue_data[i];
                        data_p->next = NULL;
                        data_p2 = data_p2->next;
                    }    
                }
            }
            data_p2 = (data_t *)&mess->data;
        }
    }
}

/***********   组合号码   ************/
void comb_data(message_t *mess,int red_data[],int blue_data[])
{
    int temp_data[6] = {0};
    red_data_comb(mess,red_data,temp_data,0);
    blue_data_comb(mess,blue_data);
}

/************  初始化购买数据  *************/
void clean_self_ball_data(message_t *per_mess)
{
    int i = 0;
    data_t *data_p = NULL;
    data_t *data_p1 = NULL;

    data_p = (data_t *)&per_mess->data;
    while(1) {
        for(i = 0;i < 7; i++){
            data_p->data[i] = 0;
        }
        data_p = data_p->next;
        if(data_p == NULL) {
            break;
        }
        if(data_p->next != NULL) {
            data_p1 = data_p->next;
            free(data_p);
            data_p = data_p1;
        }
        else {
            free(data_p);    
            per_mess->data.next = NULL;
            break;
        }
    }
}

/*************   自选球号   ***************/
void self_select_data(shop_message_t *per_mess)
{
    char *guide_name = NULL;
    int red_data[33] = {0};
    int blue_data[16] = {0};
    int temp_data;
    int i = 0,j = 0;
    int ret = 0;
    char data_entry[6];

    clean_self_ball_data(&per_mess->all_message[0]);
    if(per_mess->all_message[0].name == NULL) {     //第一次玩需要输入购买者姓名
        printf("Please entry guide name : ");
        guide_name = (char *)malloc(20);
        scanf("%s",guide_name);
        per_mess->all_message[0].name = guide_name;
        if(per_mess->all_message[0].name == NULL) {
            printf("malloc fail!\n");
            exit(-1);
        }
        sprintf(per_mess->all_message[0].name,guide_name); 
    }

    while(i < per_mess->all_message[0].method.num_count[0])
    {   
        while(1)
        {
            printf("red ball data[%d]: ",i);
            scanf("%s",data_entry);
            temp_data = atoi(data_entry);
            while(j < i)
            {
                ret = 0;
                if(red_data[j++] == temp_data){
                    ret = 1;
                    j = 0;
                    break;
                }
            }
            if((temp_data > 0) && (temp_data < 34) && (ret == 0)) {
                red_data[i++] = temp_data;
                break;
            } 
            else {
                printf("entry data error or duplicate data,please entry again !\n");
            }               
        }    
    }
    i = 0;
    j = 0;
    while(i < per_mess->all_message[0].method.num_count[1])
    {   
        while(1)
        {
            printf("blue ball data[%d]: ",i);
            scanf("%s",data_entry);
            temp_data = atoi(data_entry);
            while(j < i)
            {
                ret = 0;
                if(blue_data[j++] == temp_data){
                    ret = 1;
                    j = 0;
                    break;
                }
            }
            if((temp_data > 0) && (temp_data < 17) && (ret == 0)) {
                blue_data[i++] = temp_data;
                break;
            } 
            else {
                printf("entry data error or duplicate data,please entry again !\n");
            }               
        }    
    }
    per_mess->all_message[0].win_level = LEVEL_NONE;
    comb_data((message_t *)&per_mess->all_message[0],red_data,blue_data);
}

/************   机选球号   ****************/
void auto_select_data(shop_message_t *per_mess)
{
    char *guide_name = NULL;
    int red_data[33] = {0};
    int blue_data[16] = {0};
    int is_repe = 0;

    clean_self_ball_data(&per_mess->all_message[0]);
    if(per_mess->all_message[0].name == NULL) {     //第一次玩需要输入购买者姓名
        guide_name = (char *)malloc(20);
        printf("Please entry guide name : ");
        scanf("%s",guide_name);
        per_mess->all_message[0].name = guide_name;
        if(per_mess->all_message[0].name == NULL) {
            printf("malloc fail!\n");
            exit(-1);
        }
        sprintf(per_mess->all_message[0].name,guide_name);
    }
    srand(time(NULL));
    for(int i = 0; i < per_mess->all_message[0].method.num_count[0]; i++) {
        while (1)
        {
            red_data[i] = rand()%33+1;
            for(int j = 0; j < i; j++) {
                if(red_data[i]==red_data[j]) {
                    is_repe = 1;
                    break;
                }
            }
            if(is_repe == 1){
                is_repe = 0;
                continue;
            }
            else{
                break;
            }
        }      
    }

    for(int x = 0; x < per_mess->all_message[0].method.num_count[1]; x++) {
        while (1)
        {
            blue_data[x] = rand()%16+1;
            for(int y = 0; y < x; y++) {
                if(blue_data[x]==blue_data[y]) {
                    is_repe = 1;
                    break;
                }
            }
            if(is_repe == 1){
                is_repe = 0;
                continue;
            }
            else{
                break;
            }
        }      
    }
    per_mess->all_message[0].win_level = LEVEL_NONE;
    comb_data((message_t *)&per_mess->all_message[0],red_data,blue_data);
}

/********   显示球票信息    *******/
void show_ball_bill(shop_message_t *per_mess)
{
    int i = 1;
    data_t *data_p = NULL;
    if(per_mess->all_message[0].data.data[0] == 0){
        printf("No buy ball,no data,sorry! \n");
        return;
    }

    data_p = (data_t *)&per_mess->all_message[0].data;
    while(1)
    {
        printf("ball comb-%d :",i++);
        for(int j = 0; j < 7;j++) {
            if(j < 6){
                printf("%-6d",data_p->data[j]);
            }
            else {
                printf("+%-6d\n",data_p->data[j]);
            }    
        }
        if(data_p->next != NULL) {
            data_p = data_p->next;
        }
        else {
            printf("cost money : %d(rmb)\n",per_mess->all_message[0].money);
            break;
        }
    }
}

/**********   中奖等级   **************/
int win_level(shop_message_t *mess,int index,int hit[2])
{
    int level = 0;
    unsigned int win_money = RMB_NONE;

    if((hit[0] == 6) && (hit[1] == 1)){
        level = LEVEL_ONE;
        win_money = RMB_1KW;
    }
    else if((hit[0] == 6) && (hit[1] == 0)){
        level = LEVEL_TWO;
        win_money = RMB_500W;
    }
    else if((hit[0] == 5) && (hit[1] == 1)){
        level = LEVEL_THREE;
        win_money = RMB_3K;
    }
    else if(((hit[0] == 5) && (hit[1] == 0))
            ||((hit[0] == 4) && (hit[1] == 1))){
        level = LEVEL_FOUR;
        win_money = RMB_200;
    }
    else if(((hit[0] == 4) && (hit[1] == 0))
            ||((hit[0] == 3) && (hit[1] == 1))){
        level = LEVEL_FIVE;
        win_money = RMB_10;
    }
    else if(((hit[0] == 2) && (hit[1] == 1))
            ||((hit[0] == 1) && (hit[1] == 1))
            ||((hit[0] == 0) && (hit[1] == 1))){
        level = LEVEL_SIX;
        win_money = RMB_5;
    }
    else{
        level = LEVEL_NONE;
    }
    mess->all_message[index].win_level = level;
    if(mess->all_message[index].name == mess->all_message[0].name ){
        mess->all_message[0].remain_money += (win_money * mess->all_message[0].method.bet);
    }
    return level;
}


/*********   中奖者检索   ********/
void ball_data_check_result(shop_message_t *mess)
{
    int i = 0, j = 0, k = 0, m = 0;
    int win_count = 0;          //中奖人数
    int hit_count[2] = {0,0};     //中奖球数  [0]:red-count  [1]:blue-count
    shop_history_t *history_p = NULL;
    data_t *data_p = NULL;
    win_mess_t *win_mess = NULL;
    win_mess_t *win_mess_p = NULL;

    history_p = (shop_history_t *)&mess->history;
    if(history_p->date_no == 0) {
        printf("No result...\n");
        return;
    }
    while(history_p->next != NULL) {
        history_p = history_p->next;
    }
 
    printf("/**********  winner-result   ************/\n");
    for(i = 0; i < (1+ROBOT_SIM); i++) {
        data_p = (data_t *)&mess->all_message[i].data;
        while(1) {
            for(j = 0; j < 7; j++) {    //开奖数据
                for(k = 0; k < 7; k++) {    //私人数据
                    if((j < 6) && (k < 6)) {
                        if(history_p->result[j] == data_p->data[k]) {
                            hit_count[0] += 1; 
                        }
                    }
                    else if((j == 6) && (k == 6)) {
                        if(history_p->result[j] == data_p->data[k]) {
                            hit_count[1] = 1; 
                        }
                    }
                }
            }
            if(data_p->next != NULL) {
                if(win_level(mess,i,hit_count) > 0) {
                    win_mess = (win_mess_t *)&history_p->win;
                    if(win_mess->win_name == NULL) {
                        win_mess->win_name = mess->all_message[i].name;
                        win_mess->win_level = mess->all_message[i].win_level;
                        win_mess->next = NULL;
                    }
                    else {
                        while(win_mess->next != NULL) {
                            win_mess = win_mess->next;
                        }
                        win_mess_p = (win_mess_t *)malloc(sizeof(win_mess_t));
                        win_mess->next = win_mess_p;
                        win_mess = win_mess_p;
                        win_mess->win_name = mess->all_message[i].name;
                        win_mess->win_level = mess->all_message[i].win_level;
                        win_mess->next = NULL;
                    }
                    printf("win-name : %s\nwin-level :%d\nball-num : ",
                            win_mess->win_name,win_mess->win_level); 
                    for(m = 0; m < 7; m++){
                        printf("%-5d",data_p->data[m]);
                    }
                    printf("\n"); 
                    win_count++;    
                }
                hit_count[0] = 0;
                hit_count[1] = 0; 
                data_p = data_p->next;
            }
            else {
                if(win_level(mess,i,hit_count) > 0) {
                    win_mess = (win_mess_t *)&history_p->win;
                    if(win_mess->win_name == NULL) {
                        win_mess->win_name = mess->all_message[i].name;
                        win_mess->win_level = mess->all_message[i].win_level;
                        win_mess->next = NULL;
                    }
                    else {
                        while(win_mess->next != NULL) {
                            win_mess = win_mess->next;
                        }
                        win_mess_p = (win_mess_t *)malloc(sizeof(win_mess_t));
                        win_mess->next = win_mess_p;
                        win_mess = win_mess_p;
                        win_mess->win_name = mess->all_message[i].name;
                        win_mess->win_level = mess->all_message[i].win_level;
                        win_mess->next = NULL;
                    }
                    sleep(1); 
                    printf("win-name : %s\nwin-level :%d\nball-num : ",
                            win_mess->win_name,win_mess->win_level); 
                    for(m = 0; m < 7; m++){
                        printf("%-5d",data_p->data[m]);
                    }
                    printf("\n"); 
                    win_count++;     
                }
                hit_count[0] = 0;
                hit_count[1] = 0; 
                break;
            }
        }      
    }
    if(win_count == 0) {
        printf("No Winner.\n");
    }
}

/************   个人买球操作指引    ************/
void personal_buy_ball(shop_message_t *per_mess)
{
    select_buy_way(per_mess);
    select_method(per_mess);
    entry_ball_count(per_mess);
    buy_bet(per_mess);
    if(per_mess->all_message[0].method.select == 0) {
        auto_select_data(per_mess);
    }
    else {
        self_select_data(per_mess);
    }
    show_ball_bill(per_mess);
}

/***********   机器人买法规则   ***************/
void robot_method(shop_message_t *sim_mess)
{   
    char *name = NULL; 
    for(int i= 1; i < (1+ROBOT_SIM); i++){
        name = (char *)malloc(10);
        sprintf(name,"robot-%d",i);
        sim_mess->all_message[i].name = name;
        sim_mess->all_message[i].method.bet = 6;
        sim_mess->all_message[i].money = 12;
        sim_mess->all_message[i].remain_money = 100000;
        sim_mess->all_message[i].method.mul = MUL_NONE;
        sim_mess->all_message[i].method.num_count[0] = 6;
        sim_mess->all_message[i].method.num_count[1] = 1;
        sim_mess->all_message[i].method.num_count[2] = 1;
    } 
}

/**********   模拟机器人购买数据    ***********/
void robots_sim_data(shop_message_t *sim_mess)
{
    int is_repe = 0;
    int k =0;
    int j = 0;

    srand(time(NULL));
    for(int i= 1; i < (1+ROBOT_SIM); i++) {
        for(j = 0; j < 7; j++) {
            while(1) {
                if(j <6) {
                    sim_mess->all_message[i].data.data[j] = rand()%33+1;
                }       
                else {
                    sim_mess->all_message[i].data.data[j] = rand()%16+1;
                    sim_mess->all_message[i].data.next = NULL;
                }     
                for(k = 0; k < j;k++) {
                    if(sim_mess->all_message[i].data.data[j] 
                        == sim_mess->all_message[i].data.data[k]) {
                            is_repe = 1;
                            break;
                        }
                }
                if(is_repe == 1) {
                    is_repe = 0;
                    continue;
                }
                else {
                    break;
                }
            }
        }
        sim_mess->all_message[i].win_level = LEVEL_NONE;
    }
}

/**********   模拟机器人买彩票   ***************/
void robot_sim_buy_ball(shop_message_t *sim_mess)
{
    robot_method(sim_mess);
    robots_sim_data(sim_mess);
}

/************   摇号开奖    *************/
void ball_lottery(shop_message_t *mess)
{
    int i = 0,j = 0;
    int is_repe = 0;
    shop_history_t * history = NULL;
    shop_history_t * history_p = NULL;

    srand(time(NULL));
    printf("\nRunning balls now... \n ");
    printf("red-balls : ");
    if(mess->history.date_no == 0) {
        mess->history.date_no = 1;
        for(i = 0; i < 7; i++) {
            while(1) {
                if(i < 6) {
                    mess->history.result[i] = rand()%33+1;
                }
                else {
                    printf("\tblue-ball : ");
                    mess->history.result[i] = rand()%16+1;
                }
                for(j = 0; j < i; j++) {
                    if((i < 6)&&(j < 6)) {
                        if(mess->history.result[j] == mess->history.result[i]) {
                            is_repe = 1;
                            break;
                        }
                    }    
                }
                if(is_repe) {
                    is_repe = 0;
                    continue;
                }
                else {
                    sleep(3);
                    printf("%-4d",mess->history.result[i]);
                    break;
                }
            }    
        }
        mess->history.next = NULL;
    }
    else {
        history = (shop_history_t *)malloc(sizeof(shop_history_t));
        for(i = 0; i < 7; i++) {
            while(1) {
                if(i < 6) {
                    history->result[i] = rand()%33+1;
                }
                else {
                    printf("\tblue-ball : ");
                    history->result[i] = rand()%16+1;
                }
                for(j = 0; j < i; j++) {
                    if((i < 6)&&(j < 6)){
                        if(history->result[j] == history->result[i]) {
                            is_repe = 1;
                            break;
                        }
                    }    
                }
                if(is_repe) {
                    is_repe = 0;
                    continue;
                }
                else {
                    sleep(3);
                    printf("%-4d",history->result[i]);
                    break;
                }
            }    
        }
        history_p = (shop_history_t *)&mess->history;
        while(history_p->next != NULL) {
            history_p = history_p->next;
        } 
        history->date_no = history_p->date_no +1;
        history_p->next = history;
        history->win.win_name = NULL;
        history->win.next = NULL;
        history->next = NULL;
    }
    printf("\n");
}

/************   彩票导购系统   **************/
void shop_guide_system(shop_message_t *mess)
{
    personal_buy_ball(mess);
    robot_sim_buy_ball(mess);
    for(int i = 3; i > 0;i--){
        printf("%d...",i);
        sleep(1);
    }
    ball_lottery(mess);
    ball_data_check_result(mess);
    printf("\n");
}

/************   查询中奖等级   ***************/
void show_self_result(shop_message_t *mess)
{
    unsigned int count[7] = {0};
    win_mess_t *win_mess = NULL;   
    shop_history_t *history_p = (shop_history_t *)&mess->history;

    if(mess->history.date_no == 0) {
        return ;
    }
    while(history_p->next != NULL){
        history_p = history_p->next;
    }    
    win_mess = (win_mess_t *)&history_p->win;
    if(win_mess->win_name == NULL){
        return;
    }    
    while(1) {
        if(strcmp(win_mess->win_name,mess->all_message[0].name) == 0){
            if(win_mess->win_level == LEVEL_ONE) {
                count[1]++;
            }
            else if(win_mess->win_level == LEVEL_TWO) {
                count[2]++;
            }
            else if(win_mess->win_level == LEVEL_THREE) {
                count[3]++;
            }
            else if(win_mess->win_level == LEVEL_FOUR) {
                count[4]++;
            }
            else if(win_mess->win_level == LEVEL_FIVE) {
                count[5]++;
            }
            else if(win_mess->win_level == LEVEL_SIX) {
                count[6]++;
            }
            count[0]++;
        }
        if(win_mess->next != NULL) {
            win_mess = win_mess->next;
        }
        else {
            break;
        }    
    }
    if(count[0] == 0){
        printf("\nYou are not win,Hahahaha....\n");
    }
    else {
        if(count[1] > 0){
            printf("\nwin-level-1: x %d\n",count[1]);
        }
        if(count[2] > 0){
            printf("\nwin-level-2: x %d\n",count[2]);
        }
        if(count[3] > 0){
            printf("\nwin-level-3: x %d\n",count[3]);
        }
        if(count[4] > 0){
            printf("\nwin-level-4: x %d\n",count[4]);
        }
        if(count[5] > 0){
            printf("\nwin-level-5: x %d\n",count[5]);
        }
        if(count[6] > 0){
            printf("\nwin-level-6: x %d\n",count[6]);
        }    
    }
}

/***********    显示彩票信息及结果    **************/
void show_self_ball_result(shop_message_t *per_mess)
{
    show_ball_bill(per_mess);
    show_self_result(per_mess);
    sleep(3);   //显示3秒回到功能菜单
}

/************   显示开奖历史    ***************/
void show_ball_history(shop_message_t *sys_mess)
{
    int i = 0;
    shop_history_t *history = NULL;
    
    history = (shop_history_t *)&sys_mess->history;
    if(history->date_no == 0) {
        printf("No ball history message !\n");
        return;
    }
    printf("\n");
    while(1) {
        printf("NO.%d : ",history->date_no);
        for(i = 0; i < 7; i++) {
            printf("%-5d",history->result[i]);
        }
        printf("\n");
        if(history->next != NULL) {
            history = history->next;
        }
        else {
            break;
        }
    }
    sleep(3);
}

/************   退出释放申请的内存   **************/
void exit_free_memory(shop_message_t *mess)
{
    int i = 0;
    data_t *data_p = NULL;
    data_t *data_p1 = NULL;
    shop_history_t *history_p = NULL;
    shop_history_t *history_p1 = NULL;

    if(mess->history.date_no == 0) {
        exit(0) ;
    }

    for(i = 0; i < (1 + ROBOT_SIM); i++) {
        free(mess->all_message[i].name);    //释放name内存
    }

    data_p = (data_t *)&mess->all_message[i].data;
    while(1) {
        if(data_p->next != NULL) {
            data_p1 = data_p->next;
            free(data_p);               //释放数据内存
            data_p = data_p1;
        }
        else {
            free(data_p);
            break;
        }
    }

    history_p = (shop_history_t *)&mess->history;
    while(1) {
        if(history_p->next != NULL) {
            history_p1 = history_p->next;
            free(history_p);
            history_p = history_p1;
        }
        else {
            free(history_p);
            break;
        }
    }
    printf("\nfree memory over,bye. \n");
    exit(0);
}

void show_remain_money(shop_message_t *mess)
{
    printf("%s :\n",mess->all_message[0].name);
    printf("You are remain money : %d (RMB)\n",mess->all_message[0].remain_money);
    sleep(3);
    printf("\n");
}

/***********  系统功能选择   ***************/
char system_menu()
{
    char mode_p[6];
    int meun_mode;

    printf("/********************************************************************/\n");
    printf("                       Dual Color Ball System                         \n");
    printf("/********************************************************************/\n");
    printf("1:Buy-ball   2:Self-result   3:Ball-history    4:Remain-money   5.Exit\n");
    printf("Entry mode :");
    scanf("%s",mode_p);
    meun_mode = atoi(mode_p);
    return meun_mode;
}

/**********   结构体数据初始化   ************/
void init_struct_data(shop_message_t *mess)
{
    mess->history.date_no = 0;
    mess->history.next = NULL;
    mess->all_message[0].name = NULL;
    mess->all_message[0].remain_money = 100000; 
    mess->all_message[0].data.data[0] = 0;
    mess->all_message[0].data.next = NULL;
    mess->history.win.win_name = NULL;
    mess->history.win.next = NULL;
}

void main()
{
    char menu_mode ;
    shop_message_t message;
    shop_message_t *mess_p = &message;
    init_struct_data(mess_p);
    while(1)
    {
        menu_mode = system_menu();
        switch (menu_mode)
        {
            case 1:
                shop_guide_system(mess_p);
                break;

            case 2:
                show_self_ball_result(mess_p);
                break;

            case 3:
                show_ball_history(mess_p);
                break;

            case 4:
                show_remain_money(mess_p);
                break;

            case 5:
                exit_free_memory(mess_p);
                break;
        
            default:
                printf("error menu mode !\n");
                break;
        }
    }
}

3. 代码测试结果

输入信息后按击确认键进入下一步,测试的时候尽量复式数填少一点,不然组合数过大,申请的内存占用大;退出进程的时候,菜单功能输入数字4,会释放申请的内存再退出进程。

猜你喜欢

转载自blog.csdn.net/weixin_49576307/article/details/128181236