分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
首先这个程序是建立的是Windows应用程序,建立控制台程序是不能运行的,另外,项目——项目属性——配置属性——常规-----使用多字节字符集,这样编译才能够通过的,否则如果选择使用 Unicode 字符集,编译会有错误提示:error C2440: “初始化”: 无法从“const char [8]”转换为“LPCTSTR”,另外,链接器----输入----附加依赖项要加入:“opengl32.lib glu32.lib”的lib库。。
cubemanage.h文件为:
#ifndef CUBEMANAGE_H#define CUBEMANAGE_H#include <windows.h>#include <gl/gl.h>#include <gl/glu.h>#include <math.h>#include "wcgcube.h"#define CUBE_SIZE 3#define ORIENTX 0#define ORIENTY 0#define ORIENTZ 0class CubeManage {
public: CubeManage(); ~CubeManage(); void turn(int rotateType); void turnByXShun(int x); void turnByXNi(int x); void turnByYShun(int y); void turnByYNi(int y); void turnByZShun(int z); void turnByZNi(int z); void output(int scr,int site); void output(); void draw(int rotateType,GLfloat rotate); private: WcgCube *cubes[CUBE_SIZE][CUBE_SIZE][CUBE_SIZE]; void goStep(int *leftLeg,int *rightLeg,int *goDirection,int step,int leftEdge,int rightEdge);};#endif
wcgcube.h文件为:
#ifndef WCGCUBE_H#define WCGCUBE_H#include <windows.h>#include <gl/gl.h>#include <gl/glu.h>#include <math.h>#include "iostream"using namespace std;#define X 1#define Y 2#define Z 3class WcgCube {
public: WcgCube(); ~WcgCube(); void turnByXShun(int x); void turnByXNi(int x); void turnByYShun(int y); void turnByYNi(int y); void turnByZShun(int z); void turnByZNi(int z); void output(int sign); void output(); void draw(GLfloat x0,GLfloat y0,GLfloat z0); private: int direct[6]; GLfloat sideColor[6][3]; void turnByX(int x,int sign); void turnByY(int y,int sign); void turnByZ(int z,int sign);};#endif
CubeGame.cpp文件为:
#include <windows.h>#include <winuser.h>#include <gl/gl.h>#include <gl/glu.h>#include <math.h>#include "iostream"using namespace std;#include "cubemanage.h"#include "wcgcube.h"static GLfloat PI=3.1415f;// Rotation amountsstatic GLfloat xRot = 0.0f;static GLfloat yRot = 0.0f;static GLfloat rotate=0.0f;static int rotateType=0;static int rotateOK=0;static int rotateRate=100;static GLfloat rotateStep=5*PI/180;CubeManage cm;HPALETTE hPalette = NULL;// Keep track of windows changing width and heightGLfloat windowWidth;GLfloat windowHeight;static LPCTSTR lpszAppName = "WcgCube";void exitGame(HWND hWnd,HDC hDC,HGLRC hRC);// Declaration for Window procedureLRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);// Set Pixel Format function - forward declarationvoid SetDCPixelFormat(HDC hDC);void ChangeSize(GLsizei w, GLsizei h) { GLfloat nRange = 350.0f; // Prevent a divide by zero if(h == 0) h = 1; // Set Viewport to window dimensions glViewport(0, 0, w, h); // Reset coordinate system glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Establish clipping volume (left, right, bottom, top, near, far) if (w <= h) glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange); else glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); }// Called by timer routine to effect movement of the rectangle.void IdleFunction(void) { if (rotate>=PI/2) { cm.turn(rotateType); rotateType=0; rotateOK=0; rotate=0.0f; // Refresh the Window// glutPostRedisplay(); return; } rotate+=rotateStep; // Refresh the Window// glutPostRedisplay(); }// Called by AUX library to draw scenevoid RenderScene(void) { // Clear the window with current clearing color glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glRotatef(xRot, 1.0f, 0.0f, 0.0f); glRotatef(yRot, 0.0f, 1.0f, 0.0f); cm.draw(rotateType,rotate); glPopMatrix(); // Show the graphics// glutSwapBuffers(); }// If necessary, creates a 3-3-2 palette for the device context listed.HPALETTE GetOpenGLPalette(HDC hDC) { HPALETTE hRetPal = NULL; // Handle to palette to be created PIXELFORMATDESCRIPTOR pfd; // Pixel Format Descriptor LOGPALETTE *pPal; // Pointer to memory for logical palette int nPixelFormat; // Pixel format index int nColors; // Number of entries in palette int i; // Counting variable BYTE RedRange,GreenRange,BlueRange; // Range for each color entry (7,7,and 3) // Get the pixel format index and retrieve the pixel format description nPixelFormat = GetPixelFormat(hDC); DescribePixelFormat(hDC, nPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd); // Does this pixel format require a palette? If not, do not create a // palette and just return NULL if(!(pfd.dwFlags & PFD_NEED_PALETTE)) return NULL; // Number of entries in palette. 8 bits yeilds 256 entries nColors = 1 << pfd.cColorBits; // Allocate space for a logical palette structure plus all the palette entries pPal = (LOGPALETTE*)malloc(sizeof(LOGPALETTE) +nColors*sizeof(PALETTEENTRY)); // Fill in palette header pPal->palVersion = 0x300; // Windows 3.0 pPal->palNumEntries = nColors; // table size // Build mask of all 1's. This creates a number represented by having // the low order x bits set, where x = pfd.cRedBits, pfd.cGreenBits, and // pfd.cBlueBits. RedRange = (1 << pfd.cRedBits) -1; GreenRange = (1 << pfd.cGreenBits) - 1; BlueRange = (1 << pfd.cBlueBits) -1;