Προς το περιεχόμενο

Αλγόριθμος Τεχνητής Νοημοσύνης για το παιχνίδι της Ναυμαχίας


migf1

Προτεινόμενες αναρτήσεις

Να τον ποστάρω χύμα τον κώδικα χωρίς σχόλια; (φοβάμαι μην χάσετε την μπάλα).

 

Θα δω κατι χειροτερο απο αυτο http://trac.assembla.com/jump-in-the-world-free/browser/trunk/Server/java/l2/jw/gameserver?rev=195 ; Αν οχι, ανεβασε το

 

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 35
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Θα δω κατι χειροτερο απο αυτο http://trac.assembla.com/jump-in-the-world-free/browser/trunk/Server/java/l2/jw/gameserver?rev=195 ; Αν οχι, ανεβασε το

Τα δικά μου είναι πολύ πιο χύμα ρε συ, δεν είχα σκοπό να τα ανεβάσω ακόμα. Τέσπα, θα βάλω μερικά σχόλια σε κάθε συνάρτηση και θα τα ανεβάσω σε ένα rar... θα βάλω κι ένα make για command-line compilation κι ένα project-file για Pelles-C. Για άλλους compilers, το μόνο που θα χρειαστεί θα είναι απλά να προστεθούν τα 4 .c και το 1.h αρχείο χειροκίνητα σε ένα νέο project ( δεν χρησιμοποιώ VS όπως ίσως γνωρίζεις).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μετά από ένα break 1 ημέρας, έγραψα σήμερα μερικά σχόλια, έγραψα κι ένα σύντομο readme file (και τα 2 είναι στα Αγγλικά) κι επισύναψα τον μέχρι στιγμής κώδικα στον 1ο ποστ αυτού του νήματος, για όποιον θέλει να τον δει.

 

Έχει υλοποιημένα τα 3 σκαναρίσματα του δοκιμαστικού σταδίου (Trial Mode).

 

Το παιχνίδι αρχικοποιείται στην συνάρτηση: game_init() στο αρχείο: main.c, ενώ το AI καλείται στη συνάρτηση: player_play_cpu(), επίσης στο αρχείο: main.c. Οι συναρτήσεις του AI είναι συγκεντρωμένες στο αρχείο: ai.c, ενώ όλοι οι τύποι δεδομένων, σταθερές, κλπ είναι στο αρχείο: main.h

 

Αγνοήστε οτιδήποτε έχει να κάνει με Sink Mode (κυρίως στο main.h)... δεν το έχω υλοπιήσει.

 

Λέτε να το γυρίσουμε σε Open Source προτζεκτάκι του insomnia τελικά; :lol: Πλάκα, πλάκα, αν θέλει κανείς να φτιάξει γραφικό UI, by all means FEEL FREE!

 

Κι αν θέλει κανείς να προσθέσει και το Sink Mode, ακόμα καλύτερα! B)

 

Διαβάστε το readme.txt που έχω βάλει στο zip αρχείο κι ότι απορίες/παρατηρήσεις έχετε, shoot me άφοβα :) Περισσότερο το έγραψα για να μην αναγκαστώ να απαντάω συνέχεια στα ίδια πράγματα ;)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Θα ειναι καπως ετσι happy.gif

lolen.jpg

 

 

ΥΓ Δε θελω σχολια για τα καραβακια

 

Μεχρι τωρα εχω κανει τα παρακατω

 

 

>


#include <Windows.h>
#include <tchar.h>


typedef struct
{
int		matX,matY;
int		*matrix;
HBITMAP	hShips;
}GRID_INFO;
typedef struct
{
HBITMAP hShip;
}CONTAINER_INFO;

struct
{
BOOL isInDND;
HBITMAP hBitmap;
POINT p;
}DndState;

#define WM_GRID_EX				(WM_USER + 1)
#define GRID_RESIZEMATRIX		1					//LPARAM HIWORD x LOWORD y
#define GRID_GETMATRIX			2					//LPARAM not used

//Grid command notify
#define GRID_CLICK				1					// WPARAM LOWORD grid id HIWORD event LPARAM HIWORD x LOWORD y



#define Grid_ResizeMatrix(hGrid,x,y)	SendMessage(hGrid,WM_GRID_EX,GRID_RESIZEMATRIX,MAKELPARAM(x,y))
#define Grid_GetMatrixPtr(hGrid)		(int*)SendMessage(hGrid,WM_GRID_EX,GRID_GETMATRIX,0)


#define IDC_GRIDPALYER			101
#define IDC_GRIDCOMPUTER		102
#define IDC_SHIPCONTAINER		103

