當前位置:首頁 » 操作系統 » 先手源碼

先手源碼

發布時間: 2022-05-13 19:49:02

① 求五子棋C源代碼

這個是稍微好一點的了,以前沒事試過

/*
五子棋
*/

#include<stdio.h>
#include<stdlib.h>
#include<graphics.h>
#include<bios.h>
#include<conio.h>

#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
#define SPACE 0x3920

#define BILI 20
#define JZ 4
#define JS 3
#define N 19

int box[N][N];
int step_x,step_y ;
int key ;
int flag=1 ;

void draw_box();
void draw_cicle(int x,int y,int color);
void change();
void judgewho(int x,int y);
void judgekey();
int judgeresult(int x,int y);
void attentoin();

void attention()
{
char ch ;
window(1,1,80,25);
textbackground(LIGHTBLUE);
textcolor(YELLOW);
clrscr();
gotoxy(15,2);
printf("游戲操作規則:");
gotoxy(15,4);
printf("Play Rules:");
gotoxy(15,6);
printf("1、按左右上下方向鍵移動棋子");
gotoxy(15,8);
printf("1. Press Left,Right,Up,Down Key to move Piece");
gotoxy(15,10);
printf("2、按空格確定落棋子");
gotoxy(15,12);
printf("2. Press Space to place the Piece");
gotoxy(15,14);
printf("3、禁止在棋盤外按空格");
gotoxy(15,16);
printf("3. DO NOT press Space outside of the chessboard");
gotoxy(15,18);
printf("你是否接受上述的游戲規則(Y/N)");
gotoxy(15,20);
printf("Do you accept the above Playing Rules? [Y/N]:");
while(1)
{
gotoxy(60,20);
ch=getche();
if(ch=='Y'||ch=='y')
break ;
else if(ch=='N'||ch=='n')
{
window(1,1,80,25);
textbackground(BLACK);
textcolor(LIGHTGRAY);
clrscr();
exit(0);
}
gotoxy(51,12);
printf(" ");
}
}
void draw_box()
{
int x1,x2,y1,y2 ;
setbkcolor(LIGHTBLUE);
setcolor(YELLOW);
gotoxy(7,2);
printf("Left, Right, Up, Down KEY to move, Space to put, ESC-quit.");
for(x1=1,y1=1,y2=18;x1<=18;x1++)
line((x1+JZ)*BILI,(y1+JS)*BILI,(x1+JZ)*BILI,(y2+JS)*BILI);
for(x1=1,y1=1,x2=18;y1<=18;y1++)
line((x1+JZ)*BILI,(y1+JS)*BILI,(x2+JZ)*BILI,(y1+JS)*BILI);
for(x1=1;x1<=18;x1++)
for(y1=1;y1<=18;y1++)
box[x1][y1]=0 ;
}

void draw_circle(int x,int y,int color)
{
setcolor(color);
setlinestyle(SOLID_LINE,0,1);
x=(x+JZ)*BILI ;
y=(y+JS)*BILI ;
circle(x,y,8);
}

void judgekey()
{
int i ;
int j ;
switch(key)
{
case LEFT :

if(step_x-1<0)
break ;
else
{
for(i=step_x-1,j=step_y;i>=1;i--)
if(box[i][j]==0)
{
draw_circle(step_x,step_y,LIGHTBLUE);
break ;
}
if(i<1)break ;
step_x=i ;
judgewho(step_x,step_y);
break ;
}
case RIGHT :

if(step_x+1>18)
break ;
else
{
for(i=step_x+1,j=step_y;i<=18;i++)
if(box[i][j]==0)
{
draw_circle(step_x,step_y,LIGHTBLUE);
break ;
}
if(i>18)break ;
step_x=i ;
judgewho(step_x,step_y);
break ;
}
case DOWN :

if((step_y+1)>18)
break ;
else
{
for(i=step_x,j=step_y+1;j<=18;j++)
if(box[i][j]==0)
{
draw_circle(step_x,step_y,LIGHTBLUE);
break ;
}
if(j>18)break ;
step_y=j ;
judgewho(step_x,step_y);
break ;
}
case UP :

if((step_y-1)<0)
break ;
else
{
for(i=step_x,j=step_y-1;j>=1;j--)
if(box[i][j]==0)
{
draw_circle(step_x,step_y,LIGHTBLUE);
break ;
}
if(j<1)break ;
step_y=j ;
judgewho(step_x,step_y);
break ;
}
case ESC :
break ;

case SPACE :
if(step_x>=1&&step_x<=18&&step_y>=1&&step_y<=18)
{
if(box[step_x][step_y]==0)
{
box[step_x][step_y]=flag ;
if(judgeresult(step_x,step_y)==1)
{
sound(1000);
delay(1000);
nosound();
gotoxy(30,4);
if(flag==1)
{
setbkcolor(BLUE);
cleardevice();
setviewport(100,100,540,380,1);
/*定義一個圖形窗口*/
setfillstyle(1,2);
/*綠色以實填充*/
setcolor(YELLOW);
rectangle(0,0,439,279);
floodfill(50,50,14);
setcolor(12);
settextstyle(1,0,5);
/*三重筆劃字體, 水平放?5倍*/
outtextxy(20,20,"The White Win !");
setcolor(15);
settextstyle(3,0,5);
/*無襯筆劃字體, 水平放大5倍*/
outtextxy(120,120,"The White Win !");
setcolor(14);
settextstyle(2,0,8);
getch();
closegraph();
exit(0);
}
if(flag==2)
{
setbkcolor(BLUE);
cleardevice();
setviewport(100,100,540,380,1);
/*定義一個圖形窗口*/
setfillstyle(1,2);
/*綠色以實填充*/
setcolor(YELLOW);
rectangle(0,0,439,279);
floodfill(50,50,14);
setcolor(12);
settextstyle(1,0,8);
/*三重筆劃字體, 水平放大8倍*/
outtextxy(20,20,"The Red Win !");
setcolor(15);
settextstyle(3,0,5);
/*無襯筆劃字體, 水平放大5倍*/
outtextxy(120,120,"The Red Win !");
setcolor(14);
settextstyle(2,0,8);
getch();
closegraph();
exit(0);
}
}
change();
break ;
}
}
else
break ;
}
}

void change()
{
if(flag==1)
flag=2 ;
else
flag=1 ;
}

void judgewho(int x,int y)
{
if(flag==1)
draw_circle(x,y,15);
if(flag==2)
draw_circle(x,y,4);
}

int judgeresult(int x,int y)
{
int j,k,n1,n2 ;
while(1)
{
n1=0 ;
n2=0 ;
/*水平向左數*/
for(j=x,k=y;j>=1;j--)
{
if(box[j][k]==flag)
n1++;
else
break ;
}
/*水平向右數*/
for(j=x,k=y;j<=18;j++)
{
if(box[j][k]==flag)
n2++;
else
break ;
}
if(n1+n2-1>=5)
{
return(1);
break ;
}

/*垂直向上數*/
n1=0 ;
n2=0 ;
for(j=x,k=y;k>=1;k--)
{
if(box[j][k]==flag)
n1++;
else
break ;
}
/*垂直向下數*/
for(j=x,k=y;k<=18;k++)
{
if(box[j][k]==flag)
n2++;
else
break ;
}
if(n1+n2-1>=5)
{
return(1);
break ;
}

/*向左上方數*/
n1=0 ;
n2=0 ;
for(j=x,k=y;j>=1,k>=1;j--,k--)
{
if(box[j][k]==flag)
n1++;
else
break ;
}
/*向右下方數*/
for(j=x,k=y;j<=18,k<=18;j++,k++)
{
if(box[j][k]==flag)
n2++;
else
break ;
}
if(n1+n2-1>=5)
{
return(1);
break ;
}

/*向右上方數*/
n1=0 ;
n2=0 ;
for(j=x,k=y;j<=18,k>=1;j++,k--)
{
if(box[j][k]==flag)
n1++;
else
break ;
}
/*向左下方數*/
for(j=x,k=y;j>=1,k<=18;j--,k++)
{
if(box[j][k]==flag)
n2++;
else
break ;
}
if(n1+n2-1>=5)
{
return(1);
break ;
}
return(0);
break ;
}
}

void main()
{
int gdriver=VGA,gmode=VGAHI;
clrscr();
attention();
initgraph(&gdriver,&gmode,"c:\\tc");
/* setwritemode(XOR_PUT);*/
flag=1 ;
draw_box();
do
{
step_x=0 ;
step_y=0 ;
/*draw_circle(step_x,step_y,8); */
judgewho(step_x-1,step_y-1);
do
{
while(bioskey(1)==0);
key=bioskey(0);
judgekey();
}
while(key!=SPACE&&key!=ESC);
}
while(key!=ESC);
closegraph();
}



② 高分求一個「黑白棋」的匯編源碼

//我這有個源代碼,不過是VC++的。你對照API就可以修改的。
//Microsoft Developer Studio generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// Chinese (P.R.C.) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h\0"
END

2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END

3 TEXTINCLUDE DISCARDABLE
BEGIN
"#define _AFX_NO_SPLITTER_RESOURCES\r\n"
"#define _AFX_NO_OLE_RESOURCES\r\n"
"#define _AFX_NO_TRACKER_RESOURCES\r\n"
"#define _AFX_NO_PROPERTY_RESOURCES\r\n"
"\r\n"
"#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)\r\n"
"#ifdef _WIN32\r\n"
"LANGUAGE 4, 2\r\n"
"#pragma code_page(936)\r\n"
"#endif //_WIN32\r\n"
"#include ""res\\bw.rc2"" // non-Microsoft Visual C++ edited resources\r\n"
"#include ""l.chs\\afxres.rc"" // Standard components\r\n"
"#include ""l.chs\\afxprint.rc"" // printing/print preview resources\r\n"
"#endif\r\n"
"\0"
END

#endif // APSTUDIO_INVOKED

/////////////////////////////////////////////////////////////////////////////
//
// Icon
//

// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDR_MAINFRAME ICON DISCARDABLE "res\\bw.ico"
IDR_BWTYPE ICON DISCARDABLE "res\\bwDoc.ico"

/////////////////////////////////////////////////////////////////////////////
//
// Bitmap
//

IDR_MAINFRAME BITMAP MOVEABLE PURE "res\\Toolbar.bmp"
IDB_BOARD BITMAP DISCARDABLE "res\\board1.bmp"
IDB_EMPTY BITMAP DISCARDABLE "res\\empty.bmp"
IDB_WHITE BITMAP DISCARDABLE "res\\white.bmp"
IDB_BLACK BITMAP DISCARDABLE "res\\black.bmp"
IDB_LAST BITMAP DISCARDABLE "res\\bitmap1.bmp"

/////////////////////////////////////////////////////////////////////////////
//
// Toolbar
//

IDR_MAINFRAME TOOLBAR DISCARDABLE 16, 16
BEGIN
BUTTON ID_BLACK
BUTTON ID_WHITE
BUTTON ID_REG
SEPARATOR
BUTTON ID_ONE
BUTTON ID_TWO
BUTTON ID_THREE
SEPARATOR
BUTTON ID_APP_ABOUT
END

/////////////////////////////////////////////////////////////////////////////
//
// Menu
//

IDR_MAINFRAME MENU PRELOAD DISCARDABLE
BEGIN
POPUP "棋局(&F)"
BEGIN
MENUITEM "執黑先手(&B)\tCtrl+B", ID_BLACK
MENUITEM "執白後手(&W)\tCtrl+W", ID_WHITE
MENUITEM "悔棋(&S)\tCtrl+S", ID_REG
MENUITEM SEPARATOR
MENUITEM "退出(&X)", ID_APP_EXIT
END
POPUP "選項(&O)"
BEGIN
MENUITEM "低難度", ID_ONE
MENUITEM "中難度", ID_TWO
MENUITEM "高難度", ID_THREE
END
POPUP "查看(&V)"
BEGIN
MENUITEM "工具欄(&T)", ID_VIEW_TOOLBAR
MENUITEM "狀態欄(&S)", ID_VIEW_STATUS_BAR
END
POPUP "幫助(&H)"
BEGIN
MENUITEM "關於 黑白棋(&A)...", ID_APP_ABOUT
END
END

/////////////////////////////////////////////////////////////////////////////
//
// Accelerator
//

IDR_MAINFRAME ACCELERATORS PRELOAD MOVEABLE PURE
BEGIN
"N", ID_FILE_NEW, VIRTKEY, CONTROL
"O", ID_FILE_OPEN, VIRTKEY, CONTROL
"S", ID_FILE_SAVE, VIRTKEY, CONTROL
"P", ID_FILE_PRINT, VIRTKEY, CONTROL
"Z", ID_EDIT_UNDO, VIRTKEY, CONTROL
"X", ID_EDIT_CUT, VIRTKEY, CONTROL
"C", ID_EDIT_COPY, VIRTKEY, CONTROL
"V", ID_EDIT_PASTE, VIRTKEY, CONTROL
VK_BACK, ID_EDIT_UNDO, VIRTKEY, ALT
VK_DELETE, ID_EDIT_CUT, VIRTKEY, SHIFT
VK_INSERT, ID_EDIT_COPY, VIRTKEY, CONTROL
VK_INSERT, ID_EDIT_PASTE, VIRTKEY, SHIFT
VK_F6, ID_NEXT_PANE, VIRTKEY
VK_F6, ID_PREV_PANE, VIRTKEY, SHIFT
END

/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_ABOUTBOX DIALOG DISCARDABLE 0, 0, 223, 49
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "關於 黑白棋"
FONT 9, "宋體"
BEGIN
ICON IDR_MAINFRAME,IDC_STATIC,11,17,21,21
LTEXT "黑白棋 ",IDC_STATIC,38,14,119,8,SS_NOPREFIX
LTEXT "版權所有 (C) 2002",IDC_STATIC,40,28,119,8
DEFPUSHBUTTON "確定",IDOK,166,7,50,14,WS_GROUP
END

#ifndef _MAC
/////////////////////////////////////////////////////////////////////////////
//
// Version
//

VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "080404b0"
BEGIN
VALUE "Comments", "\0"
VALUE "CompanyName", "\0"
VALUE "FileDescription", "bw Microsoft 基礎類應用程序\0"
VALUE "FileVersion", "1, 0, 0, 1\0"
VALUE "InternalName", "bw\0"
VALUE "LegalCopyright", "版權所有 (C) 2001\0"
VALUE "LegalTrademarks", "\0"
VALUE "OriginalFilename", "bw.EXE\0"
VALUE "PrivateBuild", "\0"
VALUE "ProctName", "bw 應用程序\0"
VALUE "ProctVersion", "1, 0, 0, 1\0"
VALUE "SpecialBuild", "\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x804, 1200
END
END

#endif // !_MAC

/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE
BEGIN
IDD_ABOUTBOX, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 216
TOPMARGIN, 7
BOTTOMMARGIN, 42
END
END
#endif // APSTUDIO_INVOKED

/////////////////////////////////////////////////////////////////////////////
//
// String Table
//

STRINGTABLE PRELOAD DISCARDABLE
BEGIN
IDR_MAINFRAME "黑白棋程序\n\nBw\n\n\nBw.Document\nBw Document"
END

STRINGTABLE PRELOAD DISCARDABLE
BEGIN
AFX_IDS_APP_TITLE " "
AFX_IDS_IDLEMESSAGE "就緒"
END

STRINGTABLE DISCARDABLE
BEGIN
ID_INDICATOR_EXT "擴展名"
ID_INDICATOR_CAPS "大寫"
ID_INDICATOR_NUM "數字"
ID_INDICATOR_SCRL "滾動"
ID_INDICATOR_OVR "改寫"
ID_INDICATOR_REC "記錄"
END

STRINGTABLE DISCARDABLE
BEGIN
ID_FILE_NEW " "
ID_FILE_OPEN " "
ID_FILE_CLOSE " "
ID_FILE_SAVE_AS " "
ID_FILE_PAGE_SETUP "改變列印選項\n頁面設置"
ID_FILE_PRINT_SETUP "改變列印機及列印選項\n列印設置"
ID_FILE_PRINT "列印活動文檔\n列印"
ID_FILE_PRINT_PREVIEW "顯示整頁\n列印預覽"
END

STRINGTABLE DISCARDABLE
BEGIN
ID_APP_ABOUT "顯示程序信息,版本號和版權\n關於"
ID_APP_EXIT "退出應用程序;提示保存文檔\n退出"
END

STRINGTABLE DISCARDABLE
BEGIN
ID_FILE_MRU_FILE1 "打開該文檔"
ID_FILE_MRU_FILE2 "打開該文檔"
ID_FILE_MRU_FILE3 "打開該文檔"
ID_FILE_MRU_FILE4 "打開該文檔"
ID_FILE_MRU_FILE5 "打開該文檔"
ID_FILE_MRU_FILE6 "打開該文檔"
ID_FILE_MRU_FILE7 "打開該文檔"
ID_FILE_MRU_FILE8 "打開該文檔"
ID_FILE_MRU_FILE9 "打開該文檔"
ID_FILE_MRU_FILE10 "打開該文檔"
ID_FILE_MRU_FILE11 "打開該文檔"
ID_FILE_MRU_FILE12 "打開該文檔"
ID_FILE_MRU_FILE13 "打開該文檔"
ID_FILE_MRU_FILE14 "打開該文檔"
ID_FILE_MRU_FILE15 "打開該文檔"
ID_FILE_MRU_FILE16 "打開該文檔"
END

STRINGTABLE DISCARDABLE
BEGIN
ID_NEXT_PANE "切換到下一個窗格\n下一窗格"
ID_PREV_PANE "切換回前一個窗格\n前一窗格"
END

STRINGTABLE DISCARDABLE
BEGIN
ID_WINDOW_SPLIT "將活動的窗口分隔成窗格\n分隔"
END

STRINGTABLE DISCARDABLE
BEGIN
ID_EDIT_CLEAR "刪除被選對象\n刪除"
ID_EDIT_CLEAR_ALL "全部刪除\n全部刪除"
ID_EDIT_COPY " "
ID_EDIT_CUT " "
ID_EDIT_FIND "查找指定的正文\n查找"
ID_EDIT_PASTE " "
ID_EDIT_REPEAT "重復上一步操作\n重復"
ID_EDIT_REPLACE "用不同的正文替換指定的正文\n替換"
ID_EDIT_SELECT_ALL "選擇整個文檔\n選擇全部"
ID_EDIT_UNDO "撤消最後一步操作\n撤消"
ID_EDIT_REDO "重新執行先前已撤消的操作\n重新執行"
END

STRINGTABLE DISCARDABLE
BEGIN
ID_VIEW_TOOLBAR "顯示或隱藏工具欄\n顯隱工具欄"
ID_VIEW_STATUS_BAR "顯示或隱藏狀態欄\n顯隱狀態欄"
END

