Code socket với trò chơi Dò Mìn

Trò chơi dò mìn Với ma trận là bãi mìn 6x6 cho trước với 7 quả mìn được ngẫu nhiên, các người chơi lần lượt chọn vị trí và gửi về sever. mỗi người chơi có 5 mạng, kết quả cuối cùng ai là người còn số mạng nhiều nhất là thắng.

Code Sever

// SeverDM.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "SeverDM.h"
#include "afxsock.h"
#include "time.h"
#include "stdlib.h "
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;

	// initialize MFC and print and error on failure
	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
	{
		// <span class="hljs-doctag">TODO: change error code to suit your needs
		cerr << _T("Fatal Error: MFC initialization failed") << endl;
		nRetCode = 1;
	}
	else
	{
		char kt;
		do{
		AfxSocketInit(NULL);
		CSocket sever,c[2];
		sever.Create(12345);// mở cổng 12345
		sever.Listen();// lắng nghe
		sever.Accept(c[0]);// chờ người chơi đầu tiên kết nối
		sever.Accept(c[1]);// chờ người chơi thứ hai kết nối
		struct NickName
		{
				char tenclient[10];
		};
		typedef struct NickName NICKNAME;
		typedef struct tagbm
		{
			int stt;
			int trangthai;
		}BAIMIN;
		BAIMIN a[6][6];// bãi mìn có kích thước ma trận là 6x6
		int i,j,dem=0,k,n[7],flag,khong=0,mot=1;
		int hp[2],vt[2];
		hp[0]=5;
		hp[1]=5;
		char s[40];

			NICKNAME *nickName;
			nickName = new NICKNAME[2];
			for (i = 0; i < 2; i ++)
			{
				int kqtrung;
				do 
				{
					kqtrung = 0;
					printf("Server cho nhan nick name tu Client thu: %d\n", i + 1);
					c[i].Receive(&nickName[i], sizeof(nickName[i]), 0);
					printf("NickName Server nhan duoc la: %s\n", nickName[i].tenclient);
					
					for(j = 0; j < i; j ++)
					{
						if(strcmp(nickName[j].tenclient, nickName[i].tenclient) == 0)
						{
							kqtrung = 1;
							
							break;
						}
					}
					c[i].Send(&kqtrung, sizeof(kqtrung), 0);

				} while (kqtrung == 1);
			}// kiểm tra tên có trùng hay không?

		srand((unsigned int)time(NULL));
		for(k=0;k<7;k++)
		{
			do{
				flag=0;
				n[k]=rand()%36;
				
				for(i=k-1;i>=0;i--)
					if(n[k]==n[i])
						flag=1;
			}while(flag==1);
			

		}// chọn ngẫu nhiên 7 vị trí có mìn

		for(i=0;i<6;i++)
			for(j=0;j<6;j++)
				a[i][j].trangthai=0;

		for(k=0;k<7;k++)
		{	dem=0;
			for(i=0;i<6;i++)
			{ 
				for(j=0;j<6;j++)
				{	
					if(n[k]==dem)
						a[i][j].trangthai=1;
					
						
					a[i][j].stt=dem+1;
					dem++;
				}
			}
		}// đưa mìn vào ma trận, với trạng thái là 1 là có mìn
		
		for(i=0;i<6;i++)
		{
			for(j=0;j<6;j++)
				printf("  %4d.%d  ",a[i][j].stt,a[i][j].trangthai);
			printf("\n");
		}
		strcpy(s,"TRO CHOI DO MIN XIN PHEP BAT DAU");
		c[0].Send(s,sizeof(s),0);// gửi thông báo bắt đầu chơi cho người chơi
		c[1].Send(s,sizeof(s),0);
		for(i=0;i<18;i++)
		{	
				
				for(int q=0;q<2;q++)
				{	
					if(q==0)
					{
						c[0].Send(&mot,sizeof(mot),0);
						c[1].Send(&khong,sizeof(khong),0);

					}
					else
					{
						c[1].Send(&mot,sizeof(mot),0);
						c[0].Send(&khong,sizeof(khong),0);

					}
					c[q].Receive(&vt[q],sizeof(vt[q]),0);// nhận vị trí đánh từ người chơi
					
						
					
					// nhận vị trí từ người chơi và xét có mìn thì trừ hp
					for(int q1=0;q1<2;q1++)
					{
						c[0].Send(&vt[q],sizeof(vt[q]),0);
						c[1].Send(&vt[q],sizeof(vt[q]),0);
						for(j=0;j<6;j++)
						{
						  for(k=0;k<6;k++)
						   if(a[j][k].stt==vt[q])
						   {
							c[0].Send(&a[j][k].trangthai,sizeof(a[j][k].trangthai),0);
							c[1].Send(&a[j][k].trangthai,sizeof(a[j][k].trangthai),0);
							if(a[j][k].trangthai==1)
								if(q1==0)
										hp[q]--;
						  }
						}
						c[0].Send(&hp[q],sizeof(hp[q]),0);
						c[1].Send(&hp[q],sizeof(hp[q]),0);
					}
                                //xét thắng thua
				if(hp[0]==0&&hp[1]!=0)
				{	
						q=2;
						i=18;
					printf("\n%s chien thang",nickName[1].tenclient);
				}
				else
					if(hp[0]!=0&&hp[1]==0)
					{
						q=2;
						i=18;
						printf(" \n%s chien thang\n",nickName[0].tenclient);
					}
					else
					{
						if(i==17)
							if(hp[0]>hp[1])
							
								printf("\n %s chien thang",nickName[0].tenclient);
							else
								printf("\n%s chien thang",nickName[1].tenclient);
					}
				

				}

		}
		printf("\nTro Choi Da ket thuc sever co muon ket noi client moiY/N\n");
		scanf("%c",&kt);
}while(kt=='y'||kt=='Y');

	}

	return nRetCode;
}


