前言

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

开发此系统需要熟悉 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+0LEVEL_THREE,        //5+1LEVEL_FOUR,         //5+0 || 4+1LEVEL_FIVE,         //4+0 || 3+1LEVEL_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+0LEVEL_THREE,        //5+1LEVEL_FOUR,         //5+0 || 4+1LEVEL_FIVE,         //4+0 || 3+1LEVEL_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-countshop_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,会释放申请的内存再退出进程。

C语言模拟双色球系统开发相关推荐

  1. 用C语言模拟双色球开奖

    用c语言模拟双色球开奖 问题描述: /* 双色球是中国福利彩票目前最火的一种玩法.而彩票是以抽签给奖方式进行筹款或敛财所发行的凭证,并非是赌博,每天都有上亿的彩民关注着双色球的开奖结果.其彩票投注区分 ...

  2. 47-Java编程案例七:双色球系统开发

    案例七:双色球系统开发[拓展案例] 需求: 随机生成一组中奖号码 投注号码由6个红色球号码和1个蓝色球号码组成. 红色球号码从 1-33 中选择:蓝色球号码从 1-16 中选择. 分析: 中奖号码由6 ...

  3. SkyEye(一种软件模拟的系统开发平台)

    一.SkyEye介绍 1.SkyEye的起源和发展 2002年11月,一个偶然的机会,一群操作系统的爱好者在网上进行聊天,成立了一个TM-Linux兴趣小组,希望要做一些感兴趣的事情.当时在清华大学计 ...

  4. C语言宠物领养系统,开发一个去中心化应用Dapp-宠物领养

    1. 参考资料 http://truffleframework.com/tutorials/pet-shop 这是一个使用以太坊开发的完整的去中心化应用(Dapp),出自tuffle suite. P ...

  5. java编程练习:模拟双色球系统

    投注号码由6个红色球号码和1个蓝色球号码组成.红色球号码从1-33中选择(不重复),蓝色球号码从1-16中选择(可与红色球号码重复) 中奖条件与奖金对照表: 思路:1.随机生成一组中奖号码 2.用户输 ...

  6. 案例7:双色球系统开发

    kage com.itheima;import java.util.Random; import java.util.Scanner;public class Test6 {public static ...

  7. java实现双色球系统

    题目描述: 思路分析: 1.首先要定义一个方法生成7位随机数字的中奖号码 2.然后定义一个方法来获取用户输入的7位号码 3.再定义一个方法来判断中奖情况 4.定义一个方法将中奖号码和用户投注号码打印出 ...

  8. Java开发的模拟双色球抽奖程序 功能非常齐全 完整源码

    今天为大家分享一个java语言编写的模拟双色球抽奖程序,目前系统功能已经很全面,后续会进一步完善.整个系统界面漂亮,有完整得源码,希望大家可以喜欢.喜欢的帮忙点赞和关注.一起编程.一起进步 开发环境 ...

  9. 大学android移动开发笔记,基于Android的移动模拟练习系统的设计与实现

    李思莉 聂芝献 摘要:该文主要论述基于Android的移动模拟练习系统的功能设计及数据设计.数据实现.该系统客户端使用基于Android的移动应用开发技术,服务器端采用JAVA WEB+MySQL技术 ...

最新文章

  1. Oracle Database 11g的使用
  2. 胡言乱语集锦-大数据,手机,传统,养生
  3. SPRING CLOUD服务网关之ZUUL
  4. java abstractnumlist_如何从List集合中删除对象
  5. 女生学师范还是计算机,本人专业是计算机科学与技术师范类,女生,不知道是考研还是工作什么的,今年开学大三,希望大家提点意见...
  6. 解决Windows下运行出现ModuleNotFoundError: No module named xxx问题
  7. 13位数字转日期 oracle_12amp;13. 整数转罗马数字 - 中等amp;简单
  8. 【SpringMVC】SpringMVC : 注解 @EnableWebMvc
  9. c语言实现单链表数据结构,数据结构与算法-C语言实现单链表,以及单链表的常用方法...
  10. 实验三 进程调度模拟程序
  11. 【空间】C++内存管理
  12. 20200719每日一句
  13. linux平台h5手游源码下载,十年经典大天使之剑H5手游源码手工端+内充+搭建教程...
  14. 【嵌入式Linux应用开发】移植LVGL到Linux开发板
  15. vue中的横向排列_vue + ElementUI 的横向表格代码
  16. CAN、CAN FD
  17. (四)Python中随机森林的实现与解释
  18. 钣金缺口lisp_方圆段钣金展开的AutoLisp编程方法
  19. 头条号运营技巧,百万爆文运营经验分享
  20. PHP Web项目开发学习,经验谈

热门文章

  1. 乐优13天UnmappedTerms cannot be cast to org.elasticsearch.search.aggregations.bucket.terms.StringTerms
  2. Windows OpenGL ES 图像绿幕抠图
  3. 无界(wujie)微前端实现及三种通信方式介绍
  4. 一对一视频聊天app开发如何避免踩雷
  5. [Python] 3.7中的dataclasses
  6. FPGA数字信号处理(十五)多速率FIR滤波器
  7. 利用大纲级别自动生成目录的步骤
  8. Java安全架构____java的Keytool工具Oracle官方说明文档
  9. w ndows8怎么连接网络,关于windows8连接wifi显示 无法连接到此网络
  10. Scrum Master PSM考试题目分享 Part 4