STRINGTABLE DISCARDABLE
BEGIN
AFX_IDS_SCSIZE "改變窗口大小"
AFX_IDS_SCMOVE "改變窗口位置"
AFX_IDS_SCMINIMIZE "將窗口縮小成圖標"
AFX_IDS_SCMAXIMIZE "把窗口放大到最大尺寸"
AFX_IDS_SCNEXTWINDOW "切換到下一個文檔窗口"
AFX_IDS_SCPREVWINDOW "切換到先前的文檔窗口"
AFX_IDS_SCCLOSE "關閉活動的窗口並提示保存所有文檔"
END

STRINGTABLE DISCARDABLE
BEGIN
AFX_IDS_SCRESTORE "把窗口恢復到正常大小"
AFX_IDS_SCTASKLIST "激活任務表"
END

STRINGTABLE DISCARDABLE
BEGIN
AFX_IDS_PREVIEW_CLOSE "關閉列印預覽模式\n取消預閱"
END

STRINGTABLE DISCARDABLE
BEGIN
ID_WHITE "執白後手"
ID_BLACK "執黑先手"
ID_REG "悔棋"
ID_ONE "低難度"
ID_THREE "高難度"
ID_TWO "中難度"
END

#endif // Chinese (P.R.C.) resources
/////////////////////////////////////////////////////////////////////////////

#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE 4, 2
#pragma code_page(936)
#endif //_WIN32
#include "res\bw.rc2" // non-Microsoft Visual C++ edited resources
#include "l.chs\afxres.rc" // Standard components
#include "l.chs\afxprint.rc" // printing/print preview resources
#endif

/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

③ 拿過一套java的源碼怎麼在本地電腦運行起來能詳細的說一下嗎一步一步,菜鳥

你可以根據java的源碼,配置環境,源碼要求不同,環境不同,有些配置參數沒有配置,不一定能運行起來,你可以先用編輯工具看看,當然你自己代碼能力得可以,有其他不會的或者要具體給你看的話也可以直接找額代解決,謝謝

c語言編的五子棋源代碼

//自定義控制項,然後在工具箱拖過來用再把BackColor設置為Transparent
:ListBox
{
publicTransparentListBox()
{
this.SetStyle(ControlStyles.UserPaint,true);
this.SetStyle(ControlStyles.SupportsTransparentBackColor,true);
}
(EventArgse)
{
this.Invalidate();
base.OnSelectedIndexChanged(e);
}
protectedoverridevoidOnPaint(PaintEventArgse)
{
if(this.Focused&&this.SelectedItem!=null)
{
RectangleitemRect=this.GetItemRectangle(this.SelectedIndex);
e.Graphics.FillRectangle(Brushes.Green,itemRect);
}
for(inti=0;i<Items.Count;i++)
{
e.Graphics.DrawString(this.GetItemText(Items[i]),this.Font,newSolidBrush(this.ForeColor),this.GetItemRectangle(i));
}
base.OnPaint(e);
}
}

⑤ 五子棋先手必勝演算法大神們幫幫忙

#include <stdio.h> #include <conio.h> void maps(int*); int valid(int a[10][10],int,int); int win(int a[10][10],int,int,int); void main() { int a[10][10],i,j,s1,*a1,k; a1=&a[0][0]; for (i=0;i<10;i++) for (j=0;j<10;j++) a[i][j]=0; k=1; maps (a1); for (s1=0;s1<100;s1++) { k=-k; printf ("\nplayer %d input your line and row",k); scanf ("%d%d",&j,&i); if (valid(a,i,j)==1) { s1=s1-1; printf ("\ninvalid place!!"); k=-k; continue; } else a[i][j]=k; maps (a1); if (win (a,i,j,k)==1) { printf ("\nplayer %d win!",k); break; } } getch(); } void maps(int *a1) { int x,y; printf (" 0 1 2 3 4 5 6 7 8 9 \n"); for (x=0;x<10;x++) { printf ("%d",x); for (y=0;y<10;y++) { if (*(a1 +10*x+y)==1) { printf(" * "); continue; } if (*(a1 +10*x+y)==-1) printf(" @ "); else printf(" . "); } printf("\n"); } } int valid(int a[10][10],int i,int j) { if (i>9) return 1; if (j>9) return 1; if (a[i][j]==0) return 0; return 1; } int win(int a[10][10],int i,int j,int k) { int x,y; //for (y=j;y<j+5||y<10;y++) for (y=j;y<j+5&&y<10;y++) { if (a[i][y]!=k) break; //return 1; } if( y>=j+5 ) return 1; //for (x=i;x<i+5||x<10;x++) for (x=i;x<i+5&&x<10;x++) { if (a[x][j]!=k) break; //return 1; } if( x>=i+5 ) return 1; int count = 0; //for (x=i,y=j;x<i+5||x<10||y<10;x++,y++) for (x=i,y=j;x<i+5&&x<10&&y<10;x++,y++) { if (a[x][y]!=k) break; count++; } if( count>=5 ) return 1; for (x=i-1,y=j-1;x>i-5&&x>=0&&y>=0;x--,y--) { if (a[x][y]!=k) break; count++; } if( count>=5 ) return 1; count = 0; //for (x=i,y=j;x<i+5||x<10||y>-1;x++,y--) for (x=i,y=j;x<i+5&&x<10&&y>=0;x++,y--) { if (a[x][y]!=k) break; count++; } if( count>=5 ) return 1; for (x=i-1,y=j+1;x<i+5&&x>=0&&y<10;x--,y++) { if (a[x][y]!=k) break; count++; } if( count>=5 ) return 1; return 0; }

⑥ 急求vb雙人對戰五子棋源代碼

Option Explicit

'五子棋程序 人機對戰版本
'需要2個Label控制項 2個CommandButton控制項

Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long

'Dim PlayStep() As String '記錄棋譜的數組
'Dim Label2Cap As String
Private Const BoxL As Single = 50, BoxT As Single = 50, BoxW As Single = 25, BoxN As Integer = 18

Dim Table() As Long '棋盤(0-BoxN,0-BoxN) 0-空 1-黑子 2-白子
Dim PsCore() As Long '定義當前玩家桌面空格的分數
Dim CsCore() As Long '定義當前電腦桌面空格的分數
Dim pWin() As Boolean '定義玩家的獲勝組合
Dim cWin() As Boolean '定義電腦的獲勝組合
Dim pFlag() As Boolean '定義玩家的獲勝組合標志
Dim cFlag() As Boolean '定義電腦的獲勝組合標志
Dim ThePlayFlag As Boolean '定義游戲有效標志

Private Sub Command1_Click()
If Not ThePlayFlag Then Call InitPlayEnvironment: Exit Sub
If MsgBox("本局還沒有下完,是否重新開始?(Y/N)", vbYesNo) = vbNo Then Exit Sub
Call InitPlayEnvironment
End Sub

Private Sub Command2_Click()
End
End Sub

Private Sub Form_Load()
Dim i As Long, lw As Long, lh As Long
'Label2Cap = "000 黑方 行 00 列 00"
Me.Width = 10815: Me.Height = 8040
' Me.Caption = "五子棋 - 人機對戰": Me.Show
lw = Me.Width \ Screen.TwipsPerPixelX: lh = Me.Height \ Screen.TwipsPerPixelY
SetWindowRgn Me.hWnd, CreateRoundRectRgn(0, 0, lw, lh, 60, 60), True
With Label1
.Alignment = vbCenter: .FontSize = 12: .FontBold = True
.ForeColor = vbRed: .BackStyle = 0: .AutoSize = True: .Move 8910, 510
End With
Label2.AutoSize = True: Label2.WordWrap = True
Label2.BackStyle = 0: Label2.Move 8040, 1050, 2280
Command1.Move 8025, 7035, 1020, 435: Command1.Caption = "再來一局"
Command2.Move 9300, 7035, 1020, 435: Command2.Caption = "不玩了"
Call DrawChessBoard: Me.FillStyle = 0: Call InitPlayEnvironment
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
End
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim iRow As Long, iCol As Long, i As Long, k As Long, t As String
If Not ThePlayFlag Then Exit Sub
If Button = vbLeftButton Then '左鍵下棋
iRow = -1: iCol = -1
For i = 0 To BoxN '滑鼠必須落在交叉點 半徑10以內 若是則給出行列號
If (Y + 10) > (BoxT + i * BoxW) And (Y - 10) <= (BoxT + i * BoxW) Then iRow = i
If (X + 10) > (BoxL + i * BoxW) And (X - 10) <= (BoxL + i * BoxW) Then iCol = i
Next
If (iRow = -1) Or (iCol = -1) Then Beep: Exit Sub
If Table(iCol, iRow) > 0 Then Exit Sub
Table(iCol, iRow) = 2: Label1.Caption = "下一步 黑方"
Me.FillColor = vbWhite: Me.Circle (iCol * BoxW + BoxT, iRow * BoxW + BoxL), 8
For i = 0 To UBound(cWin, 3)
If cWin(iCol, iRow, i) = True Then cFlag(i) = False
Next
Call CheckWin: Call DianNao '檢查當前玩家是否獲勝 調用電腦演算法
End If
End Sub

Public Sub InitPlayEnvironment()
'*****************************************************************************
' 模塊名稱: InitPlayEnvironment [初始化過程]
'
' 描述: 1. 設置背景音樂。 2. 設置游戲狀態有效。
' 3. 初始化游戲狀態標簽。 4. 直接指定電腦的第一步走法。
' 5. 初始化基本得分桌面。 6. 電腦和玩家獲勝標志初始化。
' 7. 初始化所有獲勝組合。 8. 重新設定玩家的獲勝標志。
'*****************************************************************************
Dim i As Long, j As Long, m As Long, n As Long

ThePlayFlag = True: Label1.Caption = "下一步 白方": Label2.Caption = ""
Me.FillColor = vbBlack: Me.FillStyle = 0: Me.AutoRedraw = True
Me.Cls: Me.Circle (9 * BoxW + BoxL, 9 * BoxW + BoxT), 8
ReDim Table(0 To BoxN, 0 To BoxN) As Long
ReDim pFlag(NumsWin(BoxN + 1) - 1) As Boolean
ReDim cFlag(UBound(pFlag)) As Boolean
ReDim PsCore(BoxN, BoxN) As Long, CsCore(BoxN, BoxN) As Long
ReDim pWin(BoxN, BoxN, UBound(pFlag)) As Boolean
ReDim cWin(BoxN, BoxN, UBound(pFlag)) As Boolean

For i = 0 To UBound(pFlag): pFlag(i) = True: cFlag(i) = True: Next
Table(9, 9) = 1 '假定電腦先手 並下了(9, 9)位 將其值設為1
'******** 初始化獲勝組合 ****************************************
For i = 0 To BoxN: For j = 0 To BoxN - 4
For m = 0 To 4
pWin(j + m, i, n) = True: cWin(j + m, i, n) = True
Next
n = n + 1
Next: Next
For i = 0 To BoxN: For j = 0 To BoxN - 4
For m = 0 To 4
pWin(i, j + m, n) = True: cWin(i, j + m, n) = True
Next
n = n + 1
Next: Next
For i = 0 To BoxN - 4: For j = 0 To BoxN - 4
For m = 0 To 4
pWin(j + m, i + m, n) = True: cWin(j + m, i + m, n) = True
Next
n = n + 1
Next: Next
For i = 0 To BoxN - 4: For j = BoxN To 4 Step -1
For m = 0 To 4
pWin(j - m, i + m, n) = True: cWin(j - m, i + m, n) = True
Next
n = n + 1
Next: Next
'******** 初始化獲勝組合結束 *************************************
For i = 0 To UBound(pWin, 3) '由於電腦已下了(9, 9)位 所以需要重新設定玩家的獲勝標志
If pWin(9, 9, i) = True Then pFlag(i) = False
Next
End Sub

Public Function DrawChessBoard() As Long
'容器的(BoxL, BoxT)為左上角坐標畫一個 BoxN*BoxN, 每格邊長為 BoxW 象素的棋盤
Dim i As Long, j As Long, cx As Long, cy As Long
Me.ScaleMode = 3: Me.FillStyle = 1: Me.AutoRedraw = True: Me.Cls
For i = 0 To BoxN '畫棋盤
Me.Line (BoxL + i * BoxW, BoxT)-(BoxL + i * BoxW, BoxT + BoxN * BoxW)
Me.Line (BoxL, BoxT + i * BoxW)-(BoxL + BoxN * BoxW, BoxT + i * BoxW)
Me.CurrentX = BoxL + i * BoxW - IIf(i > 9, 6, 2)
Me.CurrentY = BoxT - 20: Me.Print Format(i)
Me.CurrentX = BoxL - IIf(i > 9, 23, 20)
Me.CurrentY = BoxT + i * BoxW - 6: Me.Print Format(i)
Next
For i = 3 To 16 Step 6: For j = 3 To 16 Step 6 '畫小標志
cx = BoxL + j * BoxW - 3: cy = BoxT + i * BoxW - 3
Me.Line (cx, cy)-(cx + 6, cy + 6), , B
Next: Next
Me.AutoRedraw = False: Set Me.Picture = Me.Image
End Function

Public Sub CheckWin()
'*****************************************************************************
' 模塊名稱: CheckWin [獲勝檢查演算法]
'
' 描述: 1. 檢查是否和棋。 2. 檢查電腦是否獲勝。 3. 檢查玩家是否獲勝。
'*****************************************************************************
Dim i As Long, j As Long, k As Long, m As Long, n As Long
Dim cA As Long, pA As Long, cN As Long

For i = 0 To UBound(cFlag): cN = IIf(cFlag(i) = False, cN + 1, cN): Next

If cN = UBound(cFlag) - 1 Then '設定和棋規則
Label1.Caption = "雙方和棋!": ThePlayFlag = False: Exit Sub
End If
For i = 0 To UBound(cFlag) '檢查電腦是否獲勝
If cFlag(i) = True Then
cA = 0: For j = 0 To BoxN: For k = 0 To BoxN
If Table(j, k) = 1 And cWin(j, k, i) = True Then cA = cA + 1
Next: Next
If cA = 5 Then Label1.Caption = "電腦獲勝!": ThePlayFlag = False: Exit Sub
End If
Next
For i = 0 To UBound(pFlag) '檢查玩家是否獲勝
If pFlag(i) = True Then
pA = 0: For j = 0 To BoxN: For k = 0 To BoxN
If Table(j, k) = 2 And pWin(j, k, i) = True Then pA = pA + 1
Next: Next
If pA = 5 Then Label1.Caption = "玩家獲勝!": ThePlayFlag = False: Exit Sub
End If
Next
End Sub

Public Sub DianNao()
'*****************************************************************************
' 模塊名稱: DianNao [電腦演算法]

' 描述: 1. 初始化賦值系統。 2. 賦值加強演算法。 3. 計算電腦和玩家的最佳攻擊位。
' 4. 比較電腦和玩家的最佳攻擊位並決定電腦的最佳策略。 5. 執行檢查獲勝函數。
'*****************************************************************************
Dim i As Long, j As Long, k As Long, m As Long, n As Long
Dim Dc As Long, cAb As Long, pAb As Long

ReDim PsCore(BoxN, BoxN) As Long, CsCore(BoxN, BoxN) As Long '初始化賦值數組

'******** 電腦加強演算法 ********
For i = 0 To UBound(cFlag)
If cFlag(i) = True Then
cAb = 0
For j = 0 To BoxN: For k = 0 To BoxN
If Table(j, k) = 1 And cWin(j, k, i) = True Then cAb = cAb + 1
Next: Next
Select Case cAb
Case 3
For m = 0 To BoxN: For n = 0 To BoxN
If Table(m, n) = 0 And cWin(m, n, i) = True Then CsCore(m, n) = CsCore(m, n) + 5
Next: Next
Case 4
For m = 0 To BoxN: For n = 0 To BoxN
If Table(m, n) = 0 And cWin(m, n, i) = True Then
Table(m, n) = 1: Label1.Caption = "下一步 白方"
Me.FillColor = vbBlack: Me.Circle (m * BoxW + BoxL, n * BoxW + BoxT), 8
For Dc = 0 To UBound(pWin, 3)
If pWin(m, n, Dc) = True Then pFlag(Dc) = False: Call CheckWin: Exit Sub
Next
End If
Next: Next
End Select
End If
Next

For i = 0 To UBound(pFlag)
If pFlag(i) = True Then
pAb = 0
For j = 0 To BoxN: For k = 0 To BoxN
If Table(j, k) = 2 And pWin(j, k, i) = True Then pAb = pAb + 1
Next: Next
Select Case pAb
Case 3
For m = 0 To BoxN: For n = 0 To BoxN
If Table(m, n) = 0 And pWin(m, n, i) = True Then PsCore(m, n) = PsCore(m, n) + 30
Next: Next
Case 4
For m = 0 To BoxN: For n = 0 To BoxN
If Table(m, n) = 0 And pWin(m, n, i) = True Then
Table(m, n) = 1: Label1.Caption = "下一步 白方"
Me.FillColor = vbBlack: Me.Circle (m * BoxW + BoxL, n * BoxW + BoxT), 8
For Dc = 0 To UBound(pWin, 3)
If pWin(m, n, Dc) = True Then pFlag(Dc) = False: Call CheckWin: Exit Sub
Next
End If
Next: Next
End Select
End If
Next
'******** 電腦加強演算法結束 ********

'******** 賦值系統 ****************
For i = 0 To UBound(cFlag)
If cFlag(i) = True Then
For j = 0 To BoxN: For k = 0 To BoxN
If (Table(j, k) = 0) And cWin(j, k, i) Then
For m = 0 To BoxN: For n = 0 To BoxN
If (Table(m, n) = 1) And cWin(m, n, i) Then CsCore(j, k) = CsCore(j, k) + 1
Next: Next
End If
Next: Next
End If
Next

For i = 0 To UBound(pFlag)
If pFlag(i) = True Then
For j = 0 To BoxN: For k = 0 To BoxN
If (Table(j, k) = 0) And pWin(j, k, i) Then
For m = 0 To BoxN: For n = 0 To BoxN
If (Table(m, n) = 2) And pWin(m, n, i) Then PsCore(j, k) = PsCore(j, k) + 1
Next: Next
End If
Next: Next
End If
Next
'******** 賦值系統結束 ************

'******** 分值比較演算法 ************
Dim a As Long, b As Long, c As Long, d As Long
Dim cS As Long, pS As Long

For i = 0 To BoxN: For j = 0 To BoxN
If CsCore(i, j) > cS Then cS = CsCore(i, j): a = i: b = j
Next: Next
For i = 0 To BoxN: For j = 0 To BoxN
If PsCore(i, j) > pS Then pS = PsCore(i, j): c = i: d = j
Next: Next