#define MAT_V					(1<<31)
#define MAT_H					(1<<30)
#define MAT_BEGIN				(1<<29)
#define MAT_END					(1<<28)
#define MAT_CUR					(1<<27)
#define Matrix_GetShipType(p)	LOWORD(p)
PCTSTR	szClsMain = _T("clsMain");
PCTSTR	szClsGrid = _T("clsGrid");
PCTSTR	szClsShipContainer = _T("clsShipContainer");







HRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);
HRESULT CALLBACK _GridProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);


BOOL	RegisterClasses(HINSTANCE hInst);

//DND
void DNDInit();
void DNDEnter();
void DNDLeave();
void DNDUpdatePos(POINT p);
void DNDDraw(HDC hdc);


//event handlers
void Grid_Clicked(HWND hGrid, int x, int y);



int WINAPI _tWinMain(HINSTANCE hInst,HINSTANCE hPrev,PTSTR szCmdLine,int nShow)
{

MSG msg;
HWND hWndMain;
if(!RegisterClasses(hInst))
	return 1;
hWndMain = CreateWindowEx(WS_EX_COMPOSITED,szClsMain,_T("Title"),WS_OVERLAPPEDWINDOW,100,100,1000,600,NULL,NULL,hInst,NULL);


ShowWindow(hWndMain,nShow);

while(GetMessage(&msg,NULL,0,0) > 0)
{
	TranslateMessage(&msg);
	DispatchMessage(&msg);
}
return 0;
}


HRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
POINT p;
PAINTSTRUCT ps;
HDC			hdc;
switch(msg)
{
case WM_MOUSEMOVE:
	break;
case WM_CREATE:
	CreateWindowEx(WS_EX_COMPOSITED,szClsGrid,NULL,WS_VISIBLE | WS_CHILD,20,130,400,400,hWnd,(HMENU)IDC_GRIDPALYER,NULL,NULL);
	CreateWindowEx(WS_EX_COMPOSITED,szClsGrid,NULL,WS_VISIBLE | WS_CHILD,480,130,400,400,hWnd,(HMENU)IDC_GRIDCOMPUTER,NULL,NULL);
	Grid_ResizeMatrix(GetDlgItem(hWnd,IDC_GRIDPALYER),8,8);
	Grid_ResizeMatrix(GetDlgItem(hWnd,IDC_GRIDCOMPUTER),8,8);
	break;
case  WM_CLOSE:
	PostQuitMessage(0);
case WM_COMMAND:
	switch(LOWORD(wParam))
	{
	case IDC_GRIDPALYER:
		switch(HIWORD(wParam))
		{
		case GRID_CLICK:
			Grid_Clicked(GetDlgItem(hWnd,LOWORD(wParam)),HIWORD(lParam),LOWORD(lParam));
			break;
		}
	default:
		return DefWindowProc(hWnd,msg,wParam,lParam);
	}
	break;
case WM_MBUTTONDOWN:
	{
		GetCursorPos(&p);

	}break;
case WM_PAINT:
	hdc = BeginPaint(hWnd,&ps);
	EndPaint(hWnd,&ps);
	break;
default:
	return DefWindowProc(hWnd,msg,wParam,lParam);
}
return 0;
}

