用VS2010做了个井字棋游戏程序 但是下棋的时候 判断胜利的方法有问题 我把代码贴出来 希望大家给我看看 我是新手 谢谢大家了 !!!!

shang_01 2011-11-23 09:41:01
头文件:

// TIC2Dlg.h : 头文件
//

#pragma once


// CTIC2Dlg 对话框
class CTIC2Dlg : public CDialogEx
{
// 构造
public:
CTIC2Dlg(CWnd* pParent = NULL); // 标准构造函数
void update();
void updateqp();
int whowin(int x,int y,int _flag);
void manstep(int x,int y);
int model();
void win();
void lose();
void pingshou();

// 对话框数据
enum { IDD = IDD_TIC2_DIALOG };
int qp[3][3];
int *xt[8][3];
int dys; //控件对应数
int sum; //计算棋盘上有多少子
int flag; //表示谁在下棋 -1人后手(电脑在走) 1人先手(人在走)
int jieguo; //胜负标记
CWnd *q; //控件指针
CButton *qz; //button指针
bool state ; //记录游戏是否在进行

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持


// 实现
protected:
HICON m_hIcon;

// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
afx_msg void OnButton1();
afx_msg void OnButton2();
afx_msg void OnButton3();
afx_msg void OnButton4();
afx_msg void OnButton5();
afx_msg void OnButton6();
afx_msg void OnButton7();
afx_msg void OnButton8();
afx_msg void OnButton9();
public:
int m_first; //定义先手 1先手 0后手

protected:
virtual void OnOK();
};








...全文
217 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
shang_01 2011-11-28
  • 打赏
  • 举报
回复
来个好心人 给我看看吧~
shang_01 2011-11-27
  • 打赏
  • 举报
回复
啊 为什么没人啊
shang_01 2011-11-24
  • 打赏
  • 举报
回复
求高手指教啊~~~
shang_01 2011-11-23
  • 打赏
  • 举报
回复
哎呀 别沉啊~~~~
shang_01 2011-11-23
  • 打赏
  • 举报
回复
接下来是代码段:

// TIC2Dlg.cpp : 实现文件
//

#include "stdafx.h"
#include "TIC2.h"
#include "TIC2Dlg.h"
#include "afxdialogex.h"
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();

// 对话框数据
enum { IDD = IDD_ABOUTBOX };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

// 实现
protected:
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CTIC2Dlg 对话框




CTIC2Dlg::CTIC2Dlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CTIC2Dlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);


m_first = 0;
state=0;
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
xt[i][j]=&qp[i][j];
xt[j+3][i]=&qp[i][j];
}
xt[6][i]=&qp[i][i];
xt[7][i]=&qp[i][2-i];
}
}

void CTIC2Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Radio(pDX, IDC_RADIO3, m_first);
}

BEGIN_MESSAGE_MAP(CTIC2Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CTIC2Dlg::OnButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CTIC2Dlg::OnButton2)
ON_BN_CLICKED(IDC_BUTTON3, &CTIC2Dlg::OnButton3)
ON_BN_CLICKED(IDC_BUTTON4, &CTIC2Dlg::OnButton4)
ON_BN_CLICKED(IDC_BUTTON5, &CTIC2Dlg::OnButton5)
ON_BN_CLICKED(IDC_BUTTON6, &CTIC2Dlg::OnButton6)
ON_BN_CLICKED(IDC_BUTTON7, &CTIC2Dlg::OnButton7)
ON_BN_CLICKED(IDC_BUTTON8, &CTIC2Dlg::OnButton8)
ON_BN_CLICKED(IDC_BUTTON9, &CTIC2Dlg::OnButton9)
END_MESSAGE_MAP()


// CTIC2Dlg 消息处理程序

BOOL CTIC2Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

// 将“关于...”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标

