没事,写个猜数的小游戏

呵呵!以前做的一课C++程序里一段代码,无事,做成一个GUI界面的!
没什么技术含量。源代码工程与编译后的程序,大家都可以从附件里下载,打包在一起了!
主要是在初始化时,设置一下变量,然后在“生成”时,执行一下随机数的生成,然后在“OK”时,进行一下比较,然后根据设置进行提示信息的输出!

程序的游戏界面如下:

进程进行了一些优化:
[color=#FF0000]1、增加了随机数的生成
2、改进了游戏的规则与提示[/color]

把三个主要的函数帖在这里吧([color=#0000FF]修改后的,呵呵[/color]):
1、初始化函数


void InitialDialog(HWND hDlg){
  HICON hIcon=LoadIcon(g_hInst,MAKEINTRESOURCE(IDI_MAIN));
  SendMessage(hDlg,WM_SETICON,ICON_BIG,(LPARAM)hIcon);
  SendMessage(hDlg,WM_SETICON,ICON_SMALL,(LPARAM)hIcon);
  SetWindowText(hDlg,TEXT("猜数小游戏"));

  SetDlgItemInt(hDlg,IDC_NUM,100,TRUE);
  SetDlgItemInt(hDlg,IDC_MIN,0,TRUE);
  SetDlgItemInt(hDlg,IDC_MAX,100,TRUE);

  TCHAR szTip[]="\
  1、当你所猜测的数字距离>=100时,减去20有效分\r\n\
  2、当你所猜测的数字距离<100且>=50时,减去10有效分\r\n\
  3、当你所猜测的数字距离<50且>=20时,减去5有效分\r\n\
  4、当你所猜测的数字距离<20且>=10时,减去3有效分\r\n\
  5、当你所猜测的数字距离<10且>=5时,减去2有效分\r\n\
  6、当你所猜测的数字距离在范围5之内,减去1有效分\r\n\r\n\
    全部猜测的次数最多只是10*(范围/100),即如果你的范围域是200,则是10*200/100=20次。猜中后会弹出一个提示框!\r\n\r\n\
                2009-3-9 IaWeN";
  SetDlgItemText(hDlg,IDC_TIP,szTip);

  g_hStatus=CreateStatusWindow(WS_CHILD|WS_VISIBLE|SBS_SIZEGRIP,NULL,hDlg,IDC_MYSTATUS);
  if(g_hStatus==NULL)
    MessageBox(NULL,TEXT("status"),TEXT("status"),0);
  int pInt[]={250,-1};
  SendMessage(g_hStatus,SB_SETPARTS,2,(LPARAM)pInt);

  SendMessage(g_hStatus,SB_SETTEXT,0,(LPARAM)TEXT("  Author:iawen   博客:"));
  SendMessage(g_hStatus,SB_SETTEXT,1,(LPARAM)TEXT("  准备就绪……"));
  srand((unsigned)time(NULL));
}

2、随机数生成函数


void GenericRandNum(HWND hDlg){
  int max,min;
  BOOL bFlag;
  min=GetDlgItemInt(hDlg,IDC_MIN,&bFlag,FALSE);
  max=GetDlgItemInt(hDlg,IDC_MAX,&bFlag,FALSE);

  //生成随机数,并传递给控件
  int ary[1000];
  for(int i=0;i<1000;i++){
    ary[i]=(((double) rand() / (double) RAND_MAX) * max + min);
  }
  int MagNum=ary[(int)(((double) rand() / (double) RAND_MAX) * 1000 + 0)];
  SetDlgItemInt(hDlg,IDC_RANDNUM,MagNum,FALSE);    //设置此次需要猜测的目标并隐藏
  ShowWindow(GetDlgItem(hDlg,IDC_RANDNUM),SW_HIDE);

  count=0;
  int tmp=max-min;
  mid=tmp;
  while(tmp/=2)    //初始化计数器
    ++count;

  jifen=mid;      ////初始化有效分
  SetDlgItemInt(hDlg,IDC_NUM,jifen,TRUE);

  TCHAR szTip[100];
  memset(szTip,0,100);
  wsprintf(szTip,TEXT("->:初始化完毕!总次数是:%d,有效分是:%d "),count,jifen);
  SendMessage(g_hStatus,SB_SETTEXT,1,(LPARAM)szTip);
  HWND hList=GetDlgItem(hDlg,IDC_INFO);
  while(SendMessage(hList,LB_GETCOUNT,0,0)){
    SendMessage(hList,LB_DELETESTRING,0,0);
  }
  SendMessage(hList,LB_ADDSTRING,0,(LPARAM)szTip);
}

3、比较函数


void EnterYourNum(HWND hDlg){
  int num,MagNum;
  BOOL bFlag;
  num=GetDlgItemInt(hDlg,IDC_GUESSNUM,&bFlag,FALSE);
  MagNum=GetDlgItemInt(hDlg,IDC_RANDNUM,&bFlag,FALSE);

  --count;  //可用次数减1
  int tmp=0;
  if(MagNum>num)
    tmp=MagNum-num;
  else
    tmp=num-MagNum;

  TCHAR szTip[100];
  memset(szTip,0,100);
  if(tmp==0){
    wsprintf(szTip,"恭喜,你猜中了!\r\n你只用了 %d 次,且积分还剩 %d,非常幸运!",count,jifen);
    MessageBox(hDlg,szTip,TEXT("恭喜,你猜中了"),0);
    ShowWindow(GetDlgItem(hDlg,IDC_RANDNUM),SW_SHOWNORMAL);
    return;
  }

  if(count<=0 || jifen<=0){
    SendMessage(g_hStatus,SB_SETTEXT,1,(LPARAM)("  Sorry,你的猜测次数或者有效分已经用完了!"));
    MessageBox(hDlg,TEXT("Sorry,你的猜测次数或者有效分已经用完了"),TEXT("提示信息"),0);
    ShowWindow(GetDlgItem(hDlg,IDC_RANDNUM),SW_SHOWNORMAL);
    return;
  }

  int current=mid;
  while(current/=2){
    if(tmp>=current)
      break;
  }
  jifen-=current;

  wsprintf(szTip,TEXT("剩:%d 次,有效分-%d,偏差大于:%d,所猜数为:%d"),count,current,current,num);
  SetDlgItemInt(hDlg,IDC_NUM,jifen,TRUE);
  HWND hList=GetDlgItem(hDlg,IDC_INFO);
  SendMessage(hList,LB_ADDSTRING,0,(LPARAM)szTip);

  memset(szTip,0,100);
  wsprintf(szTip,TEXT("->:你本次猜测的数字是:%d"),num);
  SendMessage(g_hStatus,SB_SETTEXT,1,(LPARAM)szTip);
}

GuessNum_Code.rar

更新后的游戏程序(2009-3-10):
GuessNum.rar

“没事,写个猜数的小游戏”的一个回复

发表评论