⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tennis.cpp

📁 C人工智能游戏开发的一些实例源代码 C Game development in artificial intelligence source code of some examples
💻 CPP
字号:
//----------------------------------------------------------------------------------------------
// Sequential Prediction Demo: The positioning pattern
// 
// Author:  Fri Mommersteeg
// Date:    10-09-2001
// File:    Tennis.cpp
//----------------------------------------------------------------------------------------------

//----------------------------------------------------------------------------------------------
// Include files
//----------------------------------------------------------------------------------------------

#include "stdafx.h"
#include "ball.h"
#include "gamer.h"
#include "aibot.h"
#include "patternbot.h"
#include "soundbuffer.h"
#include "tennisfield.h"

//----------------------------------------------------------------------------------------------
// Global variables
//----------------------------------------------------------------------------------------------

HWND			g_hWnd;
BOOL			g_bActive;
BOOL			g_Freeze;
BOOL			g_Intro;
DWORD			g_FrameRate;
DWORD			g_TargetSpeed;
BOOL			g_bBotTargeting;
LPDDS			imgField;
LPDDS			imgRedCross;
LPDDS			imgIntro;
CTennisBall		ball;
CAiBot			bot;
CTennisField	TennisField;
CSoundBuffer	sndHitBall;
CSoundBuffer	sndBounce;

//----------------------------------------------------------------------------------------------
// The gamer object can be replaced by a pattern bot, which is a bot that can generate
// patterns in its behavior. The pattern bot is excellent for making visible the pattern 
// recognition capabilities of sequential prediction. Just define PATTERNBOT_MOVIE, get some
// popcorn, sit back and relax and watch the show! ;-)
//----------------------------------------------------------------------------------------------

//#define PATTERNBOT_MOVIE

#ifdef PATTERNBOT_MOVIE

CPatternBot		gamer;

#else

CGamer			gamer;

#endif // PATTERNBOT_MOVIE

//----------------------------------------------------------------------------------------------
// SetupSurfaces(): Creates the DirectDraw Surfaces
//----------------------------------------------------------------------------------------------

void SetupSurfaces() {
	CreateSurface(imgField, FIELD_WIDTH, FIELD_HEIGHT);
	CreateSurface(imgRedCross, CROSS_WIDTH, CROSS_HEIGHT);
}

//----------------------------------------------------------------------------------------------
// SetupSurfaces(): Loads bitmaps into the DirectDraw surfaces
//----------------------------------------------------------------------------------------------

void LoadSurfaces() {
	LoadSurface("tennisfield.bmp", 0, 0, imgField);
	LoadSurface("cross.bmp", 0, 0, imgRedCross);	
}

//----------------------------------------------------------------------------------------------
// RestoreAll(): Callback function for my DirectDraw library; restores lost surfaces
//----------------------------------------------------------------------------------------------

BOOL RestoreAll(BOOL reinit) {
	if (reinit) {
		BOOL result;
		ShutdownDD();
		result = InitDD(g_hWnd, SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, 1);
		SetupSurfaces();
		return result;
	}
	LoadSurfaces();
	return TRUE;
}

//----------------------------------------------------------------------------------------------
// LoadSamples(): Loads wave files into DirectSound buffers
//----------------------------------------------------------------------------------------------

void LoadSamples() {
	sndHitBall.CreateWave(lpds, "hitball.wav");
	sndBounce.CreateWave(lpds, "bounce.wav");
}

//----------------------------------------------------------------------------------------------
// GameInit(): Initializes the game
//----------------------------------------------------------------------------------------------