**Code Client**


// ClientDM.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "ClientDM.h"
#include "afxsock.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;

	// initialize MFC and print and error on failure
	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
	{
		// <span class="hljs-doctag">TODO: change error code to suit your needs
		cerr << _T("Fatal Error: MFC initialization failed") << endl;
		nRetCode = 1;
	}
	else
	{
		AfxSocketInit(NULL);
		CSocket c;
		c.Create();
		char ip[20];
		printf("Ban hay nhap IP");
		scanf("%s",&ip);// nhập địa chỉ sever, ở code là 127.0.0.1
		c.Connect(ip,12345);// mở cổng 12345 để kết nối đến IP sever
		char s[40];
		char nickname[10];
			int kqtrung;
			do 
			{
				kqtrung = 0;
		
				do
				{
				
				printf("Nhap vao nickname dang ky voi server: ");
				scanf("%s", nickname);
				if(strlen(nickname)>=10||strlen(nickname)==' ')
					printf("Ban nhap khong dung yeu cau\n");
				}while(strlen(nickname)>=10||strlen(nickname)==' ');
				c.Send(nickname, sizeof(nickname), 0);
				c.Receive(&kqtrung, sizeof(kqtrung), 0);
				if (kqtrung == 1)
				{
					printf("Nick name bi trung.\n");
				}
			} while (kqtrung == 1);// nhập tên và kiểm tra trùng hay không?
		c.Receive(s,sizeof(s),0);// nhập chuồi bắt đầu từ sever
		puts(s);
		printf("		BAI MIN\n");		
		int i,j,dem=1,n[36],vt,vt1,flag=0,trangthai1,hp,hp1;

	
		char a[6][6];
		for(i=0;i<6;i++)
			for(j=0;j<6;j++)
			{
				a[i][j]=dem;
				dem++;
			}
		for(i=0;i<6;i++)
		{	for(j=0;j<6;j++)
				printf("  %4d  ",a[i][j]);
			printf("\n");
		}
		for(i=0;i<18;i++)
		{
			
			
				c.Receive(&vt,sizeof(vt),0);
			
			if(vt==1)
			{
				do{	
					flag=0;
					printf("\nMoi ban chon vi tri hop ly can danh:");
					scanf("%d",&n[i]);
					dem=1;
					for(int k=0;k<6;k++)
						{
							for(j=0;j<6;j++)
							{
								if(dem==n[i])
									if(a[k][j]=='.'||a[k][j]=='X')
										flag=1;
								if(n[i]>36||n[i]<0)
								{
									flag=1;
								}
								
								dem++;
							}
						}
					}while(flag==1); // nhập vị trí cần đánh và xét tính hợp lệ ô đánh đó
				
				c.Send(&n[i],sizeof(n[i]),0);//gửi vị trí ô đánh qua sever 
				for(int q=0;q<2;q++)
				{
					c.Receive(&vt1,sizeof(vt1),0);//nhận vị trí
					c.Receive(&trangthai1,sizeof(trangthai1),0);//nhận trạng thái mìn hay không
					c.Receive(&hp,sizeof(hp),0);// nhận hp còn bao nhiêu
					printf("MANG CUA BAN CON:%d\n\n",hp);
					if(hp==0||hp18)
					{
						i=18;
						printf("\nBan Thua Roi\n");
						c.Close();
					}
					if(trangthai1==1)
					{
						dem=1;
						if(q==0)
						{	system("cls");
							printf("\nHuHu!(T_T)BAN DA CHON O:%d CO MIN\n\n",vt1);
						}
						for(int k=0;k<6;k++)
						{
							for(j=0;j<6;j++)
							{
								if(dem==vt1)
								a[k][j]='X';
								dem++;
							}
						}
					}// thông báo người chơi biết đã chọn trúng ô có mìn
					if(trangthai1==0)
					{
					dem=1;
					if(q==0)
						{
						system("cls");
					printf("\nHiHi(^^!)BAN DA CHON O:%d KHONG CO MIN\n\n",vt1);
					}
					for(int k=0;k<6;k++)
					{
						for(j=0;j<6;j++)
						{
							if(dem==vt1)
								a[k][j]='.';
							dem++;
						}
							
					}// thông báo người chơi biết chọn ô không có mìn
					

					}
					
				
				}
				for(int k1=0;k1<6;k1++)
					{	for(j=0;j<6;j++)
						if(a[k1][j]=='.'||a[k1][j]=='X')
							printf("%6c",a[k1][j]);
						else
							printf("%6d",a[k1][j]);
						printf("\n \n");
					}//hiển thị lại bàn cờ
			
			}
			else
			{	//system("cls");// chờ lượt đi của đối thủ và thông báo vị trí, trạng thái, và mạng
				printf("Luot di cua doi thu\n waiting...\n");
				
				for(int q=0;q<2;q++)
				{
					c.Receive(&vt1,sizeof(vt1),0);
					c.Receive(&trangthai1,sizeof(trangthai1),0);
					c.Receive(&hp1,sizeof(hp1),0);
					
					if(trangthai1==1)
					{
						dem=1;
						for(int k=0;k<6;k++)
						{
							for(j=0;j<6;j++)
							{
								if(dem==vt1)
								a[k][j]='X';
								dem++;
							}
						}
					}
					if(trangthai1==0)
					{
						dem=1;
						for(int k=0;k<6;k++)
						{
							for(j=0;j<6;j++)
							{
								if(dem==vt1)
									a[k][j]='.';
								dem++;
							}
							
						}
						

					}
				
				
				}
				system("cls");
				printf("Doi thu da di\n ");
				printf("\nMANG CUA DOI THU:%d\n",hp1);
				if(trangthai1==1)
				{	 printf("Haha!(^_^)DOI THU CUA BAN DA CHON O:%d CO MIN\n \n",vt1);
				}
				else
				{
						 printf("hizhiz(~_^)DOI THU CUA BAN DA CHON O:%d KHONG CO MIN\n \n",vt1);
				}
				for(int k1=0;k1<6;k1++)
					{	for(j=0;j<6;j++)
						if(a[k1][j]=='.'||a[k1][j]=='X')
							printf("%8c",a[k1][j]);
						else
							printf("%8d",a[k1][j]);
						printf("\n \n");
					}
				if(hp1==0||(hp118))
				{
					i=18;
					printf("\nBan la nguoi chien thang\n");
				}
			}

			

		
		}
		
	}

	return nRetCode;
}


Chủ đề liên quan
Code socket với trò chơi Dò Mìn

Cùng chuyên mục

Xem nhiều hôm nay