// TODO: 在此添加额外的初始化代码
CFont *font=new CFont;
font->CreateFont(50,0,0,0,600,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,"arial");
qz=(CButton *)GetDlgItem( IDC_BUTTON1 );
qz->SetFont(font);
qz=(CButton *)GetDlgItem( IDC_BUTTON2 );
qz->SetFont(font);
qz=(CButton *)GetDlgItem( IDC_BUTTON3 );
qz->SetFont(font);
qz=(CButton *)GetDlgItem( IDC_BUTTON4 );
qz->SetFont(font);
qz=(CButton *)GetDlgItem( IDC_BUTTON5 );
qz->SetFont(font);
qz=(CButton *)GetDlgItem( IDC_BUTTON6 );
qz->SetFont(font);
qz=(CButton *)GetDlgItem( IDC_BUTTON7 );
qz->SetFont(font);
qz=(CButton *)GetDlgItem( IDC_BUTTON8 );
qz->SetFont(font);
qz=(CButton *)GetDlgItem( IDC_BUTTON9 );
qz->SetFont(font);

return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}

void CTIC2Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。

void CTIC2Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中
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;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CTIC2Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}




void CTIC2Dlg::OnOK ()
{
UpdateData(true);
if(state)
{
state=0;
q=GetDlgItem( IDC_RADIO3 );
q->EnableWindow();
q=GetDlgItem( IDC_RADIO4 );
q->EnableWindow();


for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
if(qp[i][j]==0)qp[i][j]=2;
update();
}
else
{
state=1;

q=GetDlgItem( IDC_RADIO3 );
q->EnableWindow(false);
q=GetDlgItem( IDC_RADIO4 );
q->EnableWindow(false);
int i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
qp[i][j]=0;
sum=0;

if(m_first==0)

{
flag=-1;
jieguo=model();
}
else flag=1;//决定先手后手
update();
}
}


void CTIC2Dlg::update ()
{
qz=(CButton*)GetDlgItem(IDC_BUTTON1);
dys=qp[0][0];
updateqp();
qz=(CButton*)GetDlgItem(IDC_BUTTON2);
dys=qp[0][1];
updateqp();
qz=(CButton*)GetDlgItem(IDC_BUTTON3);
dys=qp[0][2];
updateqp();
qz=(CButton*)GetDlgItem(IDC_BUTTON4);
dys=qp[1][0];
updateqp();
qz=(CButton*)GetDlgItem(IDC_BUTTON5);
dys=qp[1][1];
updateqp();
qz=(CButton*)GetDlgItem(IDC_BUTTON6);
dys=qp[1][2];
updateqp();
qz=(CButton*)GetDlgItem(IDC_BUTTON7);
dys=qp[2][0];
updateqp();
qz=(CButton*)GetDlgItem(IDC_BUTTON8);
dys=qp[2][1];
updateqp();
qz=(CButton*)GetDlgItem(IDC_BUTTON9);
dys=qp[2][2];
updateqp();
}
void CTIC2Dlg::updateqp ()
{
if (dys==flag)
{
qz->SetWindowText("O");
qz->EnableWindow (false);
}
else if (dys==-flag)
{
qz->SetWindowText("X");
qz->EnableWindow (false);
}
else if(dys==0)
{ qz->SetWindowText ("");
qz->EnableWindow ();
}
else
{
qz->SetWindowText ("");
qz->EnableWindow (false);
}
}

int CTIC2Dlg::whowin(int x,int y,int _flag) //判胜负
{
int i,j,k;
qp[x][y]=_flag;
sum++;
for(i=0;i<8;i++)
{
k=0;
for(j=0;j<3;j++)
{
k+=*xt[i][j];
}
if(k==-3)return -1;
else if(k==3)return 1;
}
if(sum==9)return 2;
else return 0;
}

/*int CTIC2Dlg::model()
{
int r,x=2,y=2;
srand((unsigned)time( NULL ));
while(1)
{
r = 0 + rand()%9; //x在[0,9]之间
if(r==0 && qp[0][0]==0){x=0,y=0;break;}
else if(r==1 && qp[0][1]==0)
{x=0,y=1;
break;
}
else if(r==2 && qp[0][2]==0)
{x=0,y=2;
break;}
else if(r==3 && qp[1][0]==0)
{x=1,y=0;break;
}
else if(r==4 && qp[1][1]==0)
{x=1,y=1;break;
}
else if(r==5 && qp[1][2]==0)
{x=1,y=2;break;
}
else if(r==6 && qp[2][0]==0)
{x=2,y=0;break;
}
else if(r==7 && qp[2][1]==0)
{x=2,y=1;break;
}
else if(r==8 && qp[2][2]==0)
{x=2,y=2;break;
}
}//随机落子

return (whowin(x,y,(-1)*flag));
}*/

