体育资讯网

您现在的位置是:首页 > 足球教学 > 正文

足球教学

六子棋源码人机对战(人机对战五子棋代码)

hacker2022-07-17 01:59:35足球教学80
本文目录一览:1、求一个c++实现人机对战,人人对战的五子棋游戏源代码,急用,谢谢2、

本文目录一览:

求一个c++实现人机对战,人人对战的五子棋游戏源代码,急用,谢谢

五子棋范例的源程序:目录renju下的内容

程序在附件中,需要请免费下载

renju.dsw

renju.dsp

 这两个是项目文件。包含整个项目的文件配置等信息

RESOURCE.H

renju.rc

 这是整个工程中使用的Windows资源列表。包括置于res子目录下的图标,

位图以及光标等内容。

Renju.h

    这是应用程序的主头文件。包含了通用于工程的其他头文件。以及

CRenjuApp类的声明。

renju.cpp

    这是应用程序的主源程序。包含整个程序的入口点。CRenjuApp类的实现。

StdAfx.h

StdAfx.cpp

    这对文件由用于将一些预编译信息纳入程序。编译后将产生stdafx.obj

define.h

 这是一个包含程序中的数据表示的定义的头文件。

NewGame.h

NewGame.cpp

 这一对文件定义并实现用于新游戏的设置的对话框。

renjuDlg.h

renjuDlg.cpp

 这一对文件定义并实现了,五子棋的主界面。

Eveluation.h

Eveluation.cpp

 这一对文件定义并实现了估值核心类。

MoveGenerator.h

MoveGenerator.cpp

 这一对文件定义并实现了走法产生器。

SearchEngine.h

SearchEngine.cpp

 这一对文件定义了搜索引擎接口。

HistoryHeuristic.h

HistoryHeuristic.cpp

 这一对文件定义并实现历史启发类。

TranspositionTable.h

TranspositionTable.cpp

 这一对文件定义并实现置换表类。

NegaScout_TT_HH.h

NegaScout_TT_HH.cpp

 这一对文件定义并实现历史启发和置换表增强的NegaScout搜索引擎。

Directory of renju\res

chess.rc2//资源文件

chess.ico//图标文件

若满意请及时采纳,谢谢

求用c语言编写的人机对战五子棋的源代码,要能运行的,简单点就好,初学C的学生

#include "stdafx.h"

#include "resource.h"

#include "define.h"

#include "box.h"

#include "moveGeneration.h"

#pragma comment(lib, "winmm.lib")

#include Mmsystem.h

#define MAX_LOADSTRING 100

#define BOXBMP_WIDTH 537 /* 棋盘图片宽度 */

#define BOXBMP_HEIGHT 537 /* 棋盘图片高度 */

#define SPACE 20 /* 棋盘图片和窗口边沿间隔 */

#define UNIT_WIDTH 35 /* 每个棋格宽度 */

#define UNIT_HEIGHT 35 /* 每个棋格高度 */

#define STONE_WIDTH 20 /* 棋子宽度 */

/* 窗口宽度 = 两边空白 + 棋盘图片宽度 + 窗口边框宽度 */

#define WIN_WIDTH 2*SPACE+BOXBMP_WIDTH+2*GetSystemMetrics(SM_CXDLGFRAME)

/* 窗口高度 = 标题栏高度 + 上下两边空白 + 棋盘图片高度 + 窗口边框高度 */

#define WIN_HEIGHT GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CYMENU)+2*SPACE\

+BOXBMP_HEIGHT+2*GetSystemMetrics(SM_CXDLGFRAME)

//////////////////////////////////////////////////////////////////////

// 全局变量:

static HINSTANCE hInst; // 当前实例

static TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本

static TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名

//////////////////////////////////////////////////////////////////////

// 此代码模块中包含的函数的前向声明:

ATOM InitApplication(HINSTANCE hInstance);

BOOL InitInstance(HINSTANCE, int);

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

BOOL CALLBACK About(HWND, UINT, WPARAM, LPARAM);

////////////////////////////////////////////////////////////////////// 绘制棋子

void DrawStone(HDC hdc, int column, int row, STONE_TYPE stone)

{

HPEN hpen;

HBRUSH hbrush;

switch (stone)

{

case BLACK_STONE: //黑子

hpen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));

hbrush = CreateSolidBrush(RGB(0, 0, 0));

break;

case WHITE_STONE: //白子

hpen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255));

hbrush = CreateSolidBrush(RGB(255, 255, 255));

break;

default:

return;

}

SelectObject(hdc, hpen);

SelectObject(hdc, hbrush);

Ellipse(hdc, column*34.9+35, row*34.9+35, column*34.9+55, row*34.9+55);

DeleteObject(hpen);

DeleteObject(hbrush);

return;

}

//////////////////////////////////////////////////////////// 绘制棋盘

void DrawChessBox(HDC hdc, STONE_TYPE box[BOX_ROW][BOX_COL])

{

assert(NULL != box);

HBITMAP hBitmap;

HDC hdcSrc;

hBitmap = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_CHESSBOX));

hdcSrc = CreateCompatibleDC(hdc);

SelectObject(hdcSrc, hBitmap);

BitBlt(hdc, SPACE, SPACE, BOXBMP_WIDTH, BOXBMP_HEIGHT, hdcSrc, 0, 0, SRCCOPY);

DeleteObject(hBitmap);