void GameInit(HWND hWnd, HINSTANCE hInstance) {	

	// initialize global variables
	g_hWnd = hWnd;
	g_Freeze = FALSE;
	g_Intro = TRUE;
	g_FrameRate = DEFAULT_SPEED;
	g_TargetSpeed = DEFAULT_SPEED;
	g_bBotTargeting = FALSE;

	// initialize DirectDraw
	if (!InitDD(hWnd, SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, 1)) {
		MessageBox(NULL, "Failed to initialize DirectDraw!","Error", 0);
		return;
	}

	// set up DirectDraw surfaces and display the intro screen
	SetupSurfaces();
	LoadSurfaces();
	LoadSurface("intro.bmp", 0, 0, lpddss);	
	Flip();

	// initialize DirectSound
	if (!InitDS()) {
		MessageBox(NULL, "Failed to initialize DirectSound!", "Error", 0);
		return;
	}

	// set up DirectSound buffers
	LoadSamples();
			
	RECT field;

	// set up bot play field
	field.left = (SCREEN_WIDTH-FIELD_WIDTH) / 2 + OUTBOX_WIDTH;
	field.right = SCREEN_WIDTH - (SCREEN_WIDTH-FIELD_WIDTH) / 2 - OUTBOX_WIDTH;
	field.top = (SCREEN_HEIGHT-FIELD_HEIGHT) / 2;
	field.bottom = SCREEN_HEIGHT / 2;

	// set up bot settings
	bot.SetPlayField(&field);
	bot.SetColor(RGB(0,0,255));
	bot.SetDirection(PADDLE_DOWN);
	bot.SetupAI(&ball, g_bBotTargeting);

	// set up gamer play field
	field.left = (SCREEN_WIDTH-FIELD_WIDTH) / 2 + OUTBOX_WIDTH;
	field.right = SCREEN_WIDTH - (SCREEN_WIDTH-FIELD_WIDTH) / 2 - OUTBOX_WIDTH;
	field.top = SCREEN_HEIGHT / 2; 
	field.bottom = SCREEN_HEIGHT-(SCREEN_HEIGHT-FIELD_HEIGHT) / 2;

	// set up gamer settings
	gamer.SetPlayField(&field);
	gamer.SetColor(RGB(255,0,0));	
	gamer.SetDirection(PADDLE_UP);	

#ifdef PATTERNBOT_MOVIE

	gamer.SetupAI(&ball, TRUE);
	gamer.SetPatternSize(3);

#endif

	// set up entire tennis field
	field.left = (SCREEN_WIDTH-FIELD_WIDTH) / 2;
	field.right = SCREEN_WIDTH - (SCREEN_WIDTH-FIELD_WIDTH) / 2;
	field.top = (SCREEN_HEIGHT-FIELD_HEIGHT) / 2;
	field.bottom = SCREEN_HEIGHT-(SCREEN_HEIGHT-FIELD_HEIGHT) / 2;

	// plug objects into "manager" object
	TennisField.SetupField(&field, &gamer, &bot, &ball);	
}

//----------------------------------------------------------------------------------------------
// GameMain(): Main game loop (called from the message loop)
//----------------------------------------------------------------------------------------------

void GameMain() {	
	if (!g_Freeze && !g_Intro) {
		TennisField.Update();
	}
}

//----------------------------------------------------------------------------------------------
// GameShutDown(): Destroys the game objects and releases allocated memory
//----------------------------------------------------------------------------------------------

void GameShutdown() {
	sndHitBall.Release();
	sndBounce.Release();
	ShutdownDS();
	imgField->Release();
	imgRedCross->Release();
	ShutdownDD();
}

//----------------------------------------------------------------------------------------------
// WindowProc(): Window handler 
//----------------------------------------------------------------------------------------------

LRESULT CALLBACK WindowProc(HWND hWnd, 
						    UINT Msg, 
                            WPARAM wParam, 
                            LPARAM lParam) 
{
	switch(Msg) {	

        case WM_ACTIVATEAPP:
            g_bActive = (wParam == WA_ACTIVE) || (wParam == WA_CLICKACTIVE);
            break;

		case WM_SETCURSOR:
            SetCursor(NULL);
            break;

		case WM_PAINT:
			break;

		case WM_KEYDOWN:
			if (g_Intro) {
				g_Intro = FALSE;
				TennisField.Start();
			} else {
				int nVirtKey = (int)wParam;
				switch (nVirtKey) {
				case VK_F1: 
					g_Freeze = !g_Freeze;
					if (!g_Freeze) {
						TennisField.Start(); // restart frame-rate counter
					}
					break;
				case VK_F2:
					g_bBotTargeting = !g_bBotTargeting;
					bot.EnableTargeting(g_bBotTargeting);
					break;
				case VK_F3:
					ball.SetVelocity(0,0,0);
					break;
				case VK_ESCAPE:
					PostQuitMessage(0);
					break;
				}
			}
			break;

		case WM_DESTROY: 
			PostQuitMessage(0);			
			break;

		default:
			break;
    }

	return DefWindowProc(hWnd, Msg, wParam, lParam);
}

//----------------------------------------------------------------------------------------------
// WinMain(): Entry point for the application
//----------------------------------------------------------------------------------------------

int APIENTRY WinMain(	HINSTANCE hInstance,
						HINSTANCE hPrevInstance,
						LPSTR lpCmdLine,
						int nCmdShow)
{

	WNDCLASS	wc;		
	MSG			msg;
	HWND		hWnd;

	// set up the window class
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN_ICON));
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH )GetStockObject(BLACK_BRUSH);
    wc.lpszMenuName = NAME;
    wc.lpszClassName = NAME;
    RegisterClass(&wc);

	// create the window
    hWnd = CreateWindowEx(WS_EX_TOPMOST,
                          NAME,
                          TITLE,
                          WS_POPUP,
                          0,
                          0,
                          SCREEN_WIDTH,
                          SCREEN_HEIGHT,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);
    if (!hWnd)
        return FALSE;

	// do some other window stuff
	ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    SetFocus(hWnd);
	ShowCursor(FALSE);

	// initialize the game
	GameInit(hWnd, hInstance);
	
	// run the message loop
	while (TRUE) {
		if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { 
			if (msg.message == WM_QUIT)
				break;
	
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
    
		if (g_bActive) {
			GameMain();
		} else {
			WaitMessage();
		}
	}


	// shut down the game
	GameShutdown();

	// release the window
	DestroyWindow(hWnd);

	return (msg.wParam);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -