前言
近期有朋友双色球中了个小奖,所以临时兴起,写了个模拟双色球系统玩玩,购买规则、开奖以及中奖等级均模仿现实规则,小部分玩法自定。
开发此系统需要熟悉 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,会释放申请的内存再退出进程。