A. 怎樣用C語言編一個簡單的五子棋游戲
#include <graphics.h>
#include <stdio.h>
#include <MATH.H>
IMAGE* IMG;
IMAGE* IMG2;
IMAGE* IMG3;
IMAGE* whole;
bool mark = false;
int x = 0, y = 0;
int flag[15][15];
void show()
{
outtextxy(550, 100, "白方:");
outtextxy(550, 150, " 箭頭移動");
outtextxy(550, 200, " 回車鍵落子");
outtextxy(550, 250, "黑方:");
outtextxy(550, 300, " ADWS移動");
outtextxy(550, 350, " 空格鍵落子");
}
int success1(int dir1, int dir2)
{
int number = 0;
int temp_x = x, temp_y = y;
while (((temp_x / 35 + dir1) >= 0 && (temp_x / 35 + dir1) < 15) && ((temp_y / 35 + dir2) >= 0 && (temp_y / 35 + dir2) < 15) && (flag[(temp_x / 35 + dir1)][(temp_y / 35 + dir2)] == 1))
{
temp_x = temp_x + dir1 * 35;
temp_y = temp_y + dir2 * 35;
++number;
}
return number;
}
int success2(int dir1, int dir2)
{
int number = 0;
int temp_x = x, temp_y = y;
while (((temp_x / 35 + dir1) >= 0 && (temp_x / 35 + dir1) < 15) && ((temp_y / 35 + dir2) >= 0 && (temp_y / 35 + dir2) < 15) && (flag[(temp_x / 35 + dir1)][(temp_y / 35 + dir2)] == 2))
{
temp_x = temp_x + dir1 * 35;
temp_y = temp_y + dir2 * 35;
++number;
}
return number;
}
int success1()
{
int number = 0;
number = success1(0, -1) + success1(0, 1);//上下
if (number < 4)
{
number = success1(-1, 0) + success1(1, 0);//左右
if (number < 4)
{
number = success1(-1, -1) + success1(1, 1);//左上右下
if (number < 4)
{
number = success1(-1, 1) + success1(1, -1);//左下右上
}
}
}
return number;
}
int success2()
{
int number = 0;
number = success2(0, -1) + success2(0, 1);//上下
if (number < 4)
{
number = success2(-1, 0) + success2(1, 0);//左右
if (number < 4)
{
number = success2(-1, -1) + success2(1, 1);//左上右下
if (number < 4)
{
number = success2(-1, 1) + success2(1, -1);//左下右上
}
}
}
return number;
}
void control()
{
char key = 0;
while (key != 27)
{
Sleep(10);
if (kbhit())
{
key = getch();
switch (key)
{
case VK_LEFT:
if (mark)
break;
if (x > 0)
x = x - 35;
break;
case 'a':
case 'A':
if (!mark)
break;
if (x > 0)
x = x - 35;
break;
case VK_RIGHT:
if (mark)
break;
if (x < 490)
x = x + 35;
break;
case 'd':
case 'D':
if (!mark)
break;
if (x < 490)
x = x + 35;
break;
case VK_UP:
if (mark)
break;
if (y > 0)
y = y - 35;
break;
case 'w':
case 'W':
if (!mark)
break;
if (y > 0)
y = y - 35;
break;
case VK_DOWN:
if (mark)
break;
if (y < 490)
y = y + 35;
break;
case 's':
case 'S':
if (!mark)
break;
if (y < 490)
y = y + 35;
break;
case VK_RETURN:
if (mark)
break;
if (flag[x / 35][y / 35] == 0)
{
putimage(whole, x + 6, y + 6, 31, 32, IMG2, 0, 0);
flag[x / 35][y / 35] = 1;
if (success1() >= 4)
{
outtextxy(600, 50, "黑方 勝!");
key = 27;
}
mark = true;
}
break;
case VK_SPACE:
if (!mark)
break;
if (flag[x / 35][y / 35] == 0)
{
putimage(whole, x + 6, y + 6, 31, 31, IMG3, 0, 0);
flag[x / 35][y / 35] = 2;
if (success2() >= 4)
{
outtextxy(600, 50, "白方 勝!");
key = 27;
}
mark = false;
}
break;
default:
break;
}
putimage(0, 0, whole);
putimage_transparent(NULL, IMG, x + 20, y + 20, 0x0, 0, 0, 20, 20);
}
}
}
void main()
{
setinitmode(0);
initgraph(800, 538);
SetWindowText(GetHWnd(), "五子棋20110327");
setcolor(0xffffff);
setfont(36, 0, "楷體_GB2312");
IMAGE* IMG1 = new IMAGE;
getimage(IMG1, "JPG", MAKEINTRESOURCE(102));//棋盤
putimage(0, 0, IMG1);
IMG2 = new IMAGE;
getimage(IMG2, "JPG", MAKEINTRESOURCE(103));//黑棋
IMG3 = new IMAGE;
getimage(IMG3, "JPG", MAKEINTRESOURCE(104));//白棋
IMG = new IMAGE;
getimage(IMG, "GIF", MAKEINTRESOURCE(101));//手形
whole = new IMAGE;
getimage(whole, 0, 0, 537, 537);
putimage_transparent(NULL, IMG, x + 20, y + 20, 0x0, 0, 0, 20, 20);
show();
control();
delete IMG1;
delete IMG2;
delete IMG3;
delete whole;
getch();
getch();
closegraph();
}
B. 求用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; column<BOX_COL; column++)
{
for(int row=0; row<BOX_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. 求五子棋C語言AI演算法(原創思路)
我有個簡單的思路: 先定義一條線上棋子的各種布局,比如初步定義長度為五個子 ◎◎◎◎● ◎◎●◎× ◎●◎×× ◎×◎×◎ 等等。白圈是自己的子,黑圈是對方的子,叉子是未走的格子。 程序里有個布局表,再定義各個布局的分數,比如連五最99分,連三30分等等。 ...
D. C語言五子棋演算法
任何一種棋類游戲其關鍵是對當前棋局是否有正確的評分,評分越准確則電腦的AI越高。五子棋游戲也是如此,但在打分之前,我們先掃描
整個棋盤,把每個空位從八個方向上的棋型填入數組gStyle(2, 15, 15, 8, 2),其中第一個下標為1時表示黑棋,為2時表示白棋,第二和第三
個下標表示(x,y),第四個下標表示8個方向,最後一個下標為1時表示棋子數,為2時表示空格數,如:gStyle(1,2,2,1,1)=3表示與坐標(2,2)在第1個方向上相鄰的黑棋棋子數為3
gstyle(1,2,2,1,2)=4表示與坐標(2,2)在第1個方向上的最近的空格數為4
在定義方向時,也應該注意一定的技巧,表示兩個相反的方向的數應該差4,在程序中我是這樣定義的:
Const DIR_UP = 1
Const DIR_UPRIGHT = 2
Const DIR_RIGHT = 3
Const DIR_RIGHTDOWN = 4
Const DIR_DOWN = 5
Const DIR_DOWNLEFT = 6
Const DIR_LEFT = 7
Const DIR_LEFTUP = 8
這樣我們前四個方向可以通過加四得到另一個方向的值。如果你還是不太明白,請看下面的圖:
---------
---------
---oo----
-ox*xx---
---------
---------
圖中的*點從標為(4,4),(打*的位置是空位),則:
gStyle(2,4,4,1,1)=1在(4,4)點相鄰的上方白棋數為1
gStyle(2,4,4,1,2)=2在(4,4)點的上方距上方白棋最近的空格數為2
gStyle(1,4,4,3,1)=2在(4,4)點相鄰的右方黑棋數為2
gStyle(1,4,4,3,2)=1在(4,4)點的右方距右方黑棋最近的空格數為3
...一旦把所有空點的棋型值填完,我們很容易地得出黑棋水平方向上點(4,4)的價值,由一個沖1(我把有界的棋稱為沖)和活2(兩邊無界的
棋稱為活)組成的。對於而白棋在垂直方向上點(4,4)的價值是一個活1,而在/方向也是活1所以,只要我們把該點的對於黑棋和白棋的價值算出
來,然後我們就取棋盤上各個空點的這兩個值的和的最大一點作為下棋的點。然而,對各種棋型應該取什麼值呢?我們可以先作如下假設:
Fn 表示先手n個棋子的活棋型,如:F4表示先手活四
Fn'表示先手n個棋子的沖棋型,如:F4'表示先手沖四
Ln 表示後手n個棋子的活棋型,如:L3表示後手活三
Ln'表示後手n個棋子的沖棋型,如:L3'表示後手沖三
.
.
.
根據在一行中的棋型分析,得到如下關系:
L1'<=F1'<L2'<=F2'<=L1<F1<L2<F2<L3'<=F3'<L4'<F4'=F4
從這個關系包含了進攻和防守的關系(當然,這個關系是由我定的,你可以自己定義這些關系)。對這些關系再進一步細化,如在一個可下
棋的點,其四個方向上都有活三,也比不上一個沖四,所以我們可以又得到4*F3<L4'這個關系,同樣,我們還可以得到其它的關系,如:4*F2<L3、4*L3<F3...,這些的關系由於你的定法和我的定法制可能不一樣,這樣計算機的AI也就不一樣,最後我們把分值最小的L1'值定為1,則我們就得
到了下面各種棋型的分值,由C語言表示為:
F[2][5]={{0,2,5,50,16000},{0,10,30,750,16000}};
L[2][5]={{0,1,5,50,3750},{0,10,30,150,4000}};
F數組表示先手,第一個下標為0時表示沖型,第二個下標表示棋子數,則F2'對應F[0][2]L數組表示後手,第一個下標為0時表示沖型,第二
個下標表示棋子數,則L2對應F[1][2]Ok,棋型的分值關系確定好了以後,我們把每一個可下點的四個方向的棋型值相加(包括先手和後手的分
值),最後選擇一個最大值,並把這一點作為計算機要下的點就OK了:)。後話:
1、得到最大值也許不止一個點,但在我的程序中只選擇第一個最大點,當然你可以用於個隨機數來決定
選擇那一個最大值點,也可以對這些最大值點再作進一步的分析。
2、在這個演算法中我只考慮了周圍有棋子的點,而其它點我沒有考慮。
3、可以再更進一步,用這個演算法來預測以後的幾步棋,再選擇預測值最好的一步,這樣電腦的AI就更高了
4、這個演算法沒有考慮黑棋的禁手(雙3、雙四和多於五子的連棋)。因為在平時我下的五子棋是沒有這些
禁手的。
E. c語言的五子棋代碼(博弈演算法)
#include<stdio.h>
#include<bios.h>
#include<ctype.h>
#include<conio.h>
#include<dos.h>
#defineCROSSRU0xbf/*右上角點*/
#defineCROSSLU0xda/*左上角點*/
#defineCROSSLD0xc0/*左下角點*/
#defineCROSSRD0xd9/*右下角點*/
#defineCROSSL0xc3/*左邊*/
#defineCROSSR0xb4/*右邊*/
#defineCROSSU0xc2/*上邊*/
#defineCROSSD0xc1/*下邊*/
#defineCROSS0xc5/*十字交叉點*/
/*定義棋盤左上角點在屏幕上的位置*/
#defineMAPXOFT5
#defineMAPYOFT2
/*定義1號玩家的操作鍵鍵碼*/
#definePLAY1UP0x1157/*上移--'W'*/
#definePLAY1DOWN0x1f53/*下移--'S'*/
#definePLAY1LEFT0x1e41/*左移--'A'*/
#definePLAY1RIGHT0x2044/*右移--'D'*/
#definePLAY1DO0x3920/*落子--空格鍵*/
/*定義2號玩家的操作鍵鍵碼*/
#definePLAY2UP0x4800/*上移--方向鍵up*/
#definePLAY2DOWN0x5000/*下移--方向鍵down*/
#definePLAY2LEFT0x4b00/*左移--方向鍵left*/
#definePLAY2RIGHT0x4d00/*右移--方向鍵right*/
#definePLAY2DO0x1c0d/*落子--回車鍵Enter*/
/*若想在游戲中途退出,可按Esc鍵*/
#defineESCAPE0x011b
/*定義棋盤上交叉點的狀態,即該點有無棋子*/
/*若有棋子,還應能指出是哪個玩家的棋子*/
#defineCHESSNULL0/*沒有棋子*/
#defineCHESS1'O'/*一號玩家的棋子*/
#defineCHESS2'X'/*二號玩家的棋子*/
/*定義按鍵類別*/
#defineKEYEX99v0/*退出鍵*/
#defineKEYFALLCHESS1/*落子鍵*/
#defineKEYMOVECURSOR2/*游標移動鍵*/
#defineKEYINVALID3/*無效鍵*/
/*定義符號常量:真,假---真為1,假為0*/
#defineTRUE1
#defineFALSE0
/**********************************************************/
/*定義數據結構*/
/*棋盤交叉點坐標的數據結構*/
structpoint
{
intx,y;
};
或者下面這個:
#include<graphics.h>
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#defineN15
#defineB7
#defineSTOP-10000
#defineOK1
#defineNO0
#defineUP328
#defineDOWN336
#defineLEFT331
#defineRIGHT333
inta[N+1][N+1];
intzx,zy;
intwrite=1,biaoji=0;
structzn{
longsum;
inty;
intx;
}w[N+1][N+1],max,max1;
voidcbar(inti,intx,inty,intr);
voidmap(inta[][]);
intgetkey();
intkey();
voidzuobiao(intx,inty,inti);
inttu(inta[][],intwrite);
intwtu(inta[][],intwrite);
intneng(inta[][]);
intzh5(inty,intx,inta[][]);
longzzh5(intb[][],inti);
main()
{
inti,j;
intgdriver=DETECT;
intgmode;
initgraph(&gdriver,&gmode,"");
zx=(N+1)/2;
zy=(N+1)/2;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
a[i][j]=0;
map(a);
i=1;
while(i)
{
intk,n;
k=wtu(a,write);
if(k==STOP)gotoend;
map(a);
n=neng(a);
if(n==STOP)gotoend;
map(a);
}
end:
;
}
intneng(inta[N+1][N+1])
{
inti,j;
intk;
max.sum=-1;
for(i=0;i<=N;i++)
for(j=0;j<+N;j++)
{
w[i][j].sum=0;
w[i][j].x=i;
w[i][j].y=j;
}
for(i=1;i<=N-4;i++)
for(j=1;j<=N-4;j++)
{
k=zh5(i,j,a);
if(k==STOP)return(STOP);
}
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
{
if(max.sum<w[i][j].sum)
{
max.sum=w[i][j].sum;
max.y=i;
max.x=j;
}
elseif(max.sum==w[i][j].sum)
{
if(((max.y-zy)*(max.y-zy)+(max.x-zx)*(max.x-zx))>((i-zy)*(i-zy)+(j-zx)*(j-zx)))
max.sum=w[i][j].sum;
max.y=i;
max.x=j;
}
}
if(a[max.y][max.x]==0)
{
a[max.y][max.x]=-1;
zy=max.y;
zx=max.x;
}
}
intzh5(inty,intx,inta[N+1][N+1])
{
inti,j;
intb[6][6];
longc[13];
longd[6][6];
longtemp;
for(i=y;i<=y+4;i++)
for(j=x;j<=x+4;j++)
b[i+1-y][j+1-x]=a[i][j];
c[1]=b[1][1]+b[1][2]+b[1][3]+b[1][4]+b[1][5];
c[2]=b[2][1]+b[2][2]+b[2][3]+b[2][4]+b[2][5];
c[3]=b[3][1]+b[3][2]+b[3][3]+b[3][4]+b[3][5];
c[4]=b[4][1]+b[4][2]+b[4][3]+b[4][4]+b[4][5];
c[5]=b[5][1]+b[5][2]+b[5][3]+b[5][4]+b[5][5];
c[6]=b[1][1]+b[2][1]+b[3][1]+b[4][1]+b[5][1];
c[7]=b[1][2]+b[2][2]+b[3][2]+b[4][2]+b[5][2];
c[8]=b[1][3]+b[2][3]+b[3][3]+b[4][3]+b[5][3];
c[9]=b[1][4]+b[2][4]+b[3][4]+b[4][4]+b[5][4];
c[10]=b[1][5]+b[2][5]+b[3][5]+b[4][5]+b[5][5];
c[11]=b[1][1]+b[2][2]+b[3][3]+b[4][4]+b[5][5];
c[12]=b[1][5]+b[2][4]+b[3][3]+b[4][2]+b[5][1];
for(i=1;i<=12;i++)
{
switch(c[i])
{
case5:biaoji=1;return(STOP);
case-5:biaoji=-1;return(STOP);
case-4:c[i]=100000;break;
case4:c[i]=100000;break;
case-3:c[i]=150;break;
case3:c[i]=150;break;
case-2:c[i]=120;break;
case2:c[i]=100;break;
case-1:c[i]=1;break;
case1:c[i]=1;break;
default:c[i]=0;
}
}
for(i=1;i<=12;i++)
{
if(c[i]==150)
c[i]+=zzh5(b,i);
}
for(i=1;i<=5;i++)
for(j=1;j<=5;j++)
d[i][j]=0;
for(i=1;i<=5;i++)
for(j=1;j<=5;j++)
{
if(i==j)d[i][j]+=c[11];
if((i+j)==6)d[i][j]+=c[12];
d[i][j]+=c[i]+c[j+5];
}
for(i=1;i<=5;i++)
for(j=1;j<=5;j++)
{
if(b[i][j]!=0)
d[i][j]=-2;
}
max1.sum=-1;
max1.y=0;
max1.x=0;
for(i=1;i<=5;i++)
for(j=1;j<=5;j++)
{
if(max1.sum<d[i][j])
{
max1.sum=d[i][j];
max1.y=i;
max1.x=j;
w[i+y-1][j+x-1].sum+=max1.sum;
}
elseif(max1.sum==d[i][j])
{
if(((i+y-1-zy)*(i+y-1-zy)+(j+x-1-zx)*(j+x-1-zx))>((max1.y+y-1-zy)*(max1.y+y-1-zy)+(max1.x+x-1-zx)*(max1.x+x-1-zx)))
{
max1.sum=d[i][j];
max1.y=i;
max1.x=j;
}
}
}
}
longzzh5(intb[6][6],intn)
{
inti,j,k,l,m;
switch(n)
{
case1:i=b[1][1];j=b[1][2];k=b[1][3];l=b[1][4];m=b[1][5];break;
case2:i=b[2][1];j=b[2][2];k=b[2][3];l=b[2][4];m=b[2][5];break;
case3:i=b[3][1];j=b[3][2];k=b[3][3];l=b[3][4];m=b[3][5];break;
case4:i=b[4][1];j=b[4][2];k=b[4][3];l=b[4][4];m=b[4][5];break;
case5:i=b[5][1];j=b[5][2];k=b[5][3];l=b[5][4];m=b[5][5];break;
case6:i=b[1][1];j=b[2][1];k=b[3][1];l=b[4][1];m=b[5][1];break;
case7:i=b[1][2];j=b[2][2];k=b[3][2];l=b[4][2];m=b[5][2];break;
case8:i=b[1][3];j=b[2][3];k=b[3][3];l=b[4][3];m=b[5][3];break;
case9:i=b[1][4];j=b[2][4];k=b[3][4];l=b[4][4];m=b[5][4];break;
case10:i=b[1][5];j=b[2][5];k=b[3][5];l=b[4][5];m=b[5][5];break;
case11:i=b[1][1];j=b[2][2];k=b[3][3];l=b[4][4];m=b[5][5];break;
case12:i=b[1][5];j=b[2][4];k=b[3][3];l=b[4][2];m=b[5][1];break;
}
if((i==0&&j==1&&k==1&&l==1&&m==0))
return(900);
if((i==0&&j==-1&&k==-1&&l==-1&&m==0))
return(1000);
if((i==0&&j==0&&k==1&&l==1&&m==1)||(i==1&&j==1&&k==1&&l==0&&m==0))
return(20);
if((i==0&&j==0&&k==-1&&l==-1&&m==-1)||(i==-1&&j==-1&&k==-1&&l==0&&m==0))
return(20);
if((i==-1&&j==1&&k==1&&l==1&&m==1)||(i==1&&j==-1&&k==1&&l==1&&m==1)||(i==1&&j==1&&k==-1&&l==1&&m==1)||(i==1&&j==1&&k==1&&l==-1&&m==1)||(i==1&&j==1&&k==1&&l==1&&m==-1))
return(-60);
if((i==1&&j==-1&&k==-1&&l==-1&&m==-1)||(i==-1&&j==1&&k==-1&&l==-1&&m==-1)||(i==-1&&j==1&&k==-1&&l==-1&&m==-1)||(i==-1&&j==-1&&k==-1&&l==1&&m==-1)||(i==-1&&j==-1&&k==-1&&l==-1&&m==1))
return(-60);
}
intwtu(inta[N+1][N+1],intwrite)
{
inti=1;
map(a);
zuobiao(zx,zy,1);
while(i)
{
intk;
k=tu(a,write);
if(k==OK)i=0;
if(k==STOP)return(STOP);
}
}
intgetkey()
{
intkey,lo,hi;
key=bioskey(0);
lo=key&0x00ff;
hi=(key&0xff00)>>8;
return((lo==0)?hi+256:lo);
}
intkey()
{
intk;
k=getkey();
switch(k)
{
case27:return(STOP);
case13:
case'':return(OK);
case328:return(UP);
case336:return(DOWN);
case331:return(LEFT);
case333:return(RIGHT);
default:return(NO);
}
}
voidzuobiao(intx,inty,inti)
{
intr;
if(i!=0)
{
setcolor(GREEN);
for(r=1;r<=5;r++)
circle(75+25*x,25+25*y,r);
}
else
{
if(a[zy][zx]==1)
{
setcolor(8);
for(r=1;r<=5;r++)
circle(75+25*x,25+25*y,r);
}
elseif(a[zy][zx]==-1)
{
setcolor(WHITE);
for(r=1;r<=5;r++)
circle(75+25*x,25+25*y,r);
}
else
{
setcolor(B);
for(r=1;r<=5;r++)
circle(75+25*x,25+25*y,r);
setcolor(RED);line(75+25*zx-5,25+25*zy,75+25*x+5,25+25*zy);
line(75+25*zx,25+25*zy-5,75+25*zx,25+25*zy+5);
}
}
}
inttu(inta[N+1][N+1],intwrite)
{
intk;
re:
k=key();
if(k==OK)
{
if(a[zy][zx]==0)
{
a[zy][zx]=write;
}
else
gotore;
}
if(k==STOP)return(STOP);
if(k==NO)gotore;
if(k==UP)
{
inti,j;
if(zy==1)j=zy;
elsej=zy-1;
zuobiao(zx,zy,0);
zuobiao(zx,j,1);
zy=j;
gotore;
}
if(k==DOWN)
{
inti,j;
if(zy==N)j=zy;
elsej=zy+1;
zuobiao(zx,zy,0);
zuobiao(zx,j,1);
zy=j;
gotore;
}
if(k==LEFT)
{
inti,j;
if(zx==1)i=zx;
elsei=zx-1;
zuobiao(zx,zy,0);
zuobiao(i,zy,1);
zx=i;
gotore;
}
if(k==RIGHT)
{
inti,j;
if(zx==N)i=zx;
elsei=zx+1;
zuobiao(zx,zy,0);
zuobiao(i,zy,1);
zx=i;
gotore;
}
}
voidcbar(inti,intx,inty,intr)
{
if(i!=0)
{
if(i==1)
setcolor(8);
elseif(i==-1)
setcolor(WHITE);
for(i=1;i<=r;i++)
{
circle(x,y,i);
}
}
}
voidmap(inta[N+1][N+1])
{
inti,j;
cleardevice();
setbkcolor(B);
setcolor(RED);
for(i=0;i<N;i++)
{
line(100,50+25*i,75+N*25,50+25*i);
line(100+25*i,50,100+25*i,25+N*25);
}
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
cbar(a[i][j],75+25*j,25+25*i,10);
}