CServerFrameView.cpp
上传用户:bsw_2008
上传日期:2013-07-09
资源大小:2446k
文件大小:17k
源码类别:

棋牌游戏

开发平台:

Visual C++

  1. // CServerFrameView.cpp : implementation of the CCServerFrameView class
  2. //
  3. #include "stdafx.h"
  4. #include "CServerFrame.h"
  5. #include "CServerFrameSet.h"
  6. #include "CServerFrameDoc.h"
  7. #include "CServerFrameView.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. #include "winsock.h"
  14. /////////////////////////////////////////////////////////////////////////////
  15. // CCServerFrameView
  16. char CH1=char(20);
  17. char ch=(char)13,ch1=(char)10;
  18. int BOARD[17][17]={
  19. {-1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1},
  20. {-1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1},
  21. {-1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1},
  22. {-1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1},
  23. {-1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1},
  24. {-1,-1,-1,-1,-1,-2,0,0,0,0,0,-2,-1,-1,-1,-1,-1},
  25. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  26. {0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,0,0,0},
  27. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  28. {0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,0,0,0},
  29. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  30. {-1,-1,-1,-1,-1,-2,0,0,0,0,0,-2,-1,-1,-1,-1,-1},
  31. {-1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1},
  32. {-1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1},
  33. {-1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1},
  34. {-1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1},
  35. {-1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1},
  36. };
  37. IMPLEMENT_DYNCREATE(CCServerFrameView, CRecordView)
  38. BEGIN_MESSAGE_MAP(CCServerFrameView, CRecordView)
  39. //{{AFX_MSG_MAP(CCServerFrameView)
  40. // NOTE - the ClassWizard will add and remove mapping macros here.
  41. //    DO NOT EDIT what you see in these blocks of generated code!
  42. //}}AFX_MSG_MAP
  43. // Standard printing commands
  44. ON_COMMAND(ID_FILE_PRINT, CRecordView::OnFilePrint)
  45. ON_COMMAND(ID_FILE_PRINT_DIRECT, CRecordView::OnFilePrint)
  46. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CRecordView::OnFilePrintPreview)
  47. ON_MESSAGE(SER_MESSAGE,OnServerMessage)
  48. END_MESSAGE_MAP()
  49. /////////////////////////////////////////////////////////////////////////////
  50. // CCServerFrameView construction/destruction
  51. CCServerFrameView::CCServerFrameView()
  52. : CRecordView(CCServerFrameView::IDD)
  53. {
  54. //{{AFX_DATA_INIT(CCServerFrameView)
  55. m_pSet = NULL;
  56. m_sShowText = _T("");
  57. //}}AFX_DATA_INIT
  58. // TODO: add construction code here
  59. }
  60. CCServerFrameView::~CCServerFrameView()
  61. {
  62. }
  63. void CCServerFrameView::DoDataExchange(CDataExchange* pDX)
  64. {
  65. CRecordView::DoDataExchange(pDX);
  66. //{{AFX_DATA_MAP(CCServerFrameView)
  67. DDX_Control(pDX, IDC_ONLINELIST, m_OnlineList);
  68. DDX_Control(pDX, IDC_SHOWTEXT, m_output);
  69. DDX_Control(pDX, IDC_USERLIST, m_UserList);
  70. DDX_Text(pDX, IDC_SHOWTEXT, m_sShowText);
  71. //}}AFX_DATA_MAP
  72. }
  73. BOOL CCServerFrameView::PreCreateWindow(CREATESTRUCT& cs)
  74. {
  75. // TODO: Modify the Window class or styles here by modifying
  76. //  the CREATESTRUCT cs
  77. return CRecordView::PreCreateWindow(cs);
  78. }
  79. void CCServerFrameView::OnInitialUpdate()
  80. {
  81. m_pSet = &GetDocument()->m_cServerFrameSet;
  82. CRecordView::OnInitialUpdate();
  83. GetParentFrame()->RecalcLayout();
  84. ResizeParentToFit();
  85. DWORD dwExStyle = LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP | LVS_EX_TRACKSELECT;
  86. m_UserList.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
  87. LV_COLUMN lvColumn;
  88. lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
  89. lvColumn.fmt = LVCFMT_LEFT;
  90. lvColumn.cx = 67;
  91. lvColumn.pszText = "用户名";
  92. m_UserList.InsertColumn(0,&lvColumn);
  93. m_OnlineList.InsertColumn(0,&lvColumn);
  94. lvColumn.pszText = "姓别";
  95. m_UserList.InsertColumn(1,&lvColumn);
  96. m_OnlineList.InsertColumn(1,&lvColumn);
  97. lvColumn.pszText = "积分";
  98. m_UserList.InsertColumn(2,&lvColumn);
  99. m_OnlineList.InsertColumn(2,&lvColumn);
  100. if(m_pSet->IsOpen()==TRUE)
  101. m_pSet->Close();
  102. m_pSet->Open();
  103. CString str;
  104. if(m_pSet->GetRecordCount()>0)
  105. {
  106. m_pSet->MoveFirst();
  107. while(m_pSet->IsEOF()==FALSE)
  108. {
  109. str=m_pSet->m_name;
  110. m_UserList.InsertItem(0,str);
  111. str=m_pSet->m_sex;
  112. m_UserList.SetItemText(0,1,str);
  113. str.Format("%d",m_pSet->m_score);
  114. m_UserList.SetItemText(0,2,str);
  115. m_pSet->MoveNext();
  116. }
  117. }
  118. WSADATA wsaData;
  119. WORD version = MAKEWORD(2, 0);
  120. int ret = WSAStartup(version, &wsaData);
  121. if(ret != 0)
  122. {
  123. TRACE("Initilize Error!n");  //初始化失败
  124. AfxMessageBox("Failed in initial socket");
  125. }
  126. // m_connectionList.AssertValid();
  127. m_connectionList.RemoveAll();
  128. ASSERT(m_connectionList.GetCount()==0);
  129. m_bInit=FALSE;
  130. SetServer();
  131. //m_UserList.InsertItem(0,"zhou");
  132. }
  133. /////////////////////////////////////////////////////////////////////////////
  134. // CCServerFrameView printing
  135. BOOL CCServerFrameView::OnPreparePrinting(CPrintInfo* pInfo)
  136. {
  137. // default preparation
  138. return DoPreparePrinting(pInfo);
  139. }
  140. void CCServerFrameView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  141. {
  142. // TODO: add extra initialization before printing
  143. }
  144. void CCServerFrameView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  145. {
  146. // TODO: add cleanup after printing
  147. }
  148. LRESULT CCServerFrameView::OnServerMessage(WPARAM wParam, LPARAM lParam)
  149. {
  150. SOCKET socket;CString str;
  151. int length,len,i,j;char k;
  152. char s[1024];
  153. switch(lParam)
  154. {
  155. case FD_ACCEPT:
  156. socket= accept(m_server.m_hSocket,NULL,NULL);
  157. /*for(i=0;i<length;i++)
  158. {
  159. //ts=m_connectionList.GetAt(m_connectionList.FindIndex(i));
  160. s[0]=NULL;
  161. strcat(s,"一个游客进入了聊天室");
  162. //send(ts,s,strlen(s),0);
  163. }*/
  164. m_sShowText=m_sShowText+"一个游客进入了聊天室了"+ch+ch1;
  165. m_output.SetWindowText(m_sShowText);
  166. m_output.LineScroll(m_output.GetLineCount());
  167. m_connectionList.AddTail(socket);
  168. return 0;
  169. case FD_READ:
  170. length=m_connectionList.GetCount();
  171. for(i=0;i<length;i++)
  172. {
  173. socket=m_connectionList.GetAt(m_connectionList.FindIndex(i));
  174. if(socket==wParam)
  175. {
  176. len=recv(socket,s,1024,0);
  177. s[len]=NULL;
  178. //将一个客户端发送的消息传递到其他客户端去
  179. /*for(j=0;j<length;j++)
  180. {
  181. socket=m_connectionList.GetAt(m_connectionList.FindIndex(j));
  182. if(socket!=wParam)
  183. {
  184. send(socket,s,strlen(s),0);
  185. }
  186. }*/
  187. str.Empty();
  188. str=s;
  189. k=protocol.Analasys(str);
  190. dealMessage(k,i);
  191. if(k=='B'||k=='P')
  192. {
  193. for(j=0;j<length;j++)
  194. {
  195. socket=m_connectionList.GetAt(m_connectionList.FindIndex(j));
  196. if(socket!=wParam)
  197. {
  198. send(socket,s,strlen(s),0);
  199. }
  200. }
  201. }
  202. m_sShowText=m_sShowText+s+ch+ch1;
  203. m_output.SetWindowText(m_sShowText);
  204. m_output.LineScroll(m_output.GetLineCount());
  205. return 0;
  206. }
  207. }
  208. return 0;
  209. case FD_WRITE:
  210. return 0;
  211. case FD_CLOSE:
  212. return 0;
  213. default:
  214. m_sShowText=m_sShowText+"An networking error has occured with a client"+ch+ch1;
  215. m_output.SetWindowText(m_sShowText);
  216. m_output.LineScroll(m_output.GetLineCount());
  217. return 0;
  218. }
  219. }
  220. /////////////////////////////////////////////////////////////////////////////
  221. // CCServerFrameView diagnostics
  222. #ifdef _DEBUG
  223. void CCServerFrameView::AssertValid() const
  224. {
  225. CRecordView::AssertValid();
  226. }
  227. void CCServerFrameView::Dump(CDumpContext& dc) const
  228. {
  229. CRecordView::Dump(dc);
  230. }
  231. CCServerFrameDoc* CCServerFrameView::GetDocument() // non-debug version is inline
  232. {
  233. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCServerFrameDoc)));
  234. return (CCServerFrameDoc*)m_pDocument;
  235. }
  236. #endif //_DEBUG
  237. /////////////////////////////////////////////////////////////////////////////
  238. // CCServerFrameView database support
  239. CRecordset* CCServerFrameView::OnGetRecordset()
  240. {
  241. return m_pSet;
  242. }
  243. /////////////////////////////////////////////////////////////////////////////
  244. // CCServerFrameView message handlers
  245. void CCServerFrameView::SetServer()
  246. {
  247. if(m_server.InitAndListen(this->m_hWnd,5022)==FALSE)
  248. {
  249. return;
  250. }
  251. else
  252. {
  253. m_bInit=TRUE;
  254. m_sShowText="服务器已建好!";
  255. m_sShowText+=(ch);
  256. m_sShowText+=(ch1);
  257. m_output.SetWindowText(m_sShowText);
  258. m_output.LineScroll(m_output.GetLineCount());
  259. }
  260. }
  261. void CCServerFrameView::dealMessage(char k,int i)
  262. {
  263. switch(k)
  264. {
  265. case 'A':
  266. ChatMessage(i);
  267. break;
  268. case 'L':
  269. RecordAddnew(i);
  270. break;
  271. case 'N':
  272. validate(i);
  273. break;
  274. case 'B':
  275. SitDown(i);
  276. break;
  277. case 'P':
  278. Leave(i);
  279. break;
  280. case 'Q':
  281. SendUserMessage(i);
  282. break;
  283. case 'C':
  284. GamerBegin(i);
  285. break;
  286. case 'E':
  287. play(i);
  288. break;
  289. }
  290. }
  291. void CCServerFrameView::ChatMessage(int i)
  292. {
  293. int i1,j;SOCKET  socket;CString s;
  294. i1=protocol.desk/4;j=protocol.desk%4;
  295. int k;
  296. s=char(20);s+='A';s+=user[i].name;s+=":";s+=protocol.chat;s+=char(20);
  297. for(k=0;k<4;k++)
  298. {
  299. if(table[i1][j].d[k]==1)
  300. {
  301. if(table[i1][j].ID[k]!=i)
  302. {
  303. socket=m_connectionList.GetAt(m_connectionList.FindIndex(table[i1][j].ID[k]));
  304. send(socket,s.GetBuffer(0),s.GetLength(),0);
  305. }
  306. }
  307. }
  308. }
  309. void CCServerFrameView::RecordAddnew(int i)
  310. {
  311. if(!m_pSet->CanAppend())
  312. {
  313. return;
  314. }
  315. CString s;
  316. s.Format("%d",m_pSet->GetRecordCount()+1);
  317. m_pSet->MoveLast();
  318. m_pSet->AddNew();
  319. m_pSet->m_name=s;
  320. m_pSet->m_code=protocol.code;
  321. m_pSet->m_score=0;
  322. m_pSet->m_sex=protocol.sex;
  323. if(!m_pSet->Update())
  324. {
  325. AfxMessageBox("添加新记录失败!");
  326. return ;
  327. }
  328. m_pSet->Requery();
  329. m_pSet->MoveLast();
  330. SOCKET socket=m_connectionList.GetAt(m_connectionList.FindIndex(i));
  331. CString t;
  332. t=CH1;
  333. t+='M';t+=s;t+=CH1;
  334. send(socket,t.GetBuffer(0),t.GetLength(),0);
  335. }
  336. void CCServerFrameView::validate(int i)
  337. {
  338. m_pSet->MoveFirst();BOOL flag=FALSE;CString str,code;
  339. while(m_pSet->IsEOF()==FALSE)
  340. {
  341. str=m_pSet->m_name;
  342. if(compare(protocol.name,str))
  343. {
  344. code=m_pSet->m_code;
  345. if(compare(protocol.code,code))
  346. {
  347. flag=TRUE;
  348. user[i].name=protocol.name;user[i].sex=m_pSet->m_sex;
  349. user[i].sex.TrimRight();
  350. user[i].score=m_pSet->m_score;
  351. m_OnlineList.InsertItem(0,str);
  352. m_OnlineList.SetItemText(0,1,user[i].sex);
  353. str.Format("%d",user[i].score);
  354. m_OnlineList.SetItemText(0,2,str);
  355. }
  356. break;
  357. }
  358. m_pSet->MoveNext();
  359. }
  360. CString s=CH1;
  361. if(flag)
  362. {
  363. s+="O1";
  364. s+=TableMessage();
  365. }
  366. else
  367. s+="O0";
  368. s+=CH1;
  369. SOCKET socket=m_connectionList.GetAt(m_connectionList.FindIndex(i));
  370. send(socket,s.GetBuffer(0),s.GetLength(),0);
  371. }
  372. BOOL CCServerFrameView::compare(CString s1, CString s2)
  373. {
  374. BOOL flag=TRUE;int len=s1.GetLength();
  375. char ch1,ch2;int i=0;
  376. for(i=0;i<len;i++)
  377. {
  378. ch1=s1.GetAt(i);ch2=s2.GetAt(i);
  379. if(ch1!=ch2)
  380. {
  381. flag=FALSE;break;
  382. }
  383. }
  384. return flag;
  385. }
  386. CString CCServerFrameView::TableMessage()
  387. {
  388. CString s;s.Empty();
  389. int i,j,k;
  390. for(i=0;i<4;i++)
  391. for(j=0;j<4;j++)
  392. for(k=0;k<4;k++)
  393. {
  394. if(table[i][j].d[k]==1)
  395. s+='1';
  396. else
  397. s+='0';
  398. }
  399. return s;
  400. }
  401. void CCServerFrameView::SitDown(int i)
  402. {
  403. int i1,j,dr;
  404. i1=protocol.desk/4;j=protocol.desk%4;
  405. dr=protocol.direct;
  406. table[i1][j].d[dr]=1;
  407. table[i1][j].ID[dr]=i;
  408. }
  409. void CCServerFrameView::Leave(int i)
  410. {
  411. int i1,j,dr;
  412. i1=protocol.desk/4;j=protocol.desk%4;
  413. dr=protocol.direct;
  414. table[i1][j].d[dr]=0;
  415. if(table[i1][j].begin[0]==TRUE&&table[i1][j].begin[2]==TRUE||
  416. table[i1][j].begin[1]==TRUE&&table[i1][j].begin[3]==TRUE||
  417. table[i1][j].begin[0]==TRUE&&table[i1][j].begin[1]==TRUE&&
  418. table[i1][j].begin[2]==TRUE&&table[i1][j].begin[3]==TRUE)
  419. {
  420. dealloss(protocol.desk,protocol.direct);
  421. }
  422. }
  423. void CCServerFrameView::SendUserMessage(int i)
  424. {
  425. CString s,t;
  426. s+=char(20);s+='Q';
  427. int i1,j,dr,k;
  428. i1=protocol.desk/4;j=protocol.desk%4;
  429. dr=protocol.direct;
  430. for(k=0;k<4;k++)
  431. {
  432. if(table[i1][j].d[k]==1)
  433. {
  434. s+="1 ";
  435. s+=user[table[i1][j].ID[k]].name;s+=' ';
  436. s+=user[table[i1][j].ID[k]].sex;s+=' ';
  437. t.Format("%d ",user[table[i1][j].ID[k]].score);
  438. s+=t;
  439. }else
  440. {
  441. s+="0 ";
  442. }
  443. }
  444. s+=char(20);
  445. //MessageBox(s);
  446. SOCKET socket;
  447. for(k=0;k<4;k++)
  448. {
  449. if(table[i1][j].d[k]==1)
  450. {
  451. //MessageBox(s);
  452. socket=m_connectionList.GetAt(m_connectionList.FindIndex(table[i1][j].ID[k]));
  453. send(socket,s.GetBuffer(0),s.GetLength(),0);
  454. }
  455. }
  456. }
  457. //根据坐标和所在的方位,得到旋转后的坐标。
  458. POINT CCServerFrameView::rotate(POINT original,int direct)
  459. {
  460. POINT n;
  461. switch(direct)
  462. {
  463. case 0:
  464. n.x=16-original.y;
  465. n.y=original.x;
  466. break;
  467. case 1:
  468. n.x=original.x;
  469. n.y=original.y;
  470. break;
  471. case 2:
  472. n.x=original.y;
  473. n.y=16-original.x;
  474. break;
  475. case 3:
  476. n.x=16-original.x;
  477. n.y=16-original.y;
  478. break;
  479. }
  480. return n;
  481. }
  482. void CCServerFrameView::GamerBegin(int i)
  483. {
  484. POINT p,q;int i1,j,k,x1,y1,x=protocol.desk/4,y=protocol.desk%4;SOCKET socket;CString s;
  485. for(i1=11;i1<17;i1++)
  486. for(j=6;j<11;j++)
  487. {
  488. q.x=i1,q.y=j;
  489. p=rotate(q,protocol.direct);
  490. table[x][y].board[p.x][p.y]=protocol.board[i1][j];
  491. }
  492. table[x][y].begin[protocol.direct]=TRUE;
  493. if(table[x][y].begin[0]==TRUE&&table[x][y].d[0]==1&&
  494. table[x][y].begin[2]==TRUE&&table[x][y].d[2]==1&&table[x][y].d[1]!=1&&
  495. table[x][y].d[3]!=1)
  496. {
  497. s=char(20);s+="D20";s+=char(20);
  498. socket=m_connectionList.GetAt(m_connectionList.FindIndex(table[x][y].ID[0]));
  499. send(socket,s.GetBuffer(0),s.GetLength(),0);
  500. s=char(20);s+="D20";s+=char(20);
  501. for(x1=0;x1<17;x1++)
  502. for(y1=6;y1<11;y1++)
  503. table[x][y].board[x1][y1]=0;
  504. socket=m_connectionList.GetAt(m_connectionList.FindIndex(table[x][y].ID[2]));
  505. send(socket,s.GetBuffer(0),s.GetLength(),0);
  506. }else if(table[x][y].begin[1]==TRUE&&table[x][y].d[1]==1&&
  507. table[x][y].begin[3]==TRUE&&table[x][y].d[3]==1&&table[x][y].d[0]!=1&&
  508. table[x][y].d[2]!=1)
  509. {
  510. s=char(20);s+="D21";s+=char(20);
  511. socket=m_connectionList.GetAt(m_connectionList.FindIndex(table[x][y].ID[1]));
  512. send(socket,s.GetBuffer(0),s.GetLength(),0);
  513. s=char(20);s+="D21";s+=char(20);
  514. for(x1=6;x1<11;x1++)
  515. for(y1=0;y1<17;y1++)
  516. table[x][y].board[x1][y1]=0;
  517. socket=m_connectionList.GetAt(m_connectionList.FindIndex(table[x][y].ID[3]));
  518. send(socket,s.GetBuffer(0),s.GetLength(),0);
  519. }else if(table[x][y].begin[0]==TRUE&&table[x][y].d[0]==1&&
  520. table[x][y].begin[2]==TRUE&&table[x][y].d[2]==1&&
  521. table[x][y].begin[1]==TRUE&&table[x][y].d[1]==1&&
  522. table[x][y].begin[3]==TRUE&&table[x][y].d[3]==1)
  523. {
  524. s=char(20);s+="D40";s+=char(20);
  525. for(x1=6;x1<11;x1++)
  526. for(y1=6;y1<11;y1++)
  527. table[x][y].board[x1][y1]=0;
  528. for(k=0;k<4;k++)
  529. {
  530. socket=m_connectionList.GetAt(m_connectionList.FindIndex(table[x][y].ID[k]));
  531. send(socket,s.GetBuffer(0),s.GetLength(),0);
  532. }
  533. }
  534. }
  535. void CCServerFrameView::play(int i)
  536. {
  537. POINT p,q,T;CString s,t;SOCKET socket;int x,y,k,k1;
  538. x=protocol.desk/4;y=protocol.desk%4;
  539. T.x=protocol.from.x;T.y=protocol.from.y;
  540. p=rotate(T,protocol.direct);
  541. T.x=protocol.to.x;T.y=protocol.to.y;
  542. q=rotate(T,protocol.direct);
  543. //t.Format("%d %d",table[x][y].board[p.x][p.y],table[x][y].board[q.x][q.y]);
  544. //MessageBox(t);
  545. if(table[x][y].board[q.x][q.y]==12)
  546. {
  547. s=char(20);s+='I';t.Format("%d ",protocol.direct);
  548. s+=t;
  549. dealloss(protocol.desk,protocol.direct);
  550. }else if(table[x][y].board[p.x][p.y]==10&&table[x][y].board[q.x][q.y]>0
  551. ||table[x][y].board[q.x][q.y]==10&&table[x][y].board[p.x][p.y]>0)
  552. {
  553. s=char(20);s+='H';t.Format("%d %d %d %d ",p.x,p.y,q.x,q.y);
  554. s+=t;
  555. table[x][y].board[p.x][p.y]=0;
  556. table[x][y].board[q.x][q.y]=0;
  557. }else if(table[x][y].board[q.x][q.y]>table[x][y].board[p.x][p.y]&&!(
  558. table[x][y].board[p.x][p.y]==1&&table[x][y].board[q.x][q.y]==11))
  559. {
  560. s=char(20);s+='G';t.Format("%d %d %d %d ",p.x,p.y,q.x,q.y);
  561. s+=t;
  562. table[x][y].board[p.x][p.y]=0;
  563. }else if(table[x][y].board[q.x][q.y]==table[x][y].board[p.x][p.y])
  564. {
  565. s=char(20);s+='R';t.Format("%d %d %d %d ",p.x,p.y,q.x,q.y);
  566. s+=t;
  567. table[x][y].board[p.x][p.y]=0;
  568. table[x][y].board[q.x][q.y]=0;
  569. }else
  570. {
  571. s=char(20);s+='F';t.Format("%d %d %d %d ",p.x,p.y,q.x,q.y);
  572. s+=t;
  573. table[x][y].board[q.x][q.y]=table[x][y].board[p.x][p.y];
  574. table[x][y].board[p.x][p.y]=0;
  575. }
  576. for(k=0;k<4;k++)
  577. {
  578. if(table[x][y].ID[k]==i)
  579. {
  580. k1=k;break;
  581. }
  582. }
  583. k1=(k1-1+4)%4;
  584. if(table[x][y].d[k1]!=1)
  585. k1=(k1-1+4)%4;
  586. s+=char(k1+'0');
  587. s+=char(20);
  588. //CString st;
  589. //st.Format("%d ",k1);
  590. //MessageBox(st);
  591. for(k=0;k<4;k++)
  592. {
  593. if(table[x][y].d[k]==1)
  594. {
  595. socket=m_connectionList.GetAt(m_connectionList.FindIndex(table[x][y].ID[k]));
  596. send(socket,s.GetBuffer(0),s.GetLength(),0);
  597. }
  598. }
  599. }
  600. void CCServerFrameView::dealloss(int desk,int direct)
  601. {
  602. int i,j,k,f=0;
  603. i=desk/4;j=desk%4;
  604. for(k=0;k<4;k++)
  605. {
  606. if(table[i][j].begin[k]==TRUE)
  607. f++;
  608. }
  609. if(f==2)
  610. {
  611. for(k=0;k<4;k++)
  612. {
  613. if(table[i][j].begin[k]==TRUE)
  614. {
  615. if(k==direct)
  616. RecordModify(table[i][j].ID[k],-2);
  617. else
  618. RecordModify(table[i][j].ID[k],2);
  619. }
  620. }
  621. }else if(f==4)
  622. {
  623. for(k=0;k<4;k++)
  624. {
  625. if(k==direct&&((k+2)%4)==direct)
  626. {
  627. RecordModify(table[i][j].ID[k],-2);
  628. }else
  629. {
  630. RecordModify(table[i][j].ID[k],2);
  631. }
  632. }
  633. }
  634. for(k=0;k<4;k++)
  635. {
  636. table[i][j].begin[k]=FALSE;
  637. }
  638. }
  639. void CCServerFrameView::RecordModify(int i,int score)
  640. {
  641. if(!m_pSet->CanUpdate())
  642. {
  643. return;
  644. }
  645. m_pSet->MoveFirst();BOOL flag=FALSE;CString str;
  646. while(m_pSet->IsEOF()==FALSE)
  647. {
  648. str=m_pSet->m_name;
  649. if(compare(user[i].name,str))
  650. {
  651. break;
  652. }
  653. m_pSet->MoveNext();
  654. }
  655. m_pSet->Edit();
  656. m_pSet->m_score=user[i].score+score;
  657. user[i].score+=score;
  658. if(!m_pSet->Update())
  659. {
  660. AfxMessageBox("修改记录失败!");
  661. }
  662. m_pSet->Requery();
  663. }