int CTIC2Dlg::model ()
{
int i,j,x,y,k;
if(qp[1][1]==0) //中心点是最优先的点
{x=1;y=1;}
else
{
int r;
srand((unsigned)time( NULL ));
while(1)
{
r = 0 + rand()%9; //x在[0,9]之间
if(r==0 && qp[0][0]==0){x=0,y=0;break;}
else if(r==1 && qp[0][1]==0){x=0,y=1;break;}
else if(r==2 && qp[0][2]==0){x=0,y=2;break;}
else if(r==3 && qp[1][0]==0){x=1,y=0;break;}
else if(r==4 && qp[1][1]==0){x=1,y=1;break;}
else if(r==5 && qp[1][2]==0){x=1,y=2;break;}
else if(r==6 && qp[2][0]==0){x=2,y=0;break;}
else if(r==7 && qp[2][1]==0){x=2,y=1;break;}
else if(r==8 && qp[2][2]==0){x=2,y=2;break;}
}//随机落子
for(i=0;i<8;i++)
{
k=0;
for(j=0;j<3;j++)
{
k+=*xt[i][j];
}
if(k==flag*(2))
{
for(j=0;j<3;j++)
{
if(*xt[i][j]==0)break;
}
if(i<3)
{x=i;y=j;}
else if(i<6)
{x=j;y=i-3;}
else if(i==6)
{x=y=j;}
else
{x=j;y=2-j;}
}
} //如果对方有已连成两子,而第三子为空,则去填补

for(i=0;i<8;i++)
{
k=0;
for(j=0;j<3;j++)
{
k+=*xt[i][j];
}
if(k==flag*(-2))
{
for(j=0;j<3;j++)
{
if(*xt[i][j]==0)break;
}
if(i<3)
{x=i;y=j;}
else if(i<6)
{x=j;y=i-3;}
else if(i==6)
{x=y=j;}
else
{x=j;y=2-j;}
}
}
}
return (whowin(x,y,(-1)*flag));
}

void CTIC2Dlg::manstep (int x,int y) //循环判断胜负
{
jieguo=whowin(x,y,flag);
if(jieguo==flag)win();
else if(jieguo==2)pingshou();
else
{
jieguo=model();
if(jieguo==-flag)
lose();
else if (jieguo==2)pingshou();
}
update();
}

void CTIC2Dlg::win ()
{
MessageBox("恭喜你,你赢了!","胜利!");
OnOK();
}
void CTIC2Dlg::lose ()
{
MessageBox("抱歉,你输了!","失败!");
OnOK();
}
void CTIC2Dlg::pingshou ()
{
MessageBox("平局!","和棋!");
OnOK();
}

void CTIC2Dlg::OnButton1()
{
// TODO: 在此添加控件通知处理程序代码
manstep(0,0);
}


void CTIC2Dlg::OnButton2()
{
// TODO: 在此添加控件通知处理程序代码
manstep(0,1);
}


void CTIC2Dlg::OnButton3()
{
// TODO: 在此添加控件通知处理程序代码
manstep(0,2);
}


void CTIC2Dlg::OnButton4()
{
// TODO: 在此添加控件通知处理程序代码
manstep(1,0);
}


void CTIC2Dlg::OnButton5()
{
// TODO: 在此添加控件通知处理程序代码
manstep(1,1);
}


void CTIC2Dlg::OnButton6()
{
// TODO: 在此添加控件通知处理程序代码
manstep(1,2);
}


void CTIC2Dlg::OnButton7()
{
// TODO: 在此添加控件通知处理程序代码
manstep(2,0);
}


void CTIC2Dlg::OnButton8()
{
// TODO: 在此添加控件通知处理程序代码
manstep(2,1);
}


void CTIC2Dlg::OnButton9()
{
// TODO: 在此添加控件通知处理程序代码
manstep(2,2);
}


65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