If cS > pS Then
Table(a, b) = 1: Label1.Caption = "下一步 白方"
Me.FillColor = vbBlack: Me.Circle (a * BoxW + BoxL, b * BoxW + BoxT), 8
For i = 0 To UBound(pWin, 3)
If pWin(a, b, i) = True Then pFlag(i) = False
Next
Else
Table(c, d) = 1: Label1.Caption = "下一步 白方"
Me.FillColor = vbBlack: Me.Circle (c * BoxW + BoxL, d * BoxW + BoxL), 8
For i = 0 To UBound(pWin, 3)
If pWin(c, d, i) = True Then pFlag(i) = False
Next
End If
'******** 分值比較演算法結束 ********

Call CheckWin

End Sub

Public Function NumsWin(ByVal n As Long) As Long
'根據輸入的棋盤布局 n*n 計算總共有多少種獲勝組合
'假定棋盤為 10 * 10 相應的棋盤數組就是 Table(9, 9)
'水平方向 每一列獲勝組合是6 共10列 6*10=60
'垂直方向 每一行獲勝組合是6 共10行 8*10=60
'正對角線方向 6 + (5 + 4 + 3 + 2 + 1) * 2 = 36
'反對角線方向 6 + (5 + 4 + 3 + 2 + 1) * 2 = 36
'總的獲勝組合數為 60 + 60 + 36 + 36 = 192
Dim i As Long, t As Long
For i = n - 5 To 1 Step -1: t = t + i: Next
NumsWin = 2 * (2 * t + n - 4) + 2 * n * (n - 4)
End Function

⑦ 象棋對弈軟體是如何編制出來的

呵呵,開始我也覺得沒有破綻,後來發現了軟體也會出昏招。原來原理很簡單,只是把基本的開局定式以及常見的對弈拆解局面轉換成資料庫函數,當出現資料庫招數,便調出同類型的宏功能。說到底,只是電腦軟體做到了更多的對弈棋局收集,把相關的招數進行了數碼匯編。比如:仙人指路開局,軟體就會自動把存儲在資料庫中的符合這一定式類型的所有函數自動調出,選擇基本應招(根據用戶選手游戲難度不同,軟體也會選擇相應招數致勝比率和復雜程度)。所以按一般局面和軟體玩,就等於和一個熟讀兵法的謀士作戰,很難贏。你會有看不透,想不到的時候,軟體按步就班,資料庫就是它的眼睛和腦袋。但是編制軟體的並不是一流大師,他們手頭上有的都是找得到的棋局,但是棋盤千變萬化,有很多招式不可能存在軟體中,所以軟體也會碰到出昏招的時候。我們可以做一個小實驗,兩台電腦玩相同的象棋游戲,如果以A電腦進行先手,B電腦進行後手,以B電腦的招式來和A電腦下。百分之九十九的機率是和棋。如果我們用自己的方式操作B電腦和A電腦進行至中局(有一方有多子優勢),然後再讓兩台電腦自己下,肯定有一台電腦是輸的。你就會發現輸的電腦下的棋局很一般,因為它還是在以應對的形式開展,試問沒有優勢的情況下,那台資料庫一樣的電腦軟體會出現奇招嘛?也就是說軟體也是會輸的。我記得國際象棋那個深藍也輸給過卡斯帕羅夫,然後那個更深的藍贏了卡斯帕羅夫。還是贏在數據採集啊。

⑧ 求極簡單五子棋c\c++源碼

你運氣好我有收藏的、、
#include <stdio.h>
#include"bios.h"
#include <ctype.h>
#include <conio.h>
#include <dos.h>
#define CROSSRU 0xbf /*右上角點*/
#define CROSSLU 0xda /*左上角點*/
#define CROSSLD 0xc0 /*左下角點*/
#define CROSSRD 0xd9 /*右下角點*/
#define CROSSL 0xc3 /*左邊*/
#define CROSSR 0xb4 /*右邊*/
#define CROSSU 0xc2 /*上邊*/
#define CROSSD 0xc1 /*下邊*/
#define CROSS 0xc5 /*十字交叉點*/

/*定義棋盤左上角點在屏幕上的位置*/
#define MAPXOFT 5
#define MAPYOFT 2

/*定義1號玩家的操作鍵鍵碼*/
#define PLAY1UP 0x1157/*上移--'W'*/
#define PLAY1DOWN 0x1f53/*下移--'S'*/
#define PLAY1LEFT 0x1e41/*左移--'A'*/
#define PLAY1RIGHT 0x2044/*右移--'D'*/
#define PLAY1DO 0x3920/*落子--空格鍵*/

/*定義2號玩家的操作鍵鍵碼*/
#define PLAY2UP 0x4800/*上移--方向鍵up*/
#define PLAY2DOWN 0x5000/*下移--方向鍵down*/
#define PLAY2LEFT 0x4b00/*左移--方向鍵left*/
#define PLAY2RIGHT 0x4d00/*右移--方向鍵right*/
#define PLAY2DO 0x1c0d/*落子--回車鍵Enter*/

/*若想在游戲中途退出, 可按 Esc 鍵*/
#define ESCAPE 0x011b

/*定義棋盤上交叉點的狀態, 即該點有無棋子 */
/*若有棋子, 還應能指出是哪個玩家的棋子 */
#define CHESSNULL 0 /*沒有棋子*/
#define CHESS1 'O'/*一號玩家的棋子*/
#define CHESS2 'X'/*二號玩家的棋子*/

/*定義按鍵類別*/
#define KEYEXIT 0/*退出鍵*/
#define KEYFALLCHESS 1/*落子鍵*/
#define KEYMOVECURSOR 2/*游標移動鍵*/
#define KEYINVALID 3/*無效鍵*/

/*定義符號常量: 真, 假 --- 真為1, 假為0 */
#define TRUE 1
#define FALSE 0

/**********************************************************/
/* 定義數據結構 */

/*棋盤交叉點坐標的數據結構*/
struct point
{
int x,y;
};

/**********************************************************/
/*自定義函數原型說明 */
void Init(void);
int GetKey(void);
int CheckKey(int press);
int ChangeOrder(void);
int ChessGo(int Order,struct point Cursor);
void DoError(void);
void DoOK(void);
void DoWin(int Order);
void MoveCursor(int Order,int press);
void DrawCross(int x,int y);
void DrawMap(void);
int JudgeWin(int Order,struct point Cursor);
int JudgeWinLine(int Order,struct point Cursor,int direction);
void ShowOrderMsg(int Order);
void EndGame(void);
/**********************************************************/

/**********************************************************/
/* 定義全局變數 */
int gPlayOrder; /*指示當前行棋方 */
struct point gCursor; /*游標在棋盤上的位置 */
char gChessBoard[19][19];/*用於記錄棋盤上各點的狀態*/
/**********************************************************/

/**********************************************************/
/*主函數*/
void main()
{
int press;
int bOutWhile=FALSE;/*退出循環標志*/

Init();/*初始化圖象,數據*/

while(1)
{
press=GetKey();/*獲取用戶的按鍵值*/
switch(CheckKey(press))/*判斷按鍵類別*/
{
/*是退出鍵*/
case KEYEXIT:
clrscr();/*清屏*/
bOutWhile = TRUE;
break;

/*是落子鍵*/
case KEYFALLCHESS:
if(ChessGo(gPlayOrder,gCursor)==FALSE)/*走棋*/
DoError();/*落子錯誤*/
else
{
DoOK();/*落子正確*/

/*如果當前行棋方贏棋*/
if(JudgeWin(gPlayOrder,gCursor)==TRUE)
{
DoWin(gPlayOrder);
bOutWhile = TRUE;/*退出循環標志置為真*/
}
/*否則*/
else
/*交換行棋方*/
ChangeOrder();
ShowOrderMsg(gPlayOrder);
}
break;

/*是游標移動鍵*/
case KEYMOVECURSOR:
MoveCursor(gPlayOrder,press);
break;

/*是無效鍵*/
case KEYINVALID:
break;
}

if(bOutWhile==TRUE)
break;
}

/*游戲結束*/
EndGame();
}
/**********************************************************/

/*界面初始化,數據初始化*/
void Init(void)
{
int i,j;
char *Msg[]=
{
"Player1 key:",
" UP----w",
" DOWN--s",
" LEFT--a",
" RIGHT-d",
" DO----space",
"",
"Player2 key:",
" UP----up",
" DOWN--down",
" LEFT--left",
" RIGHT-right",
" DO----ENTER",
"",
"exit game:",
" ESC",
NULL,
};

/* 先手方為1號玩家 */
gPlayOrder = CHESS1;
/* 棋盤數據清零, 即棋盤上各點開始的時候都沒有棋子 */
for(i=0;i<19;i++)
for(j=0;j<19;j++)
gChessBoard[i][j]=CHESSNULL;
/*游標初始位置*/
gCursor.x=gCursor.y=0;

/*畫棋盤*/
textmode(C40);
DrawMap();

/*顯示操作鍵說明*/
i=0;
textcolor(BROWN);
while(Msg[i]!=NULL)
{
gotoxy(25,3+i);
cputs(Msg[i]);
i++;
}

/*顯示當前行棋方*/
ShowOrderMsg(gPlayOrder);
/*游標移至棋盤的左上角點處*/
gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);
}

/*畫棋盤*/
void DrawMap(void)
{
int i,j;

clrscr();

for(i=0;i<19;i++)
for(j=0;j<19;j++)
DrawCross(i,j);

}