for(int column=0; columnBOX_COL; column++)

{

for(int row=0; rowBOX_ROW; row++)

{

DrawStone(hdc, column, row, box[column][row]);

}

}

}

////////////////////////////////////////////////////////////////////

//重新开始

static STONE_TYPE NewGame(HWND hWnd, STONE_TYPE box[BOX_ROW][BOX_COL])

{

boxInit(box);//清空

InvalidateRect(hWnd, NULL, FALSE);//重绘

return BLACK_STONE;

}

/**

* @brief 放置棋子

* @param hWnd 窗口句柄

* @param box 当前棋盘

* @param point 当前所下棋子在棋盘中的坐标

* @return TRUE 游戏结束, FALSE 游戏未结束

*/

static BOOL PlaceStone(HWND hWnd, STONE_TYPE box[BOX_ROW][BOX_COL], POINTS point, STONE_TYPE stone)

{

STONE_TYPE successStone = NONE_STONE;

boxSetStone(box, point.x, point.y, stone);

InvalidateRect(hWnd, NULL, FALSE);//重绘

PlaySound(MAKEINTRESOURCE(IDW_TADA), hInst, SND_RESOURCE|SND_SYNC);

successStone = boxIsOver(box, point.x, point.y);

if (WHITE_STONE == successStone)

{

MessageBox(hWnd, TEXT("白子获胜!"), TEXT("提示"), MB_OK|MB_ICONINFORMATION);

return TRUE;

}

else if (BLACK_STONE == successStone)

{

MessageBox(hWnd, TEXT("黑子获胜!"), TEXT("提示"), MB_OK|MB_ICONINFORMATION);

return TRUE;

}

return FALSE;

}

int APIENTRY _tWinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR lpCmdLine,

int nCmdShow)

{

UNREFERENCED_PARAMETER(hPrevInstance);

UNREFERENCED_PARAMETER(lpCmdLine);

MSG msg;

HACCEL hAccelTable;

// 初始化全局字符串

LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

LoadString(hInstance, IDC_GOBANG, szWindowClass, MAX_LOADSTRING);

InitApplication(hInstance);

// 执行应用程序初始化:

if (!InitInstance (hInstance, nCmdShow))

{

return FALSE;

}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_GOBANG));

// 主消息循环:

while (GetMessage(msg, NULL, 0, 0))

{

if (!TranslateAccelerator(msg.hwnd, hAccelTable, msg))

{

TranslateMessage(msg);

DispatchMessage(msg);

}

}

return (int) msg.wParam;

}

//

// 函数: InitApplication()

//

// 目的: 注册窗口类。

//

// 注释:

//

// 仅当希望

// 此代码与添加到 Windows 95 中的“RegisterClassEx”

// 函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,

// 这样应用程序就可以获得关联的

// “格式正确的”小图标。

//

ATOM InitApplication(HINSTANCE hInstance)

{

WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;

wcex.lpfnWndProc = WndProc;

wcex.cbClsExtra = 0;

wcex.cbWndExtra = 0;

wcex.hInstance = hInstance;

wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_BIG));

wcex.hCursor = LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW);

wcex.lpszMenuName = MAKEINTRESOURCE(IDC_GOBANG);

wcex.lpszClassName = szWindowClass;

wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassEx(wcex);

}

//

// 函数: InitInstance(HINSTANCE, int)

//

// 目的: 保存实例句柄并创建主窗口

//

// 注释:

//

// 在此函数中,我们在全局变量中保存实例句柄并

// 创建和显示主程序窗口。

/////////////////////////////////////////////////////////清空棋盘

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

HWND hWnd;

hInst = hInstance; // 将实例句柄存储在全局变量中

int nWidth, nHeight;

nWidth = WIN_WIDTH/*585*/;

nHeight = WIN_HEIGHT/*630*/;

hWnd = CreateWindow(szWindowClass, szTitle,

WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,

(GetSystemMetrics(SM_CXSCREEN)-nWidth)/2, (GetSystemMetrics(SM_CYSCREEN)-nHeight)/2,

nWidth, nHeight,

NULL, NULL, hInstance, NULL);

if (!hWnd)

{

return FALSE;

}

ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);

return TRUE;

}

///////////////////////////////////////////// “关于”框的消息处理程序。

BOOL CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

{

UNREFERENCED_PARAMETER(lParam);

switch (message)

{

case WM_INITDIALOG:

return TRUE;

case WM_COMMAND:

if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)

{

EndDialog(hDlg, LOWORD(wParam));

return TRUE;

}

break;

}

return (INT_PTR)FALSE;

}

///////////////////////////////////////////////////////////////////

//

// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)

//

// 目的: 处理主窗口的消息。

//

// WM_COMMAND - 处理应用程序菜单

// WM_PAINT - 绘制主窗口

// WM_DESTROY - 发送退出消息并返回

//

//

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

static STONE_TYPE box[BOX_ROW][BOX_COL];

static STONE_TYPE currentStone = BLACK_STONE;

static BOOL startFlag = FALSE;//设置标志符

static int mode = IDM_MODE_MAN2COMPUTER;

HMENU hMenu = NULL;

switch (message)