HRESULT CALLBACK _GridProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
GRID_INFO		*pInfo;
PAINTSTRUCT		ps;
HDC				hdc,hdcMem;
HGDIOBJ			hOld;
int				i,j;
RECT			rect;
POINT			p;
static HMENU	hPopup;
switch(msg)
{
case WM_RBUTTONDOWN:
	GetCursorPos(&p);
	GetClientRect(hWnd,&rect);
	pInfo = (GRID_INFO*) GetWindowLongPtr(hWnd,GWLP_USERDATA);
	switch(TrackPopupMenu(hPopup,TPM_RETURNCMD,p.x,p.y,0,hWnd,NULL))
	{
	case 1:
		//test
		j = HIWORD(lParam) / ((rect.bottom - rect.top) / pInfo->matY);
		i = LOWORD(lParam) / ((rect.right - rect.left) /pInfo->matX );
		pInfo->matrix[j * pInfo->matY + i + 0] = 1 | MAT_V | MAT_BEGIN;
		pInfo->matrix[j * pInfo->matY + i + 1] = 1 | MAT_V | MAT_CUR;
		pInfo->matrix[j * pInfo->matY + i + 2] = 1 | MAT_V | MAT_CUR;
		pInfo->matrix[j * pInfo->matY + i + 3] = 1 | MAT_V | MAT_CUR;
		pInfo->matrix[j * pInfo->matY + i + 4] = 1 | MAT_V | MAT_END;

		break;
	default:
		break;
	}
	InvalidateRect(hWnd,NULL,TRUE);
	break;
case WM_LBUTTONDOWN:
	GetClientRect(hWnd,&rect);
	pInfo = (GRID_INFO*) GetWindowLongPtr(hWnd,GWLP_USERDATA);

	SendMessage(GetParent(hWnd),WM_COMMAND,MAKEWPARAM((WPARAM)GetMenu(hWnd),GRID_CLICK),
				MAKELPARAM
				(
				HIWORD(lParam) / ((rect.bottom - rect.top) / pInfo->matY) ,
				LOWORD(lParam) / ((rect.right - rect.left) /pInfo->matX ) 
				)
			);
	break;
case WM_GRID_EX:
	switch(wParam)
	{
	case GRID_RESIZEMATRIX:
		pInfo = (GRID_INFO*) GetWindowLongPtr(hWnd,GWLP_USERDATA);
		pInfo->matX = HIWORD(lParam);
		pInfo->matY	= LOWORD(lParam);
		if(pInfo->matrix)
			free(pInfo->matrix);
		pInfo->matrix = (int*) malloc(sizeof(int) * pInfo->matX * pInfo->matY);
		ZeroMemory(pInfo->matrix,sizeof(int) * pInfo->matX * pInfo->matY);
		RedrawWindow(hWnd,NULL,NULL,RDW_UPDATENOW);
		break;
	case GRID_GETMATRIX:
		pInfo = (GRID_INFO*) GetWindowLongPtr(hWnd,GWLP_USERDATA);
		return (HRESULT)pInfo->matrix;
	default:
		return 0;
	}
	break;
case WM_CREATE:
	pInfo = (GRID_INFO*) malloc(sizeof(GRID_INFO));
	if(!pInfo)
		return -1;
	ZeroMemory(pInfo,sizeof(GRID_INFO));
	pInfo->hShips = LoadImage(NULL,_T("ships.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
	SetWindowLongPtr(hWnd,GWLP_USERDATA,(LONG)pInfo);
	Grid_ResizeMatrix(hWnd,10,10); //defualt
	hPopup = CreatePopupMenu();
	AppendMenu(hPopup,MF_STRING,1,_T("Add ship Buldoza"));
	AppendMenu(hPopup,MF_STRING,2,_T("Add ship AirForce!!"));
	
	
	break;
case WM_PAINT:
	//draw grid
	hdc = BeginPaint(hWnd,&ps);
	pInfo = (GRID_INFO*) GetWindowLongPtr(hWnd,GWLP_USERDATA);
	GetClientRect(hWnd,&rect);
	for(i = 0; i <= (rect.right - rect.left-1); i += (rect.right - rect.left-1) / pInfo->matX)
	{
		for(j = 0; j <= (rect.bottom - rect.top) ; j += (rect.bottom - rect.top-1) / pInfo->matY)
		{
			MoveToEx(hdc,i ,0,NULL);
			LineTo(hdc,i,j);
			MoveToEx(hdc,0,j,NULL);
			LineTo(hdc,i,j);
		}
	}
	hdcMem = CreateCompatibleDC(hdc);
	hOld = SelectObject(hdcMem,pInfo->hShips);
	for(i = 0; i < pInfo->matX ; i++)
	{
		for(j = 0; j < pInfo->matY; j++)
		{
			if(pInfo->matrix[i* pInfo->matY + j])
			{
				if(pInfo->matrix[i* pInfo->matY + j] & MAT_BEGIN)
				{
					
					BitBlt(hdc,
						j * ((rect.right - rect.left) / pInfo->matX),
						i * ((rect.bottom - rect.top) / pInfo->matY),
						50,50,
						hdcMem,
						0,0,
						SRCCOPY);
				}
				else if(pInfo->matrix[i* pInfo->matY + j] & MAT_CUR)
				{
						BitBlt(hdc,
							j * ((rect.right - rect.left) / pInfo->matX),
							i * ((rect.bottom - rect.top) / pInfo->matY),
							50,50,
							hdcMem,
							50,0,
							SRCCOPY);
				}
				else if(pInfo->matrix[i* pInfo->matY + j] & MAT_END)
				{
						BitBlt(hdc,
							j * ((rect.right - rect.left) / pInfo->matX),
							i * ((rect.bottom - rect.top) / pInfo->matY),
							50,50,
							hdcMem,
							100,0,
							SRCCOPY);
				}
			}
		}
	}
	SelectObject(hdc,hOld);
	DeleteDC(hdcMem);
	EndPaint(hWnd,&ps);
	break;
case WM_DESTROY:
	pInfo = (GRID_INFO*)GetWindowLongPtr(hWnd,GWLP_USERDATA);
	free(pInfo->matrix);
	free(pInfo);
	DestroyMenu(hPopup);
	break;
default:
	return DefWindowProc(hWnd,msg,wParam,lParam);
}
return 0;
}

BOOL RegisterClasses(HINSTANCE hInst)
{
WNDCLASSEX			wcGrid,wcMain;

ZeroMemory(&wcGrid,sizeof(wcGrid));
ZeroMemory(&wcMain,sizeof(wcMain));

wcGrid.cbSize			= sizeof(wcGrid);
wcGrid.style			= CS_SAVEBITS;
wcGrid.hCursor			= LoadCursor(NULL,IDC_HAND);
wcGrid.lpfnWndProc		= _GridProc;
wcGrid.lpszClassName	= szClsGrid;
wcGrid.hInstance		= hInst;

wcMain.cbSize			= sizeof(wcMain);
wcMain.hCursor			= LoadCursor(NULL,IDC_ARROW);
wcMain.hInstance		= hInst;
wcMain.lpfnWndProc		= WndProc;
wcMain.lpszClassName	= szClsMain;
wcMain.style			= (CS_HREDRAW | CS_VREDRAW);
wcMain.hbrBackground	= (HBRUSH) (COLOR_WINDOW);


return (
	RegisterClassEx(&wcMain) 
	&& RegisterClassEx(&wcGrid)
	);
}

void Grid_Clicked(HWND hGrid,int x,int y)
{
wchar_t buf[200];
wsprintf(buf,L"X:%d Y:%d",x,y);
MessageBox(0,buf,L"Clicked",0);
}

 

το ships.bmp

ships.bmp

 

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σούπερ :)

 

