c语言五子棋代码,
8个回答
2011-02-16
展开全部
package day17.gobang;
import java.util.Arrays;
public class GoBangGame {
public static final char BLANK='*';
public static final char BLACK='@';
public static final char WHITE='O';
public static final int MAX = 16;
private static final int COUNT = 5;
//棋盘
private char[][] board;
public GoBangGame() {
}
//开始游戏
public void start() {
board = new char[MAX][MAX];
//把二维数组都填充‘*’
for(char[] ary: board){
Arrays.fill(ary, BLANK);
}
}
public char[][] getChessBoard(){
return board;
}
public void addBlack(int x, int y) throws ChessExistException{
//@
//char blank = '*';
//System.out.println( x +"," + y + ":" + board[y][x] + "," + BLANK);
if(board[y][x] == BLANK){// x, y 位置上必须是空的才可以添棋子
board[y][x] = BLACK;
return;
}
throw new ChessExistException("已经有棋子了!");
}
public void addWhite(int x, int y)
throws ChessExistException{
if(board[y][x] == BLANK){// x, y 位置上必须是空的才可以添棋子
board[y][x] = WHITE;
return;
}
throw new ChessExistException("已经有棋子了!");
}
//chess 棋子:'@'/'O'
public boolean winOnY(char chess, int x, int y){
//先找到y方向第一个不是 blank的棋子
int top = y;
while(true){
if(y==0 || board[y-1][x]!=chess){
//如果y已经是棋盘的边缘, 或者的前一个不是chess
//就不再继续查找了
break;
}
y--;
top = y;
}
//向回统计所有chess的个数,如果是COUNT个就赢了
int count = 0;
y = top;
while(true){
if(y==MAX || board[y][x]!=chess){
//如果找到头 或者 下一个子不是chess 就不再继续统计了
break;
}
count++;
y++;
}
return count==COUNT;
}
//chess 棋子:'@'/'O'
public boolean winOnX(char chess, int x, int y){
//先找到x方向第一个不是 blank的棋子
int top = x;
while(true){
if(x==0 || board[y][x-1]!=chess){
//如果x已经是棋盘的边缘, 或者的前一个不是chess
//就不再继续查找了
break;
}
x--;
top = x;
}
//向回统计所有chess的个数,如果是COUNT个就赢了
int count = 0;
x = top;
while(true){
if(x==MAX || board[y][x]!=chess){
//如果找到头 或者 下一个子不是chess 就不再继续统计了
break;
}
count++;
x++;
}
return count==COUNT;
}
//chess 棋子:'@'/'O'
public boolean winOnXY(char chess, int x, int y){
//先找MAX向第一个不是 blank的棋子
int top = y;
int left = x;
while(true){
if(x==0 || y==0 || board[y-1][x-1]!=chess){
//如果x已经是棋盘的边缘, 或者的前一个不是chess
//就不再继续查找了
break;
}
x--;
y--;
top = y;
left=x;
}
//向回统计所有chess的个数,如果是COUNT个就赢了
int count = 0;
x = left;
y = top;
while(true){
if(x==MAX || y==MAX || board[y][x]!=chess){
//如果找到头 或者 下一个子不是chess 就不再继续统计了
break;
}
count++;
x++;
y++;
}
return count==COUNT;
}
//chess 棋子:'@'/'O'
public boolean winOnYX(char chess, int x, int y){
//先找到x方向第一个不是 blank的棋子
int top = y;
int left = x;
while(true){
if(x==MAX-1 || y==0 || board[y-1][x+1]!=chess){
//如果x已经是棋盘的边缘, 或者的前一个不是chess
//就不再继续查找了
break;
}
x++;
y--;
top = y;
left=x;
}
//向回统计所有chess的个数,如果是COUNT个就赢了
int count = 0;
x = left;
y = top;
while(true){
if(x==0 || y==MAX || board[y][x]!=chess){
//如果找到头 或者 下一个子不是chess 就不再继续统计了
break;
}
count++;
x--;
y++;
}
return count==COUNT;
}
public boolean whiteIsWin(int x, int y) {
//在任何一个方向上赢了,都算赢
return winOnY(WHITE, x, y) ||
winOnX(WHITE, x, y) ||
winOnXY(WHITE, x, y) ||
winOnYX(WHITE, x, y);
}
public boolean blackIsWin(int x, int y) {
return winOnY(BLACK, x, y) ||
winOnX(BLACK, x, y) ||
winOnXY(BLACK, x, y) ||
winOnYX(BLACK, x, y);
}
}
import java.util.Arrays;
public class GoBangGame {
public static final char BLANK='*';
public static final char BLACK='@';
public static final char WHITE='O';
public static final int MAX = 16;
private static final int COUNT = 5;
//棋盘
private char[][] board;
public GoBangGame() {
}
//开始游戏
public void start() {
board = new char[MAX][MAX];
//把二维数组都填充‘*’
for(char[] ary: board){
Arrays.fill(ary, BLANK);
}
}
public char[][] getChessBoard(){
return board;
}
public void addBlack(int x, int y) throws ChessExistException{
//@
//char blank = '*';
//System.out.println( x +"," + y + ":" + board[y][x] + "," + BLANK);
if(board[y][x] == BLANK){// x, y 位置上必须是空的才可以添棋子
board[y][x] = BLACK;
return;
}
throw new ChessExistException("已经有棋子了!");
}
public void addWhite(int x, int y)
throws ChessExistException{
if(board[y][x] == BLANK){// x, y 位置上必须是空的才可以添棋子
board[y][x] = WHITE;
return;
}
throw new ChessExistException("已经有棋子了!");
}
//chess 棋子:'@'/'O'
public boolean winOnY(char chess, int x, int y){
//先找到y方向第一个不是 blank的棋子
int top = y;
while(true){
if(y==0 || board[y-1][x]!=chess){
//如果y已经是棋盘的边缘, 或者的前一个不是chess
//就不再继续查找了
break;
}
y--;
top = y;
}
//向回统计所有chess的个数,如果是COUNT个就赢了
int count = 0;
y = top;
while(true){
if(y==MAX || board[y][x]!=chess){
//如果找到头 或者 下一个子不是chess 就不再继续统计了
break;
}
count++;
y++;
}
return count==COUNT;
}
//chess 棋子:'@'/'O'
public boolean winOnX(char chess, int x, int y){
//先找到x方向第一个不是 blank的棋子
int top = x;
while(true){
if(x==0 || board[y][x-1]!=chess){
//如果x已经是棋盘的边缘, 或者的前一个不是chess
//就不再继续查找了
break;
}
x--;
top = x;
}
//向回统计所有chess的个数,如果是COUNT个就赢了
int count = 0;
x = top;
while(true){
if(x==MAX || board[y][x]!=chess){
//如果找到头 或者 下一个子不是chess 就不再继续统计了
break;
}
count++;
x++;
}
return count==COUNT;
}
//chess 棋子:'@'/'O'
public boolean winOnXY(char chess, int x, int y){
//先找MAX向第一个不是 blank的棋子
int top = y;
int left = x;
while(true){
if(x==0 || y==0 || board[y-1][x-1]!=chess){
//如果x已经是棋盘的边缘, 或者的前一个不是chess
//就不再继续查找了
break;
}
x--;
y--;
top = y;
left=x;
}
//向回统计所有chess的个数,如果是COUNT个就赢了
int count = 0;
x = left;
y = top;
while(true){
if(x==MAX || y==MAX || board[y][x]!=chess){
//如果找到头 或者 下一个子不是chess 就不再继续统计了
break;
}
count++;
x++;
y++;
}
return count==COUNT;
}
//chess 棋子:'@'/'O'
public boolean winOnYX(char chess, int x, int y){
//先找到x方向第一个不是 blank的棋子
int top = y;
int left = x;
while(true){
if(x==MAX-1 || y==0 || board[y-1][x+1]!=chess){
//如果x已经是棋盘的边缘, 或者的前一个不是chess
//就不再继续查找了
break;
}
x++;
y--;
top = y;
left=x;
}
//向回统计所有chess的个数,如果是COUNT个就赢了
int count = 0;
x = left;
y = top;
while(true){
if(x==0 || y==MAX || board[y][x]!=chess){
//如果找到头 或者 下一个子不是chess 就不再继续统计了
break;
}
count++;
x--;
y++;
}
return count==COUNT;
}
public boolean whiteIsWin(int x, int y) {
//在任何一个方向上赢了,都算赢
return winOnY(WHITE, x, y) ||
winOnX(WHITE, x, y) ||
winOnXY(WHITE, x, y) ||
winOnYX(WHITE, x, y);
}
public boolean blackIsWin(int x, int y) {
return winOnY(BLACK, x, y) ||
winOnX(BLACK, x, y) ||
winOnXY(BLACK, x, y) ||
winOnYX(BLACK, x, y);
}
}
展开全部
五子棋胜负的判定,一般有一下两种算法:
1.扫描整个棋盘,分别扫描四个方向是否有5个连子。网上找了很多五子棋源码都是用此算法,这意味着每下一个棋子都要扫描一遍19×19的棋盘,复杂而且低效,代码略。
2.每下一字,从该子开始扫描其四个方向(例如:从该子的(x-4,y)坐标开始扫描横向)是否存在5个连子。此算法较为常用,而且不涉及更为复杂的数据结构。
另外,为解决扫描越界的问题,在声明棋盘棋子位置时,可声明一个(4+19+4)×(4+19+4)的棋盘,而让棋子偏移(4,4)个坐标。
算法2源代码如下:
?123456789101112131415161718192021static void IfWin(int x,int y,int color){ TCHAR win[20]; int a,b; if(stone[x][y]==1) wcscpy_s(win,_T("黑棋胜利!")); else wcscpy_s(win,_T("白棋胜利!")); for(a=x-4;a<=x+4;a++)//判断横 if(stone[a][y]==color&&stone[a+1][y]==color&&stone[a+2][y]==color&&stone[a+3][y]==color&&stone[a+4][y]==color) {MessageBoxW(Xqwl.hWnd,win,TEXT(""),MB_OK);return;} for(b=y-4;b<=y+4;b++)//判断竖 if(stone[x][b]==color&&stone[x][b+1]==color&&stone[x][b+2]==color&&stone[x][b+3]==color&&stone[x][b+4]==color) {MessageBoxW(Xqwl.hWnd,win,TEXT(""),MB_OK);return;} for(a=x-4,b=y-4;a<=x+4;a++,b++)//判断右斜 if(stone[a][b]==color&&stone[a+1][b+1]==color&&stone[a+2][b+2]==color&&stone[a+3][b+3]==color&&stone[a+4][b+4]==color) {MessageBoxW(Xqwl.hWnd,win,TEXT(""),MB_OK);return;} for(a=x-4,b=y+4;a<=x+4;a++,b--)//判断左斜 if(stone[a][b]==color&&stone[a+1][b-1]==color&&stone[a+2][b-2]==color&&stone[a+3][b-3]==color&&stone[a+4][b-4]==color) {MessageBoxW(Xqwl.hWnd,win,TEXT(""),MB_OK);return;}}
1.扫描整个棋盘,分别扫描四个方向是否有5个连子。网上找了很多五子棋源码都是用此算法,这意味着每下一个棋子都要扫描一遍19×19的棋盘,复杂而且低效,代码略。
2.每下一字,从该子开始扫描其四个方向(例如:从该子的(x-4,y)坐标开始扫描横向)是否存在5个连子。此算法较为常用,而且不涉及更为复杂的数据结构。
另外,为解决扫描越界的问题,在声明棋盘棋子位置时,可声明一个(4+19+4)×(4+19+4)的棋盘,而让棋子偏移(4,4)个坐标。
算法2源代码如下:
?123456789101112131415161718192021static void IfWin(int x,int y,int color){ TCHAR win[20]; int a,b; if(stone[x][y]==1) wcscpy_s(win,_T("黑棋胜利!")); else wcscpy_s(win,_T("白棋胜利!")); for(a=x-4;a<=x+4;a++)//判断横 if(stone[a][y]==color&&stone[a+1][y]==color&&stone[a+2][y]==color&&stone[a+3][y]==color&&stone[a+4][y]==color) {MessageBoxW(Xqwl.hWnd,win,TEXT(""),MB_OK);return;} for(b=y-4;b<=y+4;b++)//判断竖 if(stone[x][b]==color&&stone[x][b+1]==color&&stone[x][b+2]==color&&stone[x][b+3]==color&&stone[x][b+4]==color) {MessageBoxW(Xqwl.hWnd,win,TEXT(""),MB_OK);return;} for(a=x-4,b=y-4;a<=x+4;a++,b++)//判断右斜 if(stone[a][b]==color&&stone[a+1][b+1]==color&&stone[a+2][b+2]==color&&stone[a+3][b+3]==color&&stone[a+4][b+4]==color) {MessageBoxW(Xqwl.hWnd,win,TEXT(""),MB_OK);return;} for(a=x-4,b=y+4;a<=x+4;a++,b--)//判断左斜 if(stone[a][b]==color&&stone[a+1][b-1]==color&&stone[a+2][b-2]==color&&stone[a+3][b-3]==color&&stone[a+4][b-4]==color) {MessageBoxW(Xqwl.hWnd,win,TEXT(""),MB_OK);return;}}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我只给你判断输赢的算法,其他的你自己解决//全局变量
int curX,curY;//当前下棋的坐标 0 <= curX <= 15 0 <= curY <= 15
int onTable[16][16];
void WhoWin(int collor)
{ // 竖直方向 水平方向 右上到左下 左上到右下
if( SameLineNum(0,1) >= 5 ||SameLineNum(1,0) >= 5 ||SameLineNum(1,1) >= 5 ||SameLineNum(-1,1) >= 5)
{ printf("%s 方获胜\n",collor);
}
}//判断当前棋子的某个方向上同色棋子有多少
int SameLineNum(int x,int y)
{
int tX,tY;
int num;//同一线上相同颜色棋子数
tX = curX;tY = curY;
do//计算落子一边同颜色的棋子数 (比如左边)
{ if( onTable(tX,tY) <> onTable(curX,curY)
{ num = Max(Abs(curX - tX),Abs(curY - tY);//Max求最大值,Abs求求绝对值
break;
}
tX = tX + x;tY = tY + y;
}
while (x < 0 || j < 0 || i > 15 || j > 15);
do//计算落子一边同颜色的棋子数 (比如右边)
{ if( onTable(tX,tY) <> onTable(curX,curY)
{ num = num -1 + Max(Abs(curX - tX),Abs(curY - tY);//Max求最大值,Abs求求绝对值
break;
}
tX = tX - x;tY = tY - y;
}
while (x < 0 || j < 0 || i > 15 || j > 15);
return num;
}
int curX,curY;//当前下棋的坐标 0 <= curX <= 15 0 <= curY <= 15
int onTable[16][16];
void WhoWin(int collor)
{ // 竖直方向 水平方向 右上到左下 左上到右下
if( SameLineNum(0,1) >= 5 ||SameLineNum(1,0) >= 5 ||SameLineNum(1,1) >= 5 ||SameLineNum(-1,1) >= 5)
{ printf("%s 方获胜\n",collor);
}
}//判断当前棋子的某个方向上同色棋子有多少
int SameLineNum(int x,int y)
{
int tX,tY;
int num;//同一线上相同颜色棋子数
tX = curX;tY = curY;
do//计算落子一边同颜色的棋子数 (比如左边)
{ if( onTable(tX,tY) <> onTable(curX,curY)
{ num = Max(Abs(curX - tX),Abs(curY - tY);//Max求最大值,Abs求求绝对值
break;
}
tX = tX + x;tY = tY + y;
}
while (x < 0 || j < 0 || i > 15 || j > 15);
do//计算落子一边同颜色的棋子数 (比如右边)
{ if( onTable(tX,tY) <> onTable(curX,curY)
{ num = num -1 + Max(Abs(curX - tX),Abs(curY - tY);//Max求最大值,Abs求求绝对值
break;
}
tX = tX - x;tY = tY - y;
}
while (x < 0 || j < 0 || i > 15 || j > 15);
return num;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先设2维数组模拟棋盘,棋盘每个位置设权值,代表当前适合下的一个价值
然后根据下面的表,给值,每下一步判断一次
棋型名称 棋型模式 估值
活四 ?AAAA? 300000
死四A AAAA? 2500
死四B AAA?A 3000
死四C AA?AA 2600
活三 ??AAA?? 3000
死三A AAA?? 500
死三B ?A?AA? 800
死三C A??AA 600
死三D A?A?A 550
活二 ???AA??? 650
死二A AA??? 150
死二B ??A?A?? 250
死二C ?A??A? 200
代码挺长的,没什么看的意义,自己琢磨一下这个就写了
不懂得继续问
然后根据下面的表,给值,每下一步判断一次
棋型名称 棋型模式 估值
活四 ?AAAA? 300000
死四A AAAA? 2500
死四B AAA?A 3000
死四C AA?AA 2600
活三 ??AAA?? 3000
死三A AAA?? 500
死三B ?A?AA? 800
死三C A??AA 600
死三D A?A?A 550
活二 ???AA??? 650
死二A AA??? 150
死二B ??A?A?? 250
死二C ?A??A? 200
代码挺长的,没什么看的意义,自己琢磨一下这个就写了
不懂得继续问
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先申明,这不是俺写的,只是帮你找的,简单的人人对战,没有AI功能,其实百度一下,很多问题能自己解决的!
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define MAXIMUS 15 //定义棋盘大小
int p[MAXIMUS][MAXIMUS];//存储对局信息
char buff[MAXIMUS * 2 + 1][MAXIMUS * 4 + 3]; //输出缓冲器
int Cx, Cy; //当前光标位置
int Now;//当前走子的玩家,1代表黑,2代表白
int wl, wp; //当前写入缓冲器的列数和行数位置
char* showText;//在棋盘中央显示的文字信息
int count;//回合数
char* Copy ( char* strDest, const char* strSrc ) //修改过的字符串复制函数,会忽略末端的\0
{
char* strDestCopy = strDest;
while ( *strSrc != '\0' )
{
*strDest++ = *strSrc++;
}
return strDestCopy;
}
void Initialize() //初始化一个对局函数
{
int i, j; //循环变量
showText = ""; //重置显示信息
count = 0; //回合数归零
for ( i = 0; i < MAXIMUS; i++ ) //重置对局数据
{
for ( j = 0; j < MAXIMUS; j++ )
{
p[i][j] = 0;
}
}
Cx = Cy = MAXIMUS / 2; //重置光标到中央
Now = 1; //重置当前为黑方
}
char* getStyle ( int i, int j ) //获得棋盘中指定坐标交点位置的字符,通过制表符拼成棋盘
{
if ( p[i][j] == 1 ) //1为黑子
return "●";
else if ( p[i][j] == 2 ) //2为白子
return "○";
else if ( i == 0 && j == 0 ) //以下为边缘棋盘样式
return "┏";
else if ( i == MAXIMUS - 1 && j == 0 )
return "┓";
else if ( i == MAXIMUS - 1 && j == MAXIMUS - 1 )
return "┛";
else if ( i == 0 && j == MAXIMUS - 1 )
return "┗";
else if ( i == 0 )
return "┠";
else if ( i == MAXIMUS - 1 )
return "┨";
else if ( j == 0 )
return "┯";
else if ( j == MAXIMUS - 1 )
return "┷";
return "┼";//中间的空位
}
char* getCurse ( int i, int j ) //获得指定坐标交点位置左上格的样式,通过制表符来模拟光标的显示
{
if ( i == Cx )
{
if ( j == Cy )
return "┏";
else if ( j == Cy + 1 )
return "┗";
}
else if ( i == Cx + 1 )
{
if ( j == Cy )
return "┓";
else if ( j == Cy + 1 )
return "┛";
}
return " ";//如果不在光标附近则为空
}
void write ( char* c ) //向缓冲器写入字符串
{
Copy ( buff[wl] + wp, c );
wp += strlen ( c );
}
void ln() //缓冲器写入位置提行
{
wl += 1;
wp = 0;
}
void Display() //将缓冲器内容输出到屏幕
{
int i, l = strlen ( showText ); //循环变量,中间文字信息的长度
int Offset = MAXIMUS * 2 + 2 - l / 2; //算出中间文字信息居中显示所在的横坐标位置
if ( Offset % 2 == 1 ) //如果位置为奇数,则移动到偶数,避免混乱
{
Offset--;
}
Copy ( buff[MAXIMUS] + Offset, showText ); //讲中间文字信息复制到缓冲器
if ( l % 2 == 1 ) //如果中间文字长度为半角奇数,则补上空格,避免混乱
{
* ( buff[MAXIMUS] + Offset + l ) = 0x20;
}
system ( "cls" ); //清理屏幕,准备写入
for ( i = 0; i < MAXIMUS * 2 + 1; i++ ) //循环写入每一行
{
printf ( "%s", buff[i] );
if ( i < MAXIMUS * 2 ) //写入完每一行需要换行
printf ( "\n" );
}
}
void Print() //将整个棋盘算出并储存到缓冲器,然后调用Display函数显示出来
{
int i, j; //循环变量
wl = 0;
wp = 0;
for ( j = 0; j <= MAXIMUS; j++ ) //写入出交点左上角的字符,因为需要打印棋盘右下角,所以很以横纵各多一次循环
{
for ( i = 0; i <= MAXIMUS; i++ )
{
write ( getCurse ( i, j ) ); //写入左上角字符
if ( j == 0 || j == MAXIMUS ) //如果是棋上下盘边缘则没有连接的竖线,用空格填充位置
{
if ( i != MAXIMUS )
write ( " " );
}
else//如果在棋盘中间则用竖线承接上下
{
if ( i == 0 || i == MAXIMUS - 1 ) //左右边缘的竖线更粗
write ( "┃" );
else if ( i != MAXIMUS ) //中间的竖线
write ( "│" );
}
}
if ( j == MAXIMUS ) //如果是最后一次循环,则只需要处理边侧字符,交点要少一排
{
break;
}
ln();//提行开始打印交点内容
write ( " " ); //用空位补齐位置
for ( i = 0; i < MAXIMUS; i++ ) //按横坐标循环正常的次数
{
write ( getStyle ( i, j ) ); //写入交点字符
if ( i != MAXIMUS - 1 ) //如果不在最右侧则补充一个横线承接左右
{
if ( j == 0 || j == MAXIMUS - 1 )
{
write ( "━" ); //上下边缘的横线更粗
}
else
{
write ( "—" ); //中间的横线
}
}
}
ln();//写完一行后提行
}
Display();//将缓冲器内容输出到屏幕
}
int Put() //在当前光标位置走子,如果非空,则返回0表示失败
{
if ( p[Cx][Cy] == 0 )
{
p[Cx][Cy] = Now; //改变该位置数据
return 1;//返回1表示成功
}
else
{
return 0;
}
}
int Check() //胜负检查,即判断当前走子位置有没有造成五连珠的情况
{
int w = 1, x = 1, y = 1, z = 1, i; //累计横竖正斜反邪四个方向的连续相同棋子数目
for ( i = 1; i < 5; i++ ) if ( Cy + i < MAXIMUS && p[Cx][Cy + i] == Now ) w++;
else break;//向下检查
for ( i = 1; i < 5; i++ ) if ( Cy - i > 0 && p[Cx][Cy - i] == Now ) w++;
else break;//向上检查
if ( w >= 5 ) return Now; //若果达到5个则判断当前走子玩家为赢家
for ( i = 1; i < 5; i++ ) if ( Cx + i < MAXIMUS && p[Cx + i][Cy] == Now ) x++;
else break;//向右检查
for ( i = 1; i < 5; i++ ) if ( Cx - i > 0 && p[Cx - i][Cy] == Now ) x++;
else break;//向左检查
if ( x >= 5 ) return Now; //若果达到5个则判断当前走子玩家为赢家
for ( i = 1; i < 5; i++ ) if ( Cx + i < MAXIMUS && Cy + i < MAXIMUS && p[Cx + i][Cy + i] == Now ) y++;
else break;//向右下检查
for ( i = 1; i < 5; i++ ) if ( Cx - i > 0 && Cy - i > 0 && p[Cx - i][Cy - i] == Now ) y++;
else break;//向左上检查
if ( y >= 5 ) return Now; //若果达到5个则判断当前走子玩家为赢家
for ( i = 1; i < 5; i++ ) if ( Cx + i < MAXIMUS && Cy - i > 0 && p[Cx + i][Cy - i] == Now ) z++;
else break;//向右上检查
for ( i = 1; i < 5; i++ ) if ( Cx - i > 0 && Cy + i < MAXIMUS && p[Cx - i][Cy + i] == Now ) z++;
else break;//向左下检查
if ( z >= 5 ) return Now; //若果达到5个则判断当前走子玩家为赢家
return 0;//若没有检查到五连珠,则返回0表示还没有玩家达成胜利
}
int RunGame() //进行整个对局,返回赢家信息(虽然有用上)
{
int input;//输入变量
int victor;//赢家信息
Initialize();//初始化对局
while ( 1 ) //开始无限回合的死循环,直到出现胜利跳出
{
Print();//打印棋盘
input = getch(); //等待键盘按下一个字符
if ( input == 27 ) //如果是ESC则退出程序
{
exit ( 0 );
}
else if ( input == 0x20 ) //如果是空格则开始走子
{
if ( Put() ) //如果走子成功则判断胜负
{
victor = Check();
Now = 3 - Now; //轮换当前走子玩家
count++;
if ( victor == 1 ) //如果黑方达到胜利,显示提示文字并等待一次按键,返回胜利信息
{
showText = "黑方获得了胜利!";
Print();
if ( getch() == 0xE0 )
{
getch();
}
return Now;
}
else if ( victor == 2 ) //如果白方达到胜利,显示提示文字并等待一次按键,返回胜利信息
{
showText = "白方获得了胜利!";
Display();
if ( getch() == 0xE0 )
{
getch();
}
return Now;
}
else if ( count == MAXIMUS * MAXIMUS ) //如果回合数达到了棋盘总量,即棋盘充满,即为平局
{
showText = "平局!";
Display();
if ( getch() == 0xE0 )
{
getch();
}
return 0;
}
}
}
else if ( input == 0xE0 ) //如果按下的是方向键,会填充两次输入,第一次为0xE0表示按下的是控制键
{
input = getch(); //获得第二次输入信息
switch ( input ) //判断方向键方向并移动光标位置
{
case 0x4B://
Cx--;
break;
case 0x48:
Cy--;
break;
case 0x4D:
Cx++;
break;
case 0x50:
Cy++;
break;
}
if ( Cx < 0 ) Cx = MAXIMUS - 1; //如果光标位置越界则移动到对侧
if ( Cy < 0 ) Cy = MAXIMUS - 1;
if ( Cx > MAXIMUS - 1 ) Cx = 0;
if ( Cy > MAXIMUS - 1 ) Cy = 0;
}
}
}
int main() //主函数
{
system ( "title 简易五子棋 ——Etsnarl制作" ); //设置标题
system ( "mode con cols=63 lines=32" ); //设置窗口大小
system ( "color E0" ); //设置颜色
while ( 1 ) //循环执行游戏
{
RunGame();
}
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询