{

case WM_CREATE : // 创建窗口

hMenu = GetMenu(hWnd);

CheckMenuItem(hMenu, mode, MF_CHECKED);

break;

case WM_COMMAND:

int wmId, wmEvent;

wmId = LOWORD(wParam);

wmEvent = HIWORD(wParam);

hMenu = GetMenu(hWnd);

// 分析菜单选择:

switch (wmId)

{

case IDM_ABOUT:

DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);

break;

case IDM_EXIT:

PostMessage(hWnd,WM_CLOSE,0,0);

break;

case IDM_START://////////////////////////////////////////////////////////开始下棋

currentStone = NewGame(hWnd, box);//先下的棋子颜色

startFlag = TRUE;

break;

case IDM_MODE_MAN2COMPUTER :

CheckMenuItem(hMenu, mode, MF_UNCHECKED);

mode = IDM_MODE_MAN2COMPUTER;

currentStone = NewGame(hWnd, box);

CheckMenuItem(hMenu, mode, MF_CHECKED);

break;

case IDM_MODE_MAN2MAN :

CheckMenuItem(hMenu, mode, MF_UNCHECKED);

mode = IDM_MODE_MAN2MAN;

currentStone = NewGame(hWnd, box);

CheckMenuItem(hMenu, mode, MF_CHECKED);

break;

}

break;

case WM_PAINT:

HDC hdc;

PAINTSTRUCT ps;

hdc = BeginPaint(hWnd, ps);

DrawChessBox(hdc, box);

EndPaint(hWnd, ps);

break;

case WM_LBUTTONUP: //鼠标提起

if (!startFlag) // 没有点击开始

{

return 0;

}

POINTS point;

point = MAKEPOINTS(lParam);

//判断鼠标是否点击棋盘

if(point.x 35 point.x 542 point.y 35 point.y 542)

{

//通过鼠标点击位置计算出棋子放置位置

point.x = (point.x - 35) / 34;

point.y = (point.y - 35) / 34;

if(boxGetStone(box, point.x, point.y) == NONE_STONE)

{

if (PlaceStone(hWnd, box, point, currentStone))

{

currentStone = NewGame(hWnd, box);

}

else

{

switch (currentStone)

{

case BLACK_STONE :

currentStone = WHITE_STONE;

break;

case WHITE_STONE :

currentStone = BLACK_STONE;

break;

default :

break;

}

}

// 人机对弈,由计算机搜索最优结果

if (mode == IDM_MODE_MAN2COMPUTER)

{

point = moveGeneration(box);

if (PlaceStone(hWnd, box, point, currentStone))

{

currentStone = NewGame(hWnd, box);

}

else

{

currentStone = BLACK_STONE; /* 人机对弈,人执黑子 */

}

}

}

else

{

MessageBox(hWnd, TEXT("此处已放置了棋子"), TEXT("警告"), MB_OK | MB_ICONWARNING);

}

}

break;

case WM_CLOSE:

if(MessageBox(hWnd, TEXT("确认要退出快乐五子棋游戏吗?"), TEXT("提示"), MB_YESNO | MB_ICONASTERISK)==IDYES)

{

DestroyWindow(hWnd);

}

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

return DefWindowProc(hWnd, message, wParam, lParam);

}

return 0;

}

还是不简单啊,嘿嘿,初学就要这么复杂的代码啊,要是好就给分哈

急求一个使用C语言编写的有人人对战和人机对战模式两种模式的五子棋的源代码

# includestdio.h

# includestring.h

# includestdlib.h

# define SPA 0

# define MAN 1

# define COM 2 /* 空位置设为0 六子棋源码人机对战,玩家下的位置设为1 六子棋源码人机对战,电脑下的位置设为2 */

int qipan[15][15]; /* 15*15的棋盘 */

int a,b,c,d,x; /* a b为玩家下子坐标 ,c d为电脑下子坐标 x为剩余空位置*/

void start(); /* 程序的主要控制函数 */

void draw(); /* 画棋盘 */

int win(int p,int q); /* 判断胜利 p q为判断点坐标 */

void AI(int *p,int *q); /* 电脑下子 p q返回下子坐标 */

int value(int p,int q); /* 计算空点p q的价值 */

int qixing(int n,int p,int q); /* 返回空点p q在n方向上的棋型 n为1-8方向 从右顺时针开始数 */

void yiwei(int n,int *i,int *j); /* 在n方向上对坐标 i j 移位 n为1-8方向 从右顺时针开始数 */

void main()

{

char k;

do{

x=225;

start();

printf("还要再来一把吗?输入y或n:"); getchar(); scanf("%c",k);

while(k!='y'k!='n'){

printf("输入错误,请重新输入\n"); scanf("%c",k); }

system("cls"); }while(k=='y'); printf("谢谢使用!\n");

}

void start()

{

int i,j,a1,b1,c1,d1,choice; /* a1 b1储存玩家上手坐标 c1 d1储存电脑上手坐标 */

char ch;

printf("\t╔══════════════════════════════╗\n"); printf("\t║ ║\n"); printf("\t║ 欢迎使用五子棋对战程序 祝您玩的愉快挑战无极限 ║\n"); printf("\t║ ║\n"); printf("\t║ ._______________________. ║\n"); printf("\t║ | _____________________ | ║\n"); printf("\t║ | I I | ║\n"); printf("\t║ | I 五 子 棋 I | ║\n"); printf("\t║ | I I | ║\n"); printf("\t║ | I made by 晓之蓬 I | ║\n"); printf("\t║ | I___________________I | ║\n"); printf("\t║ !_______________________! ║\n"); printf("\t║ ._[__________]_. ║\n"); printf("\t║ .___|_______________|___. ║\n"); printf("\t║ |::: ____ | ║\n"); printf("\t║ | ~~~~ [CD-ROM] | ║\n"); printf("\t║ !_____________________! ║\n"); printf("\t║ ║\n"); printf("\t║ ║\n"); printf("\t║ 寒 星 溪 月 疏 星 首,花 残 二 月 并 白 莲。 ║\n"); printf("\t║ 雨 月 金 星 追 黑 玉,松 丘 新 宵 瑞 山 腥。 ║\n"); printf("\t║ 星 月 长 峡 恒 水 流,白 莲 垂 俏 云 浦 岚。 ║\n"); printf("\t║ 黑 玉 银 月 倚 明 星,斜 月 明 月 堪 称 朋。 ║\n"); printf("\t║ 二 十 六 局 先 弃 二,直 指 游 星 斜 彗 星。 ║\n"); printf("\t║ ║\n"); printf("\t║ ║\n"); printf("\t║ 1.人机对战 2.人人对战 ║\n"); printf("\t║ ║\n"); printf("\t╚═══════════════════════════ ══╝\n"); printf("\t\t\t请输入1或2:");

scanf("%d",choice); /* 选择模式:人机或人人 */

while(choice!=1choice!=2) {

printf("输入错误,请重新输入:"); scanf("%d",choice); }

if(choice==1){ /* 人机模式 */

system("cls");

printf("欢迎使用五子棋人机对战!下子请输入坐标(如13 6)。悔棋请输入15 1 5。\n\n\n");

for(j=0;j15;j++)

for(i=0;i15;i++)

qipan[j][i]=SPA; /* 置棋盘全为空 */

draw();

printf("先下请按1,后下请按2:"); scanf("%d",i);

while(i!=1i!=2) { printf("输入错误,请重新输入:"); scanf("%d",i); }

if(i==1) { /* 如果玩家先手下子 */

printf("请下子:"); scanf("%d%d",a,b);

while((a0||a14)||(b0||b14)) {

printf("坐标错误!请重新输入:"); scanf("%d%d",a,b); }

a1=a; b1=b; x--; qipan[b][a]=MAN; system("cls"); draw();

}

while(x!=0){

if(x==225) {

c=7; d=7; qipan[d][c]=COM; x--; system("cls"); draw(); } /* 电脑先下就下在7 7 */

else { AI(c,d); qipan[d][c]=COM; x--; system("cls"); draw(); } /* 电脑下子 */

c1=c; d1=d; /* 储存电脑上手棋型 */

if(win(c,d)){ /* 电脑赢 */

printf("要悔棋吗六子棋源码人机对战?请输入y或n:"); getchar(); scanf("%c",ch);

while(ch!='y'ch!='n') { printf("输入错误,请重新输入:");

scanf("%c",ch); }

if(ch=='n') {

printf("下不过电脑很正常,请不要灰心!!!\n"); return; }

else { x+=2; qipan[d][c]=SPA; qipan[b1][a1]=SPA;

system("cls"); draw(); } /* 悔棋 */

}

printf("电脑下在%d %d\n请输入:",c,d);

scanf("%d%d",a,b); /* 玩家下子 */

if(a==15b==15) {

x+=2; qipan[d][c]=SPA; qipan[b1][a1]=SPA; system("cls"); draw();

printf("请输入:"); scanf("%d%d",a,b); } /* 悔棋 */

while((a0||a14)||(b0||b14)||qipan[b][a]!=SPA) {

printf("坐标错误或该位置已有子!请重新输入:");

scanf("%d%d",a,b); }

a1=a; b1=b; x--; qipan[b][a]=MAN; system("cls"); draw();

if(win(a,b)){ printf("电脑神马的都是浮云!!!\n");

return; } /* 玩家赢 */

}

printf("和局\n");

}

if(choice==2){

system("cls");

printf("欢迎使用五子棋人人对战!下子请输入坐标(如13 6)。悔棋请输入15 15。 \n\n\n");

for(j=0;j15;j++)

for(i=0;i15;i++)

qipan[j][i]=SPA; /* 置棋盘全为空 */

draw();

while(x!=0){

printf("1P请输入:"); scanf("%d%d",a,b);

if(a==15b==15) {

x+=2; qipan[d][c]=SPA; qipan[b1][a1]=SPA; system("cls");

draw(); printf("1P请输入:"); scanf("%d%d",a,b); }

while((a0||a14)||(b0||b14)||qipan[b][a]!=SPA) {

printf("坐标错误或该位置已有子!请重新输入:");

scanf("%d%d",a,b); }

a1=a; b1=b; x--; qipan[b][a]=MAN; system("cls"); draw();

printf("1P下在%d %d。\n",a,b);

if(win(a,b)){ printf("你真棒!!!\n"); return; } /* 玩家1赢 */

printf("2P请输入:"); scanf("%d%d",c,d);

if(c==15d==15) {

x+=2; qipan[b][a]=SPA; qipan[d1][c1]=SPA; system("cls"); draw();

printf("2P请输入:"); scanf("%d%d",c,d); }

while((c0||c14)||(d0||d14)||qipan[d][c]!=SPA) {

printf("坐标错误或该位置已有子!请重新输入:"); scanf("%d%d",c,d);

}

c1=c; d1=d; x--; qipan[d][c]=COM; system("cls"); draw();

printf("2P下在%d %d。\n",c,d);

if(win(c,d)){ printf("你真棒!!!\n"); return; } /* 玩家2赢 */

}

printf("和局\n");

}

}

