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+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语言模拟双色球系统开发相关推荐
- 用C语言模拟双色球开奖
用c语言模拟双色球开奖 问题描述: /* 双色球是中国福利彩票目前最火的一种玩法.而彩票是以抽签给奖方式进行筹款或敛财所发行的凭证,并非是赌博,每天都有上亿的彩民关注着双色球的开奖结果.其彩票投注区分 ...
- 47-Java编程案例七:双色球系统开发
案例七:双色球系统开发[拓展案例] 需求: 随机生成一组中奖号码 投注号码由6个红色球号码和1个蓝色球号码组成. 红色球号码从 1-33 中选择:蓝色球号码从 1-16 中选择. 分析: 中奖号码由6 ...
- SkyEye(一种软件模拟的系统开发平台)
一.SkyEye介绍 1.SkyEye的起源和发展 2002年11月,一个偶然的机会,一群操作系统的爱好者在网上进行聊天,成立了一个TM-Linux兴趣小组,希望要做一些感兴趣的事情.当时在清华大学计 ...
- C语言宠物领养系统,开发一个去中心化应用Dapp-宠物领养
1. 参考资料 http://truffleframework.com/tutorials/pet-shop 这是一个使用以太坊开发的完整的去中心化应用(Dapp),出自tuffle suite. P ...
- java编程练习:模拟双色球系统
投注号码由6个红色球号码和1个蓝色球号码组成.红色球号码从1-33中选择(不重复),蓝色球号码从1-16中选择(可与红色球号码重复) 中奖条件与奖金对照表: 思路:1.随机生成一组中奖号码 2.用户输 ...
- 案例7:双色球系统开发
kage com.itheima;import java.util.Random; import java.util.Scanner;public class Test6 {public static ...
- java实现双色球系统
题目描述: 思路分析: 1.首先要定义一个方法生成7位随机数字的中奖号码 2.然后定义一个方法来获取用户输入的7位号码 3.再定义一个方法来判断中奖情况 4.定义一个方法将中奖号码和用户投注号码打印出 ...
- Java开发的模拟双色球抽奖程序 功能非常齐全 完整源码
今天为大家分享一个java语言编写的模拟双色球抽奖程序,目前系统功能已经很全面,后续会进一步完善.整个系统界面漂亮,有完整得源码,希望大家可以喜欢.喜欢的帮忙点赞和关注.一起编程.一起进步 开发环境 ...
- 大学android移动开发笔记,基于Android的移动模拟练习系统的设计与实现
李思莉 聂芝献 摘要:该文主要论述基于Android的移动模拟练习系统的功能设计及数据设计.数据实现.该系统客户端使用基于Android的移动应用开发技术,服务器端采用JAVA WEB+MySQL技术 ...
最新文章
- Oracle Database 11g的使用
- 胡言乱语集锦-大数据,手机,传统,养生
- SPRING CLOUD服务网关之ZUUL
- java abstractnumlist_如何从List集合中删除对象
- 女生学师范还是计算机,本人专业是计算机科学与技术师范类,女生,不知道是考研还是工作什么的,今年开学大三,希望大家提点意见...
- 解决Windows下运行出现ModuleNotFoundError: No module named xxx问题
- 13位数字转日期 oracle_12amp;13. 整数转罗马数字 - 中等amp;简单
- 【SpringMVC】SpringMVC : 注解 @EnableWebMvc
- c语言实现单链表数据结构,数据结构与算法-C语言实现单链表,以及单链表的常用方法...
- 实验三 进程调度模拟程序
- 【空间】C++内存管理
- 20200719每日一句
- linux平台h5手游源码下载,十年经典大天使之剑H5手游源码手工端+内充+搭建教程...
- 【嵌入式Linux应用开发】移植LVGL到Linux开发板
- vue中的横向排列_vue + ElementUI 的横向表格代码
- CAN、CAN FD
- (四)Python中随机森林的实现与解释
- 钣金缺口lisp_方圆段钣金展开的AutoLisp编程方法
- 头条号运营技巧,百万爆文运营经验分享
- PHP Web项目开发学习,经验谈
热门文章
- 乐优13天UnmappedTerms cannot be cast to org.elasticsearch.search.aggregations.bucket.terms.StringTerms
- Windows OpenGL ES 图像绿幕抠图
- 无界(wujie)微前端实现及三种通信方式介绍
- 一对一视频聊天app开发如何避免踩雷
- [Python] 3.7中的dataclasses
- FPGA数字信号处理(十五)多速率FIR滤波器
- 利用大纲级别自动生成目录的步骤
- Java安全架构____java的Keytool工具Oracle官方说明文档
- w ndows8怎么连接网络,关于windows8连接wifi显示 无法连接到此网络
- Scrum Master PSM考试题目分享 Part 4