/*畫棋盤上的交叉點*/
void DrawCross(int x,int y)
{
gotoxy(x+MAPXOFT,y+MAPYOFT);
/*交叉點上是一號玩家的棋子*/
if(gChessBoard[x][y]==CHESS1)
{
textcolor(LIGHTBLUE);
putch(CHESS1);
return;
}
/*交叉點上是二號玩家的棋子*/
if(gChessBoard[x][y]==CHESS2)
{
textcolor(LIGHTRED);
putch(CHESS2);
return;
}

textcolor(GREEN);

/*左上角交叉點*/
if(x==0&&y==0)
{
putch(CROSSLU);
return;
}

/*左下角交叉點*/
if(x==0&&y==18)
{
putch(CROSSLD);
return;
}

/*右上角交叉點*/
if(x==18&&y==0)
{
putch(CROSSRU);
return;
}

/*右下角交叉點*/
if(x==18&&y==18)
{
putch(CROSSRD);
return;
}

/*左邊界交叉點*/
if(x==0)
{
putch(CROSSL);
return;
}

/*右邊界交叉點*/
if(x==18)
{
putch(CROSSR);
return;
}

/*上邊界交叉點*/
if(y==0)
{
putch(CROSSU);
return;
}

/*下邊界交叉點*/
if(y==18)
{
putch(CROSSD);
return;
}

/*棋盤中間的交叉點*/
putch(CROSS);
}

/*交換行棋方*/
int ChangeOrder(void)
{
if(gPlayOrder==CHESS1)
gPlayOrder=CHESS2;
else
gPlayOrder=CHESS1;

return(gPlayOrder);
}

/*獲取按鍵值*/
int GetKey(void)
{
char lowbyte;
int press;

while (bioskey(1) == 0)
;/*如果用戶沒有按鍵,空循環*/

press=bioskey(0);
lowbyte=press&0xff;
press=press&0xff00 + toupper(lowbyte);
return(press);
}

/*落子錯誤處理*/
void DoError(void)
{
sound(1200);
delay(50);
nosound();
}

/*贏棋處理*/
void DoWin(int Order)
{
sound(1500);delay(100);
sound(0); delay(50);
sound(800); delay(100);
sound(0); delay(50);
sound(1500);delay(100);
sound(0); delay(50);
sound(800); delay(100);
sound(0); delay(50);
nosound();

textcolor(RED+BLINK);
gotoxy(25,20);
if(Order==CHESS1)
cputs("PLAYER1 WIN!");
else
cputs("PLAYER2 WIN!");
gotoxy(25,21);
cputs("\n");
getch();
}

/*走棋*/
int ChessGo(int Order,struct point Cursor)
{
/*判斷交叉點上有無棋子*/
if(gChessBoard[Cursor.x][Cursor.y]==CHESSNULL)
{
/*若沒有棋子, 則可以落子*/
gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT);
textcolor(LIGHTBLUE);
putch(Order);
gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT);
gChessBoard[Cursor.x][Cursor.y]=Order;
return TRUE;
}
else
return FALSE;
}

/*判斷當前行棋方落子後是否贏棋*/
int JudgeWin(int Order,struct point Cursor)
{
int i;
for(i=0;i<4;i++)
/*判斷在指定方向上是否有連續5個行棋方的棋子*/
if(JudgeWinLine(Order,Cursor,i))
return TRUE;
return FALSE;
}

/*判斷在指定方向上是否有連續5個行棋方的棋子*/
int JudgeWinLine(int Order,struct point Cursor,int direction)
{
int i;
struct point pos,dpos;
const int testnum = 5;
int count;

switch(direction)
{
case 0:/*在水平方向*/
pos.x=Cursor.x-(testnum-1);
pos.y=Cursor.y;
dpos.x=1;
dpos.y=0;
break;
case 1:/*在垂直方向*/
pos.x=Cursor.x;
pos.y=Cursor.y-(testnum-1);
dpos.x=0;
dpos.y=1;
break;
case 2:/*在左下至右上的斜方向*/
pos.x=Cursor.x-(testnum-1);
pos.y=Cursor.y+(testnum-1);
dpos.x=1;
dpos.y=-1;
break;
case 3:/*在左上至右下的斜方向*/
pos.x=Cursor.x-(testnum-1);
pos.y=Cursor.y-(testnum-1);
dpos.x=1;
dpos.y=1;
break;
}

count=0;
for(i=0;i<testnum*2+1;i++)/*????????i<testnum*2-1*/
{
if(pos.x>=0&&pos.x<=18&&pos.y>=0&&pos.y<=18)
{
if(gChessBoard[pos.x][pos.y]==Order)
{
count++;
if(count>=testnum)
return TRUE;
}
else
count=0;
}
pos.x+=dpos.x;
pos.y+=dpos.y;
}

return FALSE;
}

/*移動游標*/
void MoveCursor(int Order,int press)
{
switch(press)
{
case PLAY1UP:
if(Order==CHESS1&&gCursor.y>0)
gCursor.y--;
break;
case PLAY1DOWN:
if(Order==CHESS1&&gCursor.y<18)
gCursor.y++;
break;
case PLAY1LEFT:
if(Order==CHESS1&&gCursor.x>0)
gCursor.x--;
break;
case PLAY1RIGHT:
if(Order==CHESS1&&gCursor.x<18)
gCursor.x++;
break;

case PLAY2UP:
if(Order==CHESS2&&gCursor.y>0)
gCursor.y--;
break;
case PLAY2DOWN:
if(Order==CHESS2&&gCursor.y<18)
gCursor.y++;
break;
case PLAY2LEFT:
if(Order==CHESS2&&gCursor.x>0)
gCursor.x--;
break;
case PLAY2RIGHT:
if(Order==CHESS2&&gCursor.x<18)
gCursor.x++;
break;
}

gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);
}

/*游戲結束處理*/
void EndGame(void)
{
textmode(C80);
}

/*顯示當前行棋方*/
void ShowOrderMsg(int Order)
{
gotoxy(6,MAPYOFT+20);
textcolor(LIGHTRED);
if(Order==CHESS1)
cputs("Player1 go!");
else
cputs("Player2 go!");

gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);
}

/*落子正確處理*/
void DoOK(void)
{
sound(500);
delay(70);
sound(600);
delay(50);
sound(1000);
delay(100);
nosound();
}

/*檢查用戶的按鍵類別*/
int CheckKey(int press)
{
if(press==ESCAPE)
return KEYEXIT;/*是退出鍵*/

else
if
( ( press==PLAY1DO && gPlayOrder==CHESS1) ||
( press==PLAY2DO && gPlayOrder==CHESS2)
)
return KEYFALLCHESS;/*是落子鍵*/

else
if
( press==PLAY1UP || press==PLAY1DOWN ||
press==PLAY1LEFT || press==PLAY1RIGHT ||
press==PLAY2UP || press==PLAY2DOWN ||
press==PLAY2LEFT || press==PLAY2RIGHT
)
return KEYMOVECURSOR;/*是游標移動鍵*/

else
return KEYINVALID;/*按鍵無效*/
}

⑨ 跪求一份JAVA黑白棋源代碼

package com.test;
import javax.swing.*;

import java.awt.*;
import java.awt.event.*;
import java.awt.image.ImageObserver;
import java.text.AttributedCharacterIterator;
public class GameDemo2 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MainWindow mw=new MainWindow();
mw.setSize(400,400);
mw.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mw.setVisible(true);
//mw.setResizable(false);

}

}

class MainWindow extends JFrame implements ActionListener{
/**
*
*/
private static final long serialVersionUID = 1L;
NewPanel mp=null;
JButton jbt1;
JButton jbt2;
JButton jbt3;
JButton jbt4;
int flag=-1;
JPanel jp=null;

public MainWindow(){
//初始化組件
mp=new NewPanel();
mp.addMouseListener(mp);
jbt1=new JButton("O 先手");
jbt2=new JButton("X 先手 ");
jbt3=new JButton("RESET");
jbt4=new JButton("EXIT");
jp=new JPanel();
GridLayout gl=new GridLayout(4,1);
gl.setHgap(4);
gl.setVgap(5);
jp.setLayout(gl);
jp.add(jbt1);
jp.add(jbt2);
jp.add(jbt3);
jp.add(jbt4);
this.add(mp,BorderLayout.CENTER);
this.add(jp,BorderLayout.EAST);
jbt1.addActionListener(this);
jbt2.addActionListener(this);
jbt3.addActionListener(this);
jbt4.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource()==jbt1){
flag=1;
mp.setHand(0);
jbt1.setEnabled(false);
jbt2.setEnabled(false);
}
if(e.getSource()==jbt2){
flag=2;
mp.setHand(1);
jbt1.setEnabled(false);
jbt2.setEnabled(false);
}
if(e.getSource()==jbt3){
flag=3;
mp.getGraphics().dispose();
this.remove(mp);

mp=new NewPanel();
this.add(mp,BorderLayout.CENTER);
mp.addMouseListener(mp);

this.remove(jp);
jp=new JPanel();
GridLayout gl=new GridLayout(4,1);
gl.setHgap(4);
gl.setVgap(5);
jp.setLayout(gl);
jp.add(jbt1);
jp.add(jbt2);
jp.add(jbt3);
jp.add(jbt4);
this.add(jp,BorderLayout.EAST);
this.validate();
jbt1.setEnabled(true);
jbt2.setEnabled(true);
}
if(e.getSource()==jbt4){
flag=4;
jbt1.setEnabled(false);
jbt2.setEnabled(false);
System.exit(0);
}
}
public int getFlag(){
return flag;
}
}