void draw() /* 画棋盘 */

{

int i,j;

char p[15][15][4];

for(j=0;j15;j++)

for(i=0;i15;i++){

if(qipan[j][i]==SPA) strcpy(p[j][i]," \0");

if(qipan[j][i]==MAN) strcpy(p[j][i],"●\0");

if(qipan[j][i]==COM) strcpy(p[j][i],"◎\0"); }

printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 \n");

printf(" ┌—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┐\n");

for(i=0,j=0;i14;i++,j++){

printf(" %2d│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%d\n",j,p[i][0],p[i][1],p[i][2],p[i][3],p[i][4],p[i][5],p[i][6],p[i][7],p[i][8],p[i][9],p[i][10],p[i][11],p[i][12],p[i][13],p[i][14],j);

printf(" ├—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┤\n"); }

printf(" 14│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│0\n",p[14][0],p[14][1],p[14][2],p[14][3],p[14][4],p[14][5],p[14][6],p[14][7],p[14][8],p[14][9],p[14][10],p[14][11],p[14][12],p[14][13],p[14][14]);

printf(" └—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┘\n");

printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 \n");

}

int win(int p,int q) /* 判断胜利 p q为判断点坐标,胜利返回1,否则返回0 */

{

int k,n=1,m,P,Q; /* k储存判断点p q的状态COM或MAN。P Q储存判断点坐标。n为判断方向。m为个数。 */

P=p; Q=q; k=qipan[q][p];

while(n!=5){

m=0;

while(k==qipan[q][p]){

m++; if(m==5) return 1;

yiwei(n,p,q); if(p0||p14||q0||q14) break;

}

n+=4; m-=1; p=P; q=Q; /* 转向判断 */

while(k==qipan[q][p]){

m++;

if(m==5) return 1;

yiwei(n,p,q); if(p0||p14||q0||q14) break;

}

n-=3; p=P; q=Q; /* 不成功则判断下一组方向 */

}

return 0;

}

void AI(int *p,int *q) /* 电脑下子 *p *q返回下子坐标 */

{

int i,j,k,max=0,I,J; /* I J为下点坐标 */

for(j=0;j15;j++)

for(i=0;i15;i++)

if(qipan[j][i]==SPA){ /* 历遍棋盘,遇到空点则计算价值,取最大价值点下子。 */

k=value(i,j); if(k=max) { I=i; J=j; max=k; }

}

*p=I; *q=J;

}

int value(int p,int q) /* 计算空点p q的价值 以k返回 */

{

int n=1,k=0,k1,k2,K1,K2,X1,Y1,Z1,X2,Y2,Z2,temp;

int a[2][4][4]={40,400,3000,10000,6,10,600,10000,20,120,200,0,6,10,500,0,30,300,2500,5000,2,8,300,8000,26,160,0,0,4,20,300,0}; /* 数组a中储存己方和对方共32种棋型的值 己方0对方1 活0冲1空活2空冲3 子数0-3(0表示1个子,3表示4个子) */

while(n!=5){

k1=qixing(n,p,q); n+=4; /* k1,k2为2个反方向的棋型编号 */

k2=qixing(n,p,q); n-=3;

if(k1k2) { temp=k1; k1=k2; k2=temp; } /* 使编号小的为k1,大的为k2 */

K1=k1; K2=k2; /* K1 K2储存k1 k2的编号 */

Z1=k1%10; Z2=k2%10; k1/=10; k2/=10; Y1=k1%10; Y2=k2%10; k1/=10; k2/=10;

X1=k1%10; X2=k2%10; /* X Y Z分别表示 己方0对方1 活0冲1空活2空冲3 子数0-3(0表示1个子,3表示4个子) */

if(K1==-1) {

if(K20) { k+=0; continue; } else k+=a[X2][Y2][Z2]+5; continue; }; /* 空棋型and其他 */

if(K1==-2) { if(K20) { k+=0; continue; }

else k+=a[X2][Y2][Z2]/2; continue; }; /* 边界冲棋型and其他 */

if(K1==-3) { if(K20) { k+=0; continue; }

else k+=a[X2][Y2][Z2]/3; continue; }; /* 边界空冲棋型and其他 */

if(((K1-1K14)((K2-1K24)||(K29K214)))||((K199K1104)((K299K2104)||(K2109K2114)))){

/* 己活己活 己活己冲 对活对活 对活对冲 的棋型赋值*/

if(Z1+Z2=2) { k+=a[X2][Y2][3]; continue; }

else { k+=a[X2][Y2][Z1+Z2+1]; continue; }

}

if(((K19K114)(K29K214))||((K1109K1114)(K2109K2114))){

/* 己冲己冲 对冲对冲 的棋型赋值*/

if(Z1+Z2=2) { k+=10000; continue; }

else { k+=0; continue; }

}

if(((K1-1K14)((K299K2104)||(K2109K2114)))||((K19K114)((K299K2104)||(K2109K2114)))){

/* 己活对活 己活对冲 己冲对活 己冲对冲 的棋型赋值*/

if(Z1==3||Z2==3) { k+=10000; continue; }

else { k+=a[X2][Y2][Z2]+a[X1][Y1][Z1]/4; continue; }

}

else

{ k+=a[X1][Y1][Z1]+a[X2][Y2][Z2]; continue; } /* 其他棋型的赋值 */

}

return k;

}

int qixing(int n,int p,int q) /* 返回空点p q在n方向上的棋型号 n为1-8方向 从右顺时针开始数 */

{

int k,m=0; /* 棋型号注解: 己活000-003 己冲010-013 对活100-103 对冲110-113 己空活020-023 己空冲030-033 对空活120-123 对空冲130-133 空-1 边界冲-2 边界空冲-3*/

yiwei(n,p,q);

if(p0||p14||q0||q14) k=-2; /* 边界冲棋型 */

switch(qipan[q][p]){

case COM:{

m++; yiwei(n,p,q);

if(p0||p14||q0||q14) { k=m+9; return k; }

while(qipan[q][p]==COM) {

m++; yiwei(n,p,q); if(p0||p14||q0||q14) { k=m+9; return k; }

}

if(qipan[q][p]==SPA) k=m-1; /* 己方活棋型 */

else k=m+9; /* 己方冲棋型 */

}break;

case MAN:{

m++; yiwei(n,p,q);

if(p0||p14||q0||q14) { k=m+109; return k; }

while(qipan[q][p]==MAN) {

m++; yiwei(n,p,q); if(p0||p14||q0||q14) { k=m+109; return k; }

}

if(qipan[q][p]==SPA) k=m+99; /* 对方活棋型 */

else k=m+109; /* 对方冲棋型 */

}break;

case SPA:{

yiwei(n,p,q);

if(p0||p14||q0||q14) { k=-3; return k; } /* 边界空冲棋型 */

switch(qipan[q][p]){

case COM:{

m++; yiwei(n,p,q);

if(p0||p14||q0||q14) { k=m+29; return k; }

while(qipan[q][p]==COM) {

m++; yiwei(n,p,q);

if(p0||p14||q0||q14) { k=m+29; return k; }

}

if(qipan[q][p]==SPA) k=m+19; /* 己方空活棋型 */

else k=m+29; /* 己方空冲棋型 */

}break;

case MAN:{

m++; yiwei(n,p,q);

if(p0||p14||q0||q14) { k=m+129; return k; }

while(qipan[q][p]==MAN) {

m++; yiwei(n,p,q);

if(p0||p14||q0||q14) { k=m+129; return k; }

}

if(qipan[q][p]==SPA) k=m+119; /* 对方空活棋型 */

else k=m+129; /* 对方空冲棋型 */

}break;

case SPA: k=-1; break; /* 空棋型 */

}

}break;

}

return k;

}

void yiwei(int n,int *i,int *j) /* 在n方向上对坐标 i j 移位 n为1-8方向 从右顺时针开始数 */

{

switch(n){

case 1: *i+=1; break;

case 2: *i+=1; *j+=1; break;

case 3: *j+=1; break;

case 4: *i-=1; *j+=1; break;

case 5: *i-=1; break;

case 6: *i-=1; *j-=1; break;

case 7: *j-=1; break;

case 8: *i+=1; *j-=1; break;

}

}

求一原创的c语言五子棋代码(会查重),要求人机对战,输入坐标对战即可,不需用鼠标点击,最好有禁手。

#define _CRT_SECURE_NO_WARNINGS

#include stdio.h

#include stdlib.h

#include assert.h

//棋盘初始化函数

//Chessboard棋盘数组,ln=棋盘大小,成功返回Chessboard,不成功NULL

void init_Chessboard(char Chessboard[][7], int ln)

{

if ((Chessboard != NULL) (ln0)){

int i = 0, j = 0;

for (i = 0; iln; ++i){

for (j = 0; jln; ++j){

Chessboard[i][j] = '\t';

}

}

// return Chessboard;

}

// return NULL;

}

//未完待续

使用c语言编写一个人机对战下棋程序

#include "stdafx.h"

#include "resource.h"

#include "define.h"

#include "box.h"

#include "moveGeneration.h"

#pragma comment(lib, "winmm.lib")

#include Mmsystem.h

#define MAX_LOADSTRING 100

#define BOXBMP_WIDTH 537 /* 棋盘图片宽度 */

#define BOXBMP_HEIGHT 537 /* 棋盘图片高度 */

#define SPACE 20 /* 棋盘图片和窗口边沿间隔 */

#define UNIT_WIDTH 35 /* 每个棋格宽度 */

#define UNIT_HEIGHT 35 /* 每个棋格高度 */

#define STONE_WIDTH 20 /* 棋子宽度 */

/* 窗口宽度 = 两边空白 + 棋盘图片宽度 + 窗口边框宽度 */

#define WIN_WIDTH 2*SPACE+BOXBMP_WIDTH+2*GetSystemMetrics(SM_CXDLGFRAME)

/* 窗口高度 = 标题栏高度 + 上下两边空白 + 棋盘图片高度 + 窗口边框高度 */

#define WIN_HEIGHT GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CYMENU)+2*SPACE\

+BOXBMP_HEIGHT+2*GetSystemMetrics(SM_CXDLGFRAME)

//////////////////////////////////////////////////////////////////////

// 全局变量:

static HINSTANCE hInst; // 当前实例

static TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本

static TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名