To .bmp είναι το μόνο εύκολο, απλά κάνε αν θες τον κώδικα να χρησιμοποιεί διαφορετικό bmp για κάθε ξεχωριστό τύπο καραβιού, ώστε να έχουμε την ελευθερία να βάλουμε διαφορετική εικόνα για κάθε καράβι, προσθέτοντας ένα σχετικό πεδίο στο struct ShipType (όταν καταλήξεις, πες μου σε τι διαστάσεις θες τα bmp και θα στα φτιάξω εγώ).

 

Μπορούμε επίσης να αφήσουμε επιλογή στον παίκτη να διαλέγει αν θα τρέχει με GUI (αν είναι σε Windows) ή σε text-mode (αν είναι σε άλλη πλατφόρμα)... εκτός αν φτιάξει κάποιος μελλοντικά και 3ο front-end για άλλη πλατφόρμα (ή κάποιο cross-platform, π.χ. GTK+) και να επιλέγει αυτόματα το πρόγραμμα ποιο θα χρησιμοποιήσεις (ή να ρωτάει τον χρήστη).

 

Καλή φάση πάει αν γίνει πάντως :)

 

ΥΓ, Το Sink Mode βαριέμαι να το φτιάξω :lol:.. θα κάνω break μερικές μέρες να μου ξανα-ερθει η όρεξη και να το φτιάξω (αν δεν με προλάβει κανείς άλλος).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Για τις εικόνες, κρατήστε αυτό εδώ το link: http://www.the-bluep...ueprints/ships/

 

ship_healthy_images.zip

 

Υποθέτοντας από το sample bmp που ποστάρισε ο παπι πως το κάθε τετράγωνο είναι 50px, έφτιαξα εικόνες και για τους 4 τύπους πλοίων, όταν είναι σε healthy κατάσταση και τα επισυνάπτω ζιπαρισμένα (είναι σε .png μορφή, με ενεργοποιημένη τη διαφάνεια... transparency). Θα φαίνονται κάπως έτσι...

 

 

sampleyo.jpg

 

Για τα βομβαρδισμένα μέρη, να φτιάξω ξεχωριστές εικόνες για κάθε μέρος, ή θα έχουμε μια μόνο εικόνα βομβαδρισμένης περιοχής που θα την κάνουμε blend στο εκάστοτε κελί; Για να ξέρω τι να φτιάξω αν είναι.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λοιπόν έφτιαξα απλά textures για το graphical front-end θεωρώντας πως το κάθε κελί είναι 50px X 50 px (συμπεριλαμβανομένου του περιγράμματος). Δεν ξέρω αν οι διαστάσεις είναι οι σωστές, αν όχι μου λέτε (με κόκκινο τα βυθισμένα πλοία).

 

battle-images.zip

 

boardh.jpg

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...