//畫板
class NewPanel extends JPanel implements MouseListener{

/**
*
*/
private static final long serialVersionUID = 1L;
//記錄畫圖的位置
int xx,yy;
//flag表示是否是初始化
int flag;
//0畫X,1畫0,2不畫
int kind;
//記錄是有有圖形的數組
//a[i]=0代表是空白可以畫 a[i]=1代表X a[i]=2代表畫O
int []a=null;
//記錄當前滑鼠位置所在方格,便於判斷是否可以繼續畫
int curLoc;
//記錄誰先手 0-0 1-X
int firstHand;
int times;
//0-O 1-X
int whoWin;

public void setFlag(int f){
flag=f;
}
public void setHand(int h){
firstHand=h;
}
public void setWhoWin(){
whoWin=-1;
}
public NewPanel(){
xx=0;
yy=0;
flag=0;
a=new int[9];
kind=-1;
curLoc=0;
whoWin=-1;
firstHand=-1;
times=1;
whoWin=-1;
}
public void paint(Graphics g){
//super.paint(g);
g.drawRect(0, 0, 300, 300);
g.drawRect(0, 100, 300, 100);
g.drawRect(100, 0, 100, 300);

if(flag==1){
if(isFull()==false){
if(testWin()==false){
if((times+firstHand)%2==0){
if(a[curLoc]==0){
g.drawLine(xx,yy,xx+60,yy+60);
g.drawLine(xx+60, yy, xx, yy+60);
a[curLoc]=1;
times++;
if(testWin()==true){
System.out.println("X贏了");
}
}
}
if((times+firstHand)%2==1){
if(a[curLoc]==0){
g.drawOval(xx,yy,60,60);
a[curLoc]=2;
times++;
if(testWin()==true){

System.out.println("O贏了");

}
}
}
}
}else{
System.out.println("it is FULL!!!");
}
}
}

//將滑鼠的坐標轉換為所畫圖形的基準坐標 ,返回當前滑鼠在記錄數組a中的下標
//圓形為外接矩形的左上角
//X為左上角起始點的坐標
public int Format(int x,int y,int kind){
//第一行第一列
int loc=-1;
if(x>=0&&x<100&&y>=0&&y<100){
xx=20;
yy=20;

loc= 0;
}
//第一行第二列
if(x>=100&&x<200&&y>=0&&y<100){
xx=120;
yy=20;

loc= 1;
}
//第一行第三列
if(x>=200&&x<300&&y>=0&&y<100){

xx=220;
yy=20;

loc= 2;
}
//第二行第一列
if(x>=0&&x<100&&y>=100&&y<200){

xx=20;
yy=120;

loc= 3;

}
//第二行第二列
if(x>=100&&x<200&&y>=100&&y<200){

xx=120;
yy=120;

loc= 4;
}
//第二行第三列
if(x>=200&&x<300&&y>=100&&y<200){

xx=220;
yy=120;

loc= 5;
}
//第三行第一列
if(x>=0&&x<100&&y>=200&&y<300){

xx=20;
yy=220;

loc= 6;
}
//第三行第二列
if(x>=100&&x<200&&y>=200&&y<300){

xx=120;
yy=220;

loc= 7;
}
//第三行第三列
if(x>=200&&x<300&&y>=200&&y<300){

xx=220;
yy=220;

loc= 8;
}
return loc;
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
xx=e.getX();
yy=e.getY();
flag=1;

//kind=new Random().nextInt(3);
curLoc=Format(xx,yy,kind);
this.repaint();
}
//判斷是否可以繼續畫的函數
public boolean isFull(){
for(int i=0;i<9;i++)
if(a[i]!=1&&a[i]!=2)
return false;
return true;
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub

}

public boolean testWin(){
boolean isWin=false;
//a[0]=1
if(a[0]!=0&&a[0]==a[1]&&a[0]==a[2]){
whoWin=a[0];
isWin=true;
}
if(a[0]!=0&&a[3]==a[0]&&a[0]==a[6]){
whoWin=a[0];
isWin=true;
}
if(a[0]!=0&&a[0]==a[4]&&a[0]==a[8]){
whoWin=a[0];
isWin=true;
}
if(a[1]!=0&&a[1]==a[4]&&a[1]==a[7]){
whoWin=a[1];
isWin=true;
}
if(a[2]!=0&&a[2]==a[4]&&a[2]==a[6]){
whoWin=a[2];
isWin=true;
}
if(a[2]!=0&&a[2]==a[5]&&a[2]==a[8]){
whoWin=a[2];
isWin=true;
}
if(a[3]!=0&&a[3]==a[4]&&a[3]==a[5]){
whoWin=a[3];
isWin=true;
}
if(a[6]!=0&&a[6]==a[7]&&a[6]==a[8]){
whoWin=a[6];
isWin=true;
}

return isWin;
}

@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub

}

//重新設置初始值
public void reset(){
this.getGraphics().dispose();

xx=0;
yy=0;
flag=0;
a=new int[9];
kind=-1;
curLoc=0;
whoWin=-1;
firstHand=-1;
times=1;
whoWin=-1;
}

}

⑩ 求一個C語言小程序(五子棋)源代碼

*******************************************************************/
/* ALEX_LEE 五子棋 C語言小程序 */
/* o(∩_∩)o...可以用來復習一下C語言的小程序 */
/* My Blog:hi..com/alexlee321 */
/******************************************************************/

/**********************************************************/
#include <stdio.h>
#include <bios.h>
#include <ctype.h>
#include <conio.h>
#include <dos.h>
/**********************************************************/
/* 定義符號常量 */

/*定義畫棋盤所需的製表符*/
#define CROSSRU 0xbf /*右上角點*/
#define CROSSLU 0xda /*左上角點*/
#define CROSSLD 0xc0 /*左下角點*/
#define CROSSRD 0xd9 /*右下角點*/
#define CROSSL 0xc3 /*左邊*/
#define CROSSR 0xb4 /*右邊*/
#define CROSSU 0xc2 /*上邊*/
#define CROSSD 0xc1 /*下邊*/
#define CROSS 0xc5 /*十字交叉點*/

/*定義棋盤左上角點在屏幕上的位置*/
#define MAPXOFT 5
#define MAPYOFT 2

/*定義1號玩家的操作鍵鍵碼*/
#define PLAY1UP 0x1157/*上移--'W'*/
#define PLAY1DOWN 0x1f53/*下移--'S'*/
#define PLAY1LEFT 0x1e41/*左移--'A'*/
#define PLAY1RIGHT 0x2044/*右移--'D'*/
#define PLAY1DO 0x3920/*落子--空格鍵*/

/*定義2號玩家的操作鍵鍵碼*/
#define PLAY2UP 0x4800/*上移--方向鍵up*/
#define PLAY2DOWN 0x5000/*下移--方向鍵down*/
#define PLAY2LEFT 0x4b00/*左移--方向鍵left*/
#define PLAY2RIGHT 0x4d00/*右移--方向鍵right*/
#define PLAY2DO 0x1c0d/*落子--回車鍵Enter*/

/*若想在游戲中途退出, 可按 Esc 鍵*/
#define ESCAPE 0x011b

/*定義棋盤上交叉點的狀態, 即該點有無棋子 */
/*若有棋子, 還應能指出是哪個玩家的棋子 */
#define CHESSNULL 0 //沒有棋子
#define CHESS1 'O'//一號玩家的棋子
#define CHESS2 'X'//二號玩家的棋子

/*定義按鍵類別*/
#define KEYEXIT 0/*退出鍵*/
#define KEYFALLCHESS 1/*落子鍵*/
#define KEYMOVECURSOR 2/*游標移動鍵*/
#define KEYINVALID 3/*無效鍵*/

/*定義符號常量: 真, 假 --- 真為1, 假為0 */
#define TRUE 1
#define FALSE 0

/**********************************************************/
/* 定義數據結構 */

/*棋盤交叉點坐標的數據結構*/
struct point
{
int x,y;
};

/**********************************************************/
/*自定義函數原型說明 */
void Init(void);
int GetKey(void);
int CheckKey(int press);
int ChangeOrder(void);
int ChessGo(int Order,struct point Cursor);
void DoError(void);
void DoOK(void);
void DoWin(int Order);
void MoveCursor(int Order,int press);
void DrawCross(int x,int y);
void DrawMap(void);
int JudgeWin(int Order,struct point Cursor);
int JudgeWinLine(int Order,struct point Cursor,int direction);
void ShowOrderMsg(int Order);
void EndGame(void);
/**********************************************************/

/**********************************************************/
/* 定義全局變數 */
int gPlayOrder; /*指示當前行棋方 */
struct point gCursor; /*游標在棋盤上的位置 */
char gChessBoard[19][19];/*用於記錄棋盤上各點的狀態*/
/**********************************************************/

/**********************************************************/
/*主函數*/
void main()
{
int press;
int bOutWhile=FALSE;/*退出循環標志*/

Init();/*初始化圖象,數據*/

while(1)
{
press=GetKey();/*獲取用戶的按鍵值*/
switch(CheckKey(press))/*判斷按鍵類別*/
{
/*是退出鍵*/
case KEYEXIT:
clrscr();/*清屏*/
bOutWhile = TRUE;
break;

/*是落子鍵*/
case KEYFALLCHESS:
if(ChessGo(gPlayOrder,gCursor)==FALSE)/*走棋*/
DoError();/*落子錯誤*/
else
{
DoOK();/*落子正確*/

/*如果當前行棋方贏棋*/
if(JudgeWin(gPlayOrder,gCursor)==TRUE)
{
DoWin(gPlayOrder);
bOutWhile = TRUE;/*退出循環標志置為真*/
}
/*否則*/
else
/*交換行棋方*/
ChangeOrder();
}
break;

/*是游標移動鍵*/
case KEYMOVECURSOR:
MoveCursor(gPlayOrder,press);
break;

/*是無效鍵*/
case KEYINVALID:
break;
}

if(bOutWhile==TRUE)
break;
}

/*游戲結束*/
EndGame();
}
/**********************************************************/

/*界面初始化,數據初始化*/
void Init(void)
{
int i,j;
char *Msg[]=
{
"Player1 key:",
" UP----w",
" DOWN--s",
" LEFT--a",
" RIGHT-d",
" DO----space",
"",
"Player2 key:",
" UP----up",
" DOWN--down",
" LEFT--left",
" RIGHT-right",
" DO----ENTER",
"",
"exit game:",
" ESC",
NULL,
};

/*先手方為1號玩家*/
gPlayOrder = CHESS1;
/*棋盤數據清零, 即棋盤上各點開始的時候都沒有棋子*/
for(i=0;i<19;i++)
for(j=0;j<19;j++)
gChessBoard[i][j]=CHESSNULL;
/*游標初始位置*/
gCursor.x=gCursor.y=0;

/*畫棋盤*/
textmode(C40);
DrawMap();

/*顯示操作鍵說明*/
i=0;
textcolor(BROWN);
while(Msg[i]!=NULL)
{
gotoxy(25,3+i);
cputs(Msg[i]);
i++;
}

/*顯示當前行棋方*/
ShowOrderMsg(gPlayOrder);
/*游標移至棋盤的左上角點處*/
gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);
}

/*畫棋盤*/
void DrawMap(void)
{
int i,j;

clrscr();

for(i=0;i<19;i++)
for(j=0;j<19;j++)
DrawCross(i,j);

}

/*畫棋盤上的交叉點*/
void DrawCross(int x,int y)
{
gotoxy(x+MAPXOFT,y+MAPYOFT);
/*交叉點上是一號玩家的棋子*/
if(gChessBoard[x][y]==CHESS1)
{
textcolor(LIGHTBLUE);
putch(CHESS1);
return;
}
/*交叉點上是二號玩家的棋子*/
if(gChessBoard[x][y]==CHESS2)
{
textcolor(LIGHTBLUE);
putch(CHESS2);
return;
}

textcolor(GREEN);

/*左上角交叉點*/
if(x==0&&y==0)
{
putch(CROSSLU);
return;
}

/*左下角交叉點*/
if(x==0&&y==18)
{
putch(CROSSLD);
return;
}

/*右上角交叉點*/
if(x==18&&y==0)
{
putch(CROSSRU);
return;
}

/*右下角交叉點*/
if(x==18&&y==18)
{
putch(CROSSRD);
return;
}

/*左邊界交叉點*/
if(x==0)
{
putch(CROSSL);
return;
}

/*右邊界交叉點*/
if(x==18)
{
putch(CROSSR);
return;
}

/*上邊界交叉點*/
if(y==0)
{
putch(CROSSU);
return;
}

/*下邊界交叉點*/
if(y==18)
{
putch(CROSSD);
return;
}

/*棋盤中間的交叉點*/
putch(CROSS);
}

/*交換行棋方*/
int ChangeOrder(void)
{
if(gPlayOrder==CHESS1)
gPlayOrder=CHESS2;
else
gPlayOrder=CHESS1;

return(gPlayOrder);
}

/*獲取按鍵值*/
int GetKey(void)
{
char lowbyte;
int press;

while (bioskey(1) == 0)
;/*如果用戶沒有按鍵,空循環*/

press=bioskey(0);
lowbyte=press&0xff;
press=press&0xff00 + toupper(lowbyte);
return(press);
}

/*落子錯誤處理*/
void DoError(void)
{
sound(1200);
delay(50);
nosound();
}

/*贏棋處理*/
void DoWin(int Order)
{
sound(1500);delay(100);
sound(0); delay(50);
sound(800); delay(100);
sound(0); delay(50);
sound(1500);delay(100);
sound(0); delay(50);
sound(800); delay(100);
sound(0); delay(50);
nosound();

textcolor(RED+BLINK);
gotoxy(25,20);
if(Order==CHESS1)
cputs("PLAYER1 WIN!");
else
cputs("PLAYER2 WIN!");
gotoxy(25,21);
cputs(" \\<^+^>/");
getch();
}

/*走棋*/
int ChessGo(int Order,struct point Cursor)
{
/*判斷交叉點上有無棋子*/
if(gChessBoard[Cursor.x][Cursor.y]==CHESSNULL)
{
/*若沒有棋子, 則可以落子*/
gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT);
textcolor(LIGHTBLUE);
putch(Order);
gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT);
gChessBoard[Cursor.x][Cursor.y]=Order;
return TRUE;
}
else
return FALSE;
}

/*判斷當前行棋方落子後是否贏棋*/
int JudgeWin(int Order,struct point Cursor)
{
int i;
for(i=0;i<4;i++)
/*判斷在指定方向上是否有連續5個行棋方的棋子*/
if(JudgeWinLine(Order,Cursor,i))
return TRUE;
return FALSE;
}

/*判斷在指定方向上是否有連續5個行棋方的棋子*/
int JudgeWinLine(int Order,struct point Cursor,int direction)
{
int i;
struct point pos,dpos;
const int testnum = 5;
int count;

switch(direction)
{
case 0:/*在水平方向*/
pos.x=Cursor.x-(testnum-1);
pos.y=Cursor.y;
dpos.x=1;
dpos.y=0;
break;
case 1:/*在垂直方向*/
pos.x=Cursor.x;
pos.y=Cursor.y-(testnum-1);
dpos.x=0;
dpos.y=1;
break;
case 2:/*在左下至右上的斜方向*/
pos.x=Cursor.x-(testnum-1);
pos.y=Cursor.y+(testnum-1);
dpos.x=1;
dpos.y=-1;
break;
case 3:/*在左上至右下的斜方向*/
pos.x=Cursor.x-(testnum-1);
pos.y=Cursor.y-(testnum-1);
dpos.x=1;
dpos.y=1;
break;
}

count=0;
for(i=0;i<testnum*2+1;i++)
{
if(pos.x>=0&&pos.x<=18&&pos.y>=0&&pos.y<=18)
{
if(gChessBoard[pos.x][pos.y]==Order)
{
count++;
if(count>=testnum)
return TRUE;
}
else
count=0;
}
pos.x+=dpos.x;
pos.y+=dpos.y;
}

return FALSE;
}

/*移動游標*/
void MoveCursor(int Order,int press)
{
switch(press)
{
case PLAY1UP:
if(Order==CHESS1&&gCursor.y>0)
gCursor.y--;
break;
case PLAY1DOWN:
if(Order==CHESS1&&gCursor.y<18)
gCursor.y++;
break;
case PLAY1LEFT:
if(Order==CHESS1&&gCursor.x>0)
gCursor.x--;
break;
case PLAY1RIGHT:
if(Order==CHESS1&&gCursor.x<18)
gCursor.x++;
break;

case PLAY2UP:
if(Order==CHESS2&&gCursor.y>0)
gCursor.y--;
break;
case PLAY2DOWN:
if(Order==CHESS2&&gCursor.y<18)
gCursor.y++;
break;
case PLAY2LEFT:
if(Order==CHESS2&&gCursor.x>0)
gCursor.x--;
break;
case PLAY2RIGHT:
if(Order==CHESS2&&gCursor.x<18)
gCursor.x++;
break;
}

gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);
}

/*游戲結束處理*/
void EndGame(void)
{
textmode(C80);
}

/*顯示當前行棋方*/
void ShowOrderMsg(int Order)
{
gotoxy(6,MAPYOFT+20);
textcolor(LIGHTRED);
if(Order==CHESS1)
cputs("Player1 go!");
else
cputs("Player2 go!");

gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);
}

/*落子正確處理*/
void DoOK(void)
{
sound(500);
delay(70);
sound(600);
delay(50);
sound(1000);
delay(100);
nosound();
}

/*檢查用戶的按鍵類別*/
int CheckKey(int press)
{
if(press==ESCAPE)
return KEYEXIT;/*是退出鍵*/

else
if
( ( press==PLAY1DO && gPlayOrder==CHESS1) ||
( press==PLAY2DO && gPlayOrder==CHESS2)
)
return KEYFALLCHESS;/*是落子鍵*/

else
if
( press==PLAY1UP || press==PLAY1DOWN ||
press==PLAY1LEFT || press==PLAY1RIGHT ||
press==PLAY2UP || press==PLAY2DOWN ||
press==PLAY2LEFT || press==PLAY2RIGHT
)
return KEYMOVECURSOR;/*是游標移動鍵*/

else
return KEYINVALID;/*按鍵無效*/
}

熱點內容
選擇ftp伺服器 發布:2024-10-10 04:56:16 瀏覽:197
php函數fopen 發布:2024-10-10 04:50:20 瀏覽:238
編程飛鳥站 發布:2024-10-10 04:49:34 瀏覽:615
資料庫基礎與應用作業 發布:2024-10-10 04:35:31 瀏覽:847
淘寶上傳圖片找同款 發布:2024-10-10 04:31:23 瀏覽:435
玩具直播腳本 發布:2024-10-10 04:31:19 瀏覽:629
php後門檢測工具 發布:2024-10-10 04:18:46 瀏覽:275
我的世界怎麼把伺服器封面更改 發布:2024-10-10 04:18:35 瀏覽:930
linuxsvnserver 發布:2024-10-10 03:56:51 瀏覽:544
php數組最大長度 發布:2024-10-10 03:41:22 瀏覽:679