//////////////////////////////////////////////////////////////////////

// 此代码模块中包含的函数的前向声明:

ATOM InitApplication(HINSTANCE hInstance);

BOOL InitInstance(HINSTANCE, int);

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

BOOL CALLBACK About(HWND, UINT, WPARAM, LPARAM);

////////////////////////////////////////////////////////////////////// 绘制棋子

void DrawStone(HDC hdc, int column, int row, STONE_TYPE stone)

{

HPEN hpen;

HBRUSH hbrush;

switch (stone)

{

case BLACK_STONE: //黑子

hpen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));

hbrush = CreateSolidBrush(RGB(0, 0, 0));

break;

case WHITE_STONE: //白子

hpen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255));

hbrush = CreateSolidBrush(RGB(255, 255, 255));

break;

default:

return;

}

SelectObject(hdc, hpen);

SelectObject(hdc, hbrush);

Ellipse(hdc, column*34.9+35, row*34.9+35, column*34.9+55, row*34.9+55);

DeleteObject(hpen);

DeleteObject(hbrush);

return;

}

//////////////////////////////////////////////////////////// 绘制棋盘

void DrawChessBox(HDC hdc, STONE_TYPE box[BOX_ROW][BOX_COL])

{

assert(NULL != box);

HBITMAP hBitmap;

HDC hdcSrc;

hBitmap = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_CHESSBOX));

hdcSrc = CreateCompatibleDC(hdc);

SelectObject(hdcSrc, hBitmap);

BitBlt(hdc, SPACE, SPACE, BOXBMP_WIDTH, BOXBMP_HEIGHT, hdcSrc, 0, 0, SRCCOPY);

DeleteObject(hBitmap);

for(int column=0; columnBOX_COL; column++)

{

for(int row=0; rowBOX_ROW; row++)

{

DrawStone(hdc, column, row, box[column][row]);

}

}

}

////////////////////////////////////////////////////////////////////

//重新开始

static STONE_TYPE NewGame(HWND hWnd, STONE_TYPE box[BOX_ROW][BOX_COL])

{

boxInit(box);//清空

InvalidateRect(hWnd, NULL, FALSE);//重绘

return BLACK_STONE;

}

/**

* @brief 放置棋子

* @param hWnd 窗口句柄

* @param box 当前棋盘

* @param point 当前所下棋子在棋盘中的坐标

* @return TRUE 游戏结束, FALSE 游戏未结束

*/

static BOOL PlaceStone(HWND hWnd, STONE_TYPE box[BOX_ROW][BOX_COL], POINTS point, STONE_TYPE stone)

{

STONE_TYPE successStone = NONE_STONE;

boxSetStone(box, point.x, point.y, stone);

InvalidateRect(hWnd, NULL, FALSE);//重绘

PlaySound(MAKEINTRESOURCE(IDW_TADA), hInst, SND_RESOURCE|SND_SYNC);

successStone = boxIsOver(box, point.x, point.y);

if (WHITE_STONE == successStone)

{

MessageBox(hWnd, TEXT("白子获胜!"), TEXT("提示"), MB_OK|MB_ICONINFORMATION);

return TRUE;

}

else if (BLACK_STONE == successStone)

{

MessageBox(hWnd, TEXT("黑子获胜!"), TEXT("提示"), MB_OK|MB_ICONINFORMATION);

return TRUE;

}

return FALSE;

}

int APIENTRY _tWinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR lpCmdLine,

int nCmdShow)

{

UNREFERENCED_PARAMETER(hPrevInstance);

UNREFERENCED_PARAMETER(lpCmdLine);

MSG msg;

HACCEL hAccelTable;

// 初始化全局字符串

LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

LoadString(hInstance, IDC_GOBANG, szWindowClass, MAX_LOADSTRING);

InitApplication(hInstance);

// 执行应用程序初始化:

if (!InitInstance (hInstance, nCmdShow))

{

return FALSE;

}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_GOBANG));

// 主消息循环:

while (GetMessage(msg, NULL, 0, 0))

{

if (!TranslateAccelerator(msg.hwnd, hAccelTable, msg))

{

TranslateMessage(msg);

DispatchMessage(msg);

}

}

return (int) msg.wParam;

}

//

// 函数: InitApplication()

//

// 目的: 注册窗口类。

//

// 注释:

//

// 仅当希望

// 此代码与添加到 Windows 95 中的“RegisterClassEx”

// 函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,

// 这样应用程序就可以获得关联的

// “格式正确的”小图标。

//

ATOM InitApplication(HINSTANCE hInstance)

{

WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;

wcex.lpfnWndProc = WndProc;

wcex.cbClsExtra = 0;

wcex.cbWndExtra = 0;

wcex.hInstance = hInstance;

wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_BIG));

wcex.hCursor = LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW);

wcex.lpszMenuName = MAKEINTRESOURCE(IDC_GOBANG);

wcex.lpszClassName = szWindowClass;

wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassEx(wcex);

}

//

// 函数: InitInstance(HINSTANCE, int)

//

// 目的: 保存实例句柄并创建主窗口

//

// 注释:

//

// 在此函数中,我们在全局变量中保存实例句柄并

// 创建和显示主程序窗口。

/////////////////////////////////////////////////////////清空棋盘

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

HWND hWnd;

hInst = hInstance; // 将实例句柄存储在全局变量中

int nWidth, nHeight;

