📄 guessdlg.cpp
字号:
// GuessDlg.cpp : implementation file
//
#include<CString>
#include "stdafx.h"
#include "Guess.h"
#include "GuessDlg.h"
#include <stdio.h>
#include <sys/timeb.h>
#include <time.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGuessDlg dialog
CGuessDlg::CGuessDlg(CWnd* pParent /*=NULL*/)
: CDialog(CGuessDlg::IDD, pParent)
{
count=0;
number[0]=' ';
number[1]=' ';
number[2]=' ';
number[3]=' ';
GameState=1;
ButtonControl=TRUE;
InitializeNumber();
//{{AFX_DATA_INIT(CGuessDlg)
m_strResult1 = _T("");
m_strResult2 = _T("");
m_strResult3 = _T("");
m_strResult4 = _T("");
m_strResult5 = _T("");
m_strResult6 = _T("");
m_strResult7 = _T("");
m_strResult8 = _T("");
m_strKey = _T("");
m_strDis = _T("");
m_nChance = 8;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CGuessDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CGuessDlg)
DDX_Text(pDX, IDC_EDIT_Result1, m_strResult1);
DDV_MaxChars(pDX, m_strResult1, 20);
DDX_Text(pDX, IDC_EDIT_Result2, m_strResult2);
DDV_MaxChars(pDX, m_strResult2, 20);
DDX_Text(pDX, IDC_EDIT_Result3, m_strResult3);
DDV_MaxChars(pDX, m_strResult3, 20);
DDX_Text(pDX, IDC_EDIT_Result4, m_strResult4);
DDV_MaxChars(pDX, m_strResult4, 20);
DDX_Text(pDX, IDC_EDIT_Result5, m_strResult5);
DDV_MaxChars(pDX, m_strResult5, 20);
DDX_Text(pDX, IDC_EDIT_Result6, m_strResult6);
DDV_MaxChars(pDX, m_strResult6, 20);
DDX_Text(pDX, IDC_EDIT_Result7, m_strResult7);
DDV_MaxChars(pDX, m_strResult7, 20);
DDX_Text(pDX, IDC_EDIT_Result8, m_strResult8);
DDV_MaxChars(pDX, m_strResult8, 20);
DDX_Text(pDX, IDC_EDIT1_Key, m_strKey);
DDV_MaxChars(pDX, m_strKey, 7);
DDX_Text(pDX, IDC_EDIT_Display, m_strDis);
DDV_MaxChars(pDX, m_strDis, 7);
DDX_Text(pDX, IDC_EDIT_Chance, m_nChance);
DDV_MinMaxInt(pDX, m_nChance, 0, 8);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CGuessDlg, CDialog)
//{{AFX_MSG_MAP(CGuessDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_Confirm, OnConfirm)
ON_BN_CLICKED(IDC_BUTTON_Ce, OnCe)
ON_BN_CLICKED(IDC_BUTTON_NewGame, OnNewGame)
ON_BN_CLICKED(IDC_BUTTON0, OnButton0)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
ON_BN_CLICKED(IDC_BUTTON5, OnButton5)
ON_BN_CLICKED(IDC_BUTTON6, OnButton6)
ON_BN_CLICKED(IDC_BUTTON7, OnButton7)
ON_BN_CLICKED(IDC_BUTTON8, OnButton8)
ON_BN_CLICKED(IDC_BUTTON9, OnButton9)
ON_BN_CLICKED(IDC_BUTTON_Help, OnBUTTONHelp)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGuessDlg message handlers
BOOL CGuessDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CGuessDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CGuessDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CGuessDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
//////////////////////////////////////////////////////////////////////////////////
//////////////////////确认输入的四个数字,然后调用NumberCompare函数,判断结果.
//////////////////////最后改变一些数据
void CGuessDlg::OnConfirm()
{
if(!ButtonControl)
return;
if(number[0]==' '||number[1]==' '||number[2]==' '||number[3]==' ')
{
MessageBox("请输入四个数字!\n 然后按 \"确定\"!");
return;
}
if(number[0]==number[1]||number[0]==number[2]||number[0]==number[3]||number[1]==number[2]||number[1]==number[3]||number[2]==number[3])
{
MessageBox("请输入四个不同数字!\n然后按 \"确定\"!");
return;
}
switch(m_nChance)
{
case 8:NumCompare(m_strResult1);break;
case 7:NumCompare(m_strResult2);break;
case 6:NumCompare(m_strResult3);break;
case 5:NumCompare(m_strResult4);break;
case 4:NumCompare(m_strResult5);break;
case 3:NumCompare(m_strResult6);break;
case 2:NumCompare(m_strResult7);break;
case 1:NumCompare(m_strResult8);break;
default:break;
}
//////////////////////////////////////////////////////////////////////
///// Change some parameter
count=0;
m_strDis="";
for(int i=0;i<4;i++)
number[i]=' ';
m_nChance--;
if(m_nChance==0&&ButtonControl)
{
GameState=0;
ButtonControl=FALSE;
m_strKey=CString(key_num[0])+" "+CString(key_num[1])
+" "+CString(key_num[2])+" "+CString(key_num[3]);
UpdateData(FALSE);
MessageBox("游戏结束!\n再接再厉!");
return;
}
UpdateData(FALSE);
// TODO: Add your control notification handler code here
}
///////////////////////////////////////////////////////////
///////////////////删除一个数字
void CGuessDlg::OnCe()
{
if(count==0&&number[count]==' ')
return;
if(ButtonControl)
{
if(count==0)
count=3;
else
count--;
number[count]=' ';
m_strDis=CString(number[0])+" "+CString(number[1])+" "+CString(number[2])+" "+CString(number[3]);
UpdateData(FALSE);
}
// TODO: Add your control notification handler code here
}
////////////////////////////////////////////////////
///////////重新游戏,初始化所有变量
void CGuessDlg::OnNewGame()
{
count=0;
number[0]=' ';
number[1]=' ';
number[2]=' ';
number[3]=' ';
GameState=1;
ButtonControl=TRUE;
InitializeNumber();
m_strResult1 = _T("");
m_strResult2 = _T("");
m_strResult3 = _T("");
m_strResult4 = _T("");
m_strResult5 = _T("");
m_strResult6 = _T("");
m_strResult7 = _T("");
m_strResult8 = _T("");
m_strKey = _T("");
m_strDis = _T("");
m_nChance = 8;
UpdateData(FALSE);
}
///////////////////////////////////////////////////////////////////////
/////////////用来输入数字
void CGuessDlg::OnButton0()
{
if(ButtonControl)
set_num('0');
else
return;
// TODO: Add your control notification handler code here
}
void CGuessDlg::OnButton1()
{
if(ButtonControl)
set_num('1');
else
return;
// TODO: Add your control notification handler code here
}
void CGuessDlg::OnButton2()
{
if(ButtonControl)
set_num('2');
else
return;
// TODO: Add your control notification handler code here
}
void CGuessDlg::OnButton3()
{
if(ButtonControl)
set_num('3');
else
return;
// TODO: Add your control notification handler code here
}
void CGuessDlg::OnButton4()
{
if(ButtonControl)
set_num('4');
else
return;
// TODO: Add your control notification handler code here
}
void CGuessDlg::OnButton5()
{
if(ButtonControl)
set_num('5');
else
return;
// TODO: Add your control notification handler code here
}
void CGuessDlg::OnButton6()
{
if(ButtonControl)
set_num('6');
else
return;
// TODO: Add your control notification handler code here
}
void CGuessDlg::OnButton7()
{
if(ButtonControl)
set_num('7');
else
return;
// TODO: Add your control notification handler code here
}
void CGuessDlg::OnButton8()
{
if(ButtonControl)
set_num('8');
else
return;
// TODO: Add your control notification handler code here
}
void CGuessDlg::OnButton9()
{
if(ButtonControl)
set_num('9');
else
return;
// TODO: Add your control notification handler code here
}
///////////////////////////////////////////////////////////////////////////////
////////////产生随机数
void CGuessDlg::InitializeNumber()
{
////////////////////////////////////////////////////////
////// Get time message
struct _timeb timebuffer;
char *timeline;
_ftime( &timebuffer );
timeline = ctime( & ( timebuffer.time ) );
int t1=int(timeline[17])-int('0');
int t2=int(timeline[18])-int('0');
int i,j,k,n;
unsigned int millitm=timebuffer.millitm;
int temp=5*(millitm+1)+(10*t1+t2+1)/15;
for(i=0;i<10&&temp>0;i++)
{
for(j=0;j<10&&temp>0;j++)
{
if(i==j)
continue;
for(k=0;k<10&&temp>0;k++)
{
if(i==k||j==k)
continue;
for(n=0;n<10&&temp>0;n++)
{
if(i==n||j==n||k==n)
continue;
temp--;
if(temp==0)
goto stop;
}
}
}
if(i==9)
i=0;
}
stop:
key_num[0]=TypeChange(i);
key_num[1]=TypeChange(j);
key_num[2]=TypeChange(k);
key_num[3]=TypeChange(n);
}
//////////////////////////////////////////////////////////////////////////////
//////////////////////The NumCompare function is used to compare the numbers(four numbers)
//////////////////////that user put in with the key numbers
void CGuessDlg::NumCompare(CString &m_strResult)
{
short Y_num,y_num;
Y_num=0;
y_num=0;
for(int i=0;i<4;i++)
{
if(number[i]==key_num[i])
Y_num++;
}
if(Y_num==4)
{
GameState=0;
ButtonControl=FALSE;
MessageBox("你赢了!");
m_strKey=CString(key_num[0])+" "+CString(key_num[1])
+" "+CString(key_num[2])+" "+CString(key_num[3]);
UpdateData(FALSE);
}
else
{
if(number[0]==key_num[1]||number[0]==key_num[2]||number[0]==key_num[3])
y_num++;
if(number[1]==key_num[0]||number[1]==key_num[2]||number[1]==key_num[3])
y_num++;
if(number[2]==key_num[0]||number[2]==key_num[1]||number[2]==key_num[3])
y_num++;
if(number[3]==key_num[0]||number[3]==key_num[1]||number[3]==key_num[2])
y_num++;
}
m_strResult=m_strDis+" "+CString(TypeChange(Y_num))+"Y"+CString(TypeChange(y_num))+"y";
}
////////////////////////////////////////////////////////
///////////////////把一个用int表示的数字转化成用char表示
char CGuessDlg::TypeChange(int num)
{
char temp;
switch(num)
{
case 1:temp='1';break;
case 2:temp='2';break;
case 3:temp='3';break;
case 4:temp='4';break;
case 5:temp='5';break;
case 6:temp='6';break;
case 7:temp='7';break;
case 8:temp='8';break;
case 9:temp='9';break;
case 0:temp='0';break;
default:break;
}
return temp;
}
////////////////////////////////////////////////////////////
/////////////每次按下数字键便调用此函数,并显示输入
void CGuessDlg::set_num(char num)
{
if(count==0)
{
number[1]=' ';
number[2]=' ';
number[3]=' ';
}
number[count]=num;
m_strDis=CString(number[0])+" "+CString(number[1])+" "+CString(number[2])+" "+CString(number[3]);
count++;
if(count==4)
count=0;
UpdateData(FALSE);
}
//////////////////////////////////////////////////////
////////////提供帮助说明
void CGuessDlg::OnBUTTONHelp()
{
MessageBox("使用说明:\n1.电脑随机产生四个数字,用户每次用数字键输入四个数字,然后按\"Confirm\"按钮,在\"Results\"栏中出现结果。\n2.\"Results\"栏中\'y\'表示数字正确,但位置错误.\'Y\'表示数字和位置均正确.然后根据结果再猜下一组.\n3.每次游戏最多猜八次.\n4.最后在\"Key\"栏输出结果.\n5.结束后可退出或重玩.","Help");
// TODO: Add your control notification handler code here
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -