对于很多C语言学习者,做一个五子棋游戏是比较困难,因为没有经验,下面博主带着这位一起来开发这一块人人都想学习的五子棋大战游戏吧,当然想了解更过,学习更多C/C++编程开发教程、入门、大型项目视频教程可以加QQ群:569268376,好啦,废话不多说,直接上代码
#include
#include
#include
#include
#include
//常量
#define CHECKERBOARDSIZE 15 ///棋盘大小
//全局变量
int g_count = 0; ///游戏回合数
int g_checkboard[CHECKERBOARDSIZE][CHECKERBOARDSIZE]; ///存储对局数据
int g_cursorX, g_cursorY; ///当前光标位置
int g_currentGamer; ///当前下子玩家 1:黑子;2:白子
//全局函数
int RunGame(); ///进行整个对局,返回赢家信息
void Initialize(); ///初始化一个对局
void DrawCheckerboard();///绘制棋盘
int Put(); ///在当前光标位置下子,如果非空,则表示下子失败,返回0
int Check(); ///判断胜负,即判断当前走子,五子连珠
char* GetStyle(int x,int y);///获取棋盘指定坐标点位置的字符
int main()
{
更多精彩教程,视频教学、源码分享请加入QQ群:569268376
SetConsoleTitle(L"五子棋人人对战"); //设置窗口标题
system("mode con cols=31 lines=17");//设置窗口大小
//控制台 color -help
system("color 80");//设置颜色
while (1)
{
//循环执行游戏
RunGame();
}
return 0;
}
///进行整个对局,返回赢家信息
int RunGame()
{
int nInput; //输入变量
int nWinner; //赢家信息
Initialize(); //初始化对局
//死循环,胜利跳出循环
while (1)
{
DrawCheckerboard();//绘制棋盘
nInput = getch();//等待键盘输入
switch (nInput)
{
case 27:///ESC
exit(0);
break;
case 32://空格 :开始下子
{
//下子,判断是否成功
if (Put())
{
//判断输赢
nWinner = Check();
g_currentGamer = 3 - g_currentGamer; //更新此时玩家
g_count++;
//黑子胜利
if (nWinner == 1)
{
MessageBox(NULL, L"黑方获得胜利",L"提示",MB_OK);
DrawCheckerboard();//打印棋盘
if (getch() == 224)
{
getch();
}
return g_currentGamer;
}
//白子胜利
else if (nWinner == 2)
{
MessageBox(NULL, L"白方获得胜利", L"提示", MB_OK);
DrawCheckerboard();//打印棋盘
if (getch() == 224)
{
getch();
}
return g_currentGamer;
}
//回合数等于棋盘总数,平局
else if (g_count == CHECKERBOARDSIZE * CHECKERBOARDSIZE)
{
MessageBox(NULL, L"平局", L"提示", MB_OK);
DrawCheckerboard();//打印棋盘
if (getch() == 224)
{
getch();
}
return g_currentGamer;
}
}
break;
}
case 224://按下的是方向键
{
nInput=getch();
switch (nInput)
{
case 75: g_cursorY--; break;//←
case 72: g_cursorX--; break;//↑
case 77: g_cursorY++; break;//→
case 80: g_cursorX++; break;//↓
}
//光标越界则移动到另一侧
if (g_cursorX < 0) g_cursorX = CHECKERBOARDSIZE - 1;
if (g_cursorY < 0) g_cursorY = CHECKERBOARDSIZE - 1;
if (g_cursorX > CHECKERBOARDSIZE - 1) g_cursorX = 0;
if (g_cursorY > CHECKERBOARDSIZE - 1) g_cursorY = 0;
}
}
}
return 0;
}
///初始化一个对局
void Initialize()
{
//g_szShowText = ""; //重置显示信息
g_count = 0; //游戏回合数清零
for (int i = 0; i < CHECKERBOARDSIZE;i++)
{
for (int j = 0; j < CHECKERBOARDSIZE;j++)
{
g_checkboard[i][j] = 0;//初始化
}
}
//重置光标到中间位置
g_cursorX = CHECKERBOARDSIZE / 2;
g_cursorY = CHECKERBOARDSIZE / 2;
//重置当前位黑方下子
g_currentGamer = 1;
}
///获取棋盘指定坐标点位置的字符
char* GetStyle(int x, int y)//行,列
{
//光标
if (x == g_cursorX && y == g_cursorY)
return "╬";
if (g_checkboard[x][y] == 1)//黑子
return "●";
else if (g_checkboard[x][y] == 2)//白子
return "○";
else if (x == 0 && y == 0)
return "┏";
else if (x == CHECKERBOARDSIZE - 1 && y == 0)
return "┗";
else if (x == 0 && y == CHECKERBOARDSIZE - 1)
return "┓";
else if (x == CHECKERBOARDSIZE - 1 && y == CHECKERBOARDSIZE - 1)
return "┛";
else if (x == 0)
return "┳";
else if (y == 0)
return "┣";
else if (x == CHECKERBOARDSIZE - 1)
return "┻";
else if (y == CHECKERBOARDSIZE - 1)
return "┫";
else
return "┼";
}
///绘制棋盘
void DrawCheckerboard()
{
//清屏
system("cls");
for (int i = 0; i < CHECKERBOARDSIZE;i++)//行
{
for (int j = 0; j < CHECKERBOARDSIZE;j++)//列
{
//光标
if (i == g_cursorX && j == g_cursorY)
printf( "╬");
if (g_checkboard[i][j] == 1)//黑子
printf( "●");
else if (g_checkboard[i][j] == 2)//白子
printf( "○");
else if (i == 0 && j == 0)
printf( "┏");
else if (i == CHECKERBOARDSIZE - 1 && j == 0)
printf( "┗");
else if (i == 0 && j == CHECKERBOARDSIZE - 1)
printf( "┓");
else if (i == CHECKERBOARDSIZE - 1 && j == CHECKERBOARDSIZE - 1)
printf( "┛");
else if (i == 0)
printf( "┳");
else if (j == 0)
printf( "┣");
else if (i == CHECKERBOARDSIZE - 1)
printf( "┻");
else if (j == CHECKERBOARDSIZE - 1)
printf( "┫");
else
printf( "┼");
}
printf("\n");
}
}
///在当前光标位置下子,如果非空,则表示下子失败,返回0
int Put()
{
//如果该位置没有下子
if (g_checkboard[g_cursorX][g_cursorY] == 0)
{
g_checkboard[g_cursorX][g_cursorY] = g_currentGamer;//下黑子,或下白字
return 1;
}
else
{
return 0;
}
}
///判断胜负,即判断当前走子,五子连珠
int Check()
{
int nHorizontal = 1;//水平方向
int nVertical = 1; //竖直方向
int nPosiOblique = 1; //正斜方向 (往右下 ,左上)
int nSkewDirectory = 1; //反斜方向
//第一种情况:
//竖直方向 向下检查
for (int i = 1; i < 5;i++)
{
if (g_cursorY + i < CHECKERBOARDSIZE && g_checkboard[g_cursorX][g_cursorY + i] == g_currentGamer)
nVertical++;//
else
break;
}
//竖直方向 向上检查
for (int i = 1; i < 5;i++)
{
if (g_cursorY - i > 0 && g_checkboard[g_cursorX][g_cursorY - i] == g_currentGamer)
nVertical++;//
else
break;
}
if (nVertical >= 5)
return g_currentGamer;//当前下子玩家赢
//第二种情况:
//向右检查
for (int i = 1; i < 5; i++)
{
if (g_cursorX + i < CHECKERBOARDSIZE && g_checkboard[g_cursorX + i][g_cursorY] == g_currentGamer)
nHorizontal++;
else
break;
}
//向左检查
for (int i = 1; i < 5; i++)
{
if (g_cursorX - i > 0 && g_checkboard[g_cursorX - i][g_cursorY] == g_currentGamer)
nHorizontal++;
else
break;
}
if (nHorizontal >= 5)
return g_currentGamer;
//第三种情况:
//右下扫描
for (int i = 1; i < 5;i++)
{
if (g_cursorX + i < CHECKERBOARDSIZE && g_cursorY + i < CHECKERBOARDSIZE && g_checkboard[g_cursorX + i][g_cursorY + i] == g_currentGamer)
nPosiOblique++;
else
break;
}
//往左上扫描
for (int i = 1; i < 5; i++)
{
if (g_cursorX - i > 0 && g_cursorY - i > 0 && g_checkboard[g_cursorX - i][g_cursorY - i] == g_currentGamer)
nPosiOblique++;
else
break;
}
if (nPosiOblique >= 5)
return g_currentGamer;
//第四种情况:
//往右上扫描
for (int i = 1; i < 5;i++)
{
if (g_cursorX + i < CHECKERBOARDSIZE && g_cursorY - i > 0 && g_checkboard[g_cursorX + i][g_cursorY - i] == g_currentGamer)
nSkewDirectory++;
else
break;
}
//往左下扫描
for (int i = 1; i < 5; i++)
{
if (g_cursorX - i > 0 && g_cursorY + i < CHECKERBOARDSIZE && g_checkboard[g_cursorX - i][g_cursorY + i] == g_currentGamer)
nSkewDirectory++;
else
break;
}
if (nSkewDirectory >= 5)
return g_currentGamer;
return 0;
}
好啦,这就是我们做的五子棋游戏。