棋盘15*15
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <getch.h>
// 棋盘数组
char board[15][15];
// 记录棋子位置的变量,也用作光标位置
char key_r = 7, key_c = 7;
// 记录角色 @ #
char role = '@';
// 初始化棋盘
void init_board(void)
{
for(int r=0; r<15; r++)
{
for(int c=0; c<15; c++)
{
board[r][c] = '*';
}
}
}
// 显示棋盘
void show_board(void)
{
system("clear");
for(int r=0; r<15; r++)
{
for(int c=0; c<15; c++)
{
// 由于终端的行间距较大,列间距较小
printf(" %c",board[r][c]);
}
printf("\n");
}
printf(" -----------请%c落子-----------\n",role);
}
// 落子
void input_key(void)
{
// 方向键移动光标,按回车键在光标处落子
for(;;)
{
// 设置光标位置
printf("\33[%hhd;%hhdH",key_r+1,(key_c+1)*2);
// 获取方向键、回车键
switch(getch())
{
case 183:
if(0 < key_r)
key_r--;
break;
case 184:
if(14 > key_r)
key_r++;
break;
case 185:
if(14 > key_c)
key_c++;
break;
case 186:
if(0 < key_c)
key_c--;
break;
case 10:
if('*' == board[key_r][key_c])
{
board[key_r][key_c] = role;
return;
}
}
}
}
// 以[key_r][key_c]为起点,以or、oc为前进方向,计算相同棋子的数量
int count_key(int or,int oc)
{
int count = 0;
for(int r=key_r+or,c=key_c+oc; r>=0&&r<15 && c>=0&&c<15; r+=or,c+=oc)
{
if(role == board[r][c])
count++;
else
return count;
}
}
// 检查是否有五子
bool check_board(void)
{
if(count_key(0,-1)+count_key(0,+1) >= 4)
return true;
if(count_key(-1,0)+count_key(+1,0) >= 4)
return true;
if(count_key(-1,-1)+count_key(+1,+1) >=4)
return true;
if(count_key(-1,+1)+count_key(+1,-1) >=4)
return true;
return false;
}
int main(int argc,const char* argv[])
{
// 棋盘初始化
init_board();
// 进入游戏
for(;;)
{
// 显示棋盘
show_board();
// 落子
input_key();
// 检查是否有五子产生
if(check_board())
{
show_board();
printf("恭喜%c胜利,游戏结束!\n",role);
return 0;
}
// 切换角色
if('@' == role)
role = '#';
else
role = '@';
}
}