nWidth = WIN_WIDTH/*585*/;

nHeight = WIN_HEIGHT/*630*/;

hWnd = CreateWindow(szWindowClass, szTitle,

WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,

(GetSystemMetrics(SM_CXSCREEN)-nWidth)/2, (GetSystemMetrics(SM_CYSCREEN)-nHeight)/2,

nWidth, nHeight,

NULL, NULL, hInstance, NULL);

if (!hWnd)

{

return FALSE;

}

ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);

return TRUE;

}

///////////////////////////////////////////// “关于”框的消息处理程序。

BOOL CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

{

UNREFERENCED_PARAMETER(lParam);

switch (message)

{

case WM_INITDIALOG:

return TRUE;

case WM_COMMAND:

if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)

{

EndDialog(hDlg, LOWORD(wParam));

return TRUE;

}

break;

}

return (INT_PTR)FALSE;

}

///////////////////////////////////////////////////////////////////

//

// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)

//

// 目的: 处理主窗口的消息。

//

// WM_COMMAND - 处理应用程序菜单

// WM_PAINT - 绘制主窗口

// WM_DESTROY - 发送退出消息并返回

//

//

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

static STONE_TYPE box[BOX_ROW][BOX_COL];

static STONE_TYPE currentStone = BLACK_STONE;

static BOOL startFlag = FALSE;//设置标志符

static int mode = IDM_MODE_MAN2COMPUTER;

HMENU hMenu = NULL;

switch (message)

{

case WM_CREATE : // 创建窗口

hMenu = GetMenu(hWnd);

CheckMenuItem(hMenu, mode, MF_CHECKED);

break;

case WM_COMMAND:

int wmId, wmEvent;

wmId = LOWORD(wParam);

wmEvent = HIWORD(wParam);

hMenu = GetMenu(hWnd);

// 分析菜单选择:

switch (wmId)

{

case IDM_ABOUT:

DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);

break;

case IDM_EXIT:

PostMessage(hWnd,WM_CLOSE,0,0);

break;

case IDM_START://////////////////////////////////////////////////////////开始下棋

currentStone = NewGame(hWnd, box);//先下的棋子颜色

startFlag = TRUE;

break;

case IDM_MODE_MAN2COMPUTER :

CheckMenuItem(hMenu, mode, MF_UNCHECKED);

mode = IDM_MODE_MAN2COMPUTER;

currentStone = NewGame(hWnd, box);

CheckMenuItem(hMenu, mode, MF_CHECKED);

break;

case IDM_MODE_MAN2MAN :

CheckMenuItem(hMenu, mode, MF_UNCHECKED);

mode = IDM_MODE_MAN2MAN;

currentStone = NewGame(hWnd, box);

CheckMenuItem(hMenu, mode, MF_CHECKED);

break;

}

break;

case WM_PAINT:

HDC hdc;

PAINTSTRUCT ps;

hdc = BeginPaint(hWnd, ps);

DrawChessBox(hdc, box);

EndPaint(hWnd, ps);

break;

case WM_LBUTTONUP: //鼠标提起

if (!startFlag) // 没有点击开始

{

return 0;

}

POINTS point;

point = MAKEPOINTS(lParam);

//判断鼠标是否点击棋盘

if(point.x 35 point.x 542 point.y 35 point.y 542)

{

//通过鼠标点击位置计算出棋子放置位置

point.x = (point.x - 35) / 34;

point.y = (point.y - 35) / 34;

if(boxGetStone(box, point.x, point.y) == NONE_STONE)

{

if (PlaceStone(hWnd, box, point, currentStone))

{

currentStone = NewGame(hWnd, box);

}

else

{

switch (currentStone)

{

case BLACK_STONE :

currentStone = WHITE_STONE;

break;

case WHITE_STONE :

currentStone = BLACK_STONE;

break;

default :

break;

}

}

// 人机对弈,由计算机搜索最优结果

if (mode == IDM_MODE_MAN2COMPUTER)

{

point = moveGeneration(box);

if (PlaceStone(hWnd, box, point, currentStone))

{

currentStone = NewGame(hWnd, box);

}

else

{

currentStone = BLACK_STONE; /* 人机对弈,人执黑子 */

}

}

}

else

{

MessageBox(hWnd, TEXT("此处已放置了棋子"), TEXT("警告"), MB_OK | MB_ICONWARNING);

}

}

break;

case WM_CLOSE:

if(MessageBox(hWnd, TEXT("确认要退出快乐五子棋游戏吗?"), TEXT("提示"), MB_YESNO | MB_ICONASTERISK)==IDYES)

{

DestroyWindow(hWnd);

}

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

return DefWindowProc(hWnd, message, wParam, lParam);

}

return 0;

}

还是不简单啊,嘿嘿,初学就要这么复杂的代码啊,要是好就给分哈

发表评论

评论列表

  • 性许山柰(2022-07-17 03:30:56)回复取消回复

    chEngine.cpp 这一对文件定义了搜索引擎接口。HistoryHeuristic.hHistoryHeuristic.cpp 这一对文件定义并实现历史启发类。TranspositionTable.hTrans

  • 萌懂怀桔(2022-07-17 05:13:24)回复取消回复

    mode = IDM_MODE_MAN2COMPUTER; HMENU hMenu = NULL; switch (message) { case WM_CREATE : // 创建窗口 hMenu = GetMenu(