首先这是一个用c语言实现的五子棋游戏,实现手法简单,算法思想简单,只用到了一些基础的C的知识。
一:画出界面
首先现在界面上画出棋盘的样子,利用自定义函数 draw_lline()画出我们的所要使用到的棋盘的样子,控制好间隔,距离坐标,颜色等因素即可。
二:定义棋盘棋子状态
定义一个 全局的数组 a[ROW][COL]用来表示棋盘所有的空格状态,没有棋子为0,有黑子或者白子为1或者2,根据玩家的输入将相应 的位置更改为相应的状态。
三:画出带棋子的棋盘
使用自定义函数drow_qizi()判断棋盘上各个格子的状态,并将相应的状态显示在棋盘上,利用前景背景的不同颜色显示白子黑子与空棋盘的各种状态。
四:判断输赢
每当用户落下一子都去判断该子周围的横向纵向,竖向斜向等各个方向是否有五颗棋子相同,如果存在就结束游戏,宣布胜利。
================================================================================================
#include <stdio.h>
//棋盘的规格
#define ROW 20
#define COL 30
#define LTOPX 3//起始坐標x
#define LTOPY 3//起始坐標y
//一组颜色的定义
enum {
BLACK,RED,GREEN,YELLOW,BLUE,PURPLE,DEEPGREEN,WHITE
};
int a[ROW][COL]={0};
/*设置字符的前景色*/
void set_front_col(int n)
{
printf("\033[3%dm", n);
}
/*设置字符的背景色*/
void set_hou_col(int n)
{
printf("\033[4%dm", n);
}
/*设置光标的x,y坐标*/
void set_xy_pos(int x, int y)
{
printf("\033[%d;%dH", y, x);
}
/*从光标位置x,y处从左向右画由字符c组成的水平线,线长为len*/
void draw_hline(int x, int y, int len, char c)
{
int i;
for (i = 0; i < len; i++) {
set_xy_pos(x+i, y);
printf("%c", c);
}
}
/*从光标位置x,y处从上向下画由字符c组成的垂直线,线长为len*/
void draw_lline(int x, int y, int len, char c)
{
int i;
for (i = 0; i < len; i++) {
set_xy_pos(x, y+i);
printf("%c", c);
}
}
void Wether_Success(int x,int y);//判断横向与竖向是否成功
void Wether_Success1(int x,int y);//判断斜边是否成功
void shuru(int m)///輸入棋子坐標
{
int x,y;
set_xy_pos(COL*3+4, 4);
if(m==2)
printf("請輸入要下白棋子的坐標:");
else
printf("請輸入要下黑棋子的坐標:");
scanf("%d %d",&x,&y);
if((x<0)||(x>=COL)||(y<0)||(y>=ROW))
{
set_xy_pos(COL*3+4, ROW*2);
printf("輸入坐標錯誤,請重新輸入!");
shuru(m);
}else
{
if(a[x][y]==0)
{
a[x][y]=m;
Wether_Success(x,y);
Wether_Success1(x,y);
}
else
{
set_xy_pos(COL*3+4, ROW*2);
printf("輸入重復,請重新輸入!");
shuru(m);
}
}
}
//画出棋子
void drow_qizi()
{
int i,j;
for (i = 0; i < COL+1; i++) //畫出數組中的棋子
for (j = 0; j <ROW+1; j++)
{
if(a[i][j]==1)
{
set_hou_col(BLACK);
set_xy_pos(i*3+4, j*2+4);
printf("%c", '[');
set_xy_pos(i*3+5, j*2+4);
printf("%c", ']');
}
if(a[i][j]==2)
{
set_hou_col(WHITE);
set_xy_pos(i*3+4, j*2+4);
printf("%c", '[');
set_xy_pos(i*3+5, j*2+4);
printf("%c", ']');
}
}
}
//画出棋盘
void DROW_qipan()
{
int i,j;
set_front_col(RED);
set_hou_col(BLUE);
for (i = 0; i < ROW+1; i++) {//畫出行線與數字標號
if(i!=20)
{
set_xy_pos(LTOPX-2, LTOPY+2*i+1);
printf("%d", i);
}
draw_hline(LTOPX, LTOPY+2*i, 3*COL+1, '-');
}
for (i = 0; i <COL+1; i++) {//畫出類線與數字標號
if(i!=30)
{
set_xy_pos(LTOPX+3*i+1, LTOPY-2);
printf("%d", i);
}
draw_lline(LTOPX+3*i,LTOPY,2*ROW+1 , '|');
}
}
void DROW()
{
system("clear");
DROW_qipan();//畫出棋盤
drow_qizi();//畫出棋子
}
//判斷橫向戍向是否成功
void Wether_Success(int x,int y)
{
int i=1,n;
for(n=1;n<=4;n++)
{ if((y+n)<COL){
if(a[x][y+n]==a[x][y])
{
i++;
}
else
{
for(n=1;n<=4;n++)
{
if((y-n)>=0)
{
if(a[x][y-n]==a[x][y])
{
i++;
}else
{
n=5;
}
}
}
}
}
}
if(i>=5)
{
DROW();
set_xy_pos(COL*3+4, ROW*2);
printf("sucess!\n");
exit(0);
}
for(i=1,n=1;n<=4;n++)
{
if((x+n)<ROW){
if(a[x+n][y]==a[x][y])
{
i++;
}
else
{
for(n=1;n<=4;n++)
{
if(x-n>=0){
if(a[x-n][y]==a[x][y])
{
i++;
}else
{
n=5;
}
}
}
}
}
}
if(i>=5)
{
DROW();
set_xy_pos(COL*3+4, ROW*2);
printf("sucess!\n");
exit(0);
}
}
void Wether_Success1(int x,int y)//判斷斜向是否成功
{
int i=1,n;
for(n=1;n<=4;n++)
{ if((y+n)<COL&&(x+n<ROW)){
if(a[x+n][y+n]==a[x][y])
{
i++;
}
else
{
for(n=1;n<=4;n++)
{
if((y-n)>=0&&(x-n>=0))
{
if(a[x-n][y-n]==a[x][y])
{
i++;
}else
{
n=5;
}
}
}
}
}
}
if(i>=5)
{
DROW();
set_xy_pos(COL*3+4, ROW*2);
printf("sucess!\n");
exit(0);
}
for(i=1,n=1;n<=4;n++)
{
if((x+n)<ROW&&(y-n)>=0){
if(a[x+n][y-n]==a[x][y])
{
i++;
}
else
{
for(n=1;n<=4;n++)
{
if(x-n>=0&&(y+n)<COL){
if(a[x-n][y+n]==a[x][y])
{
i++;
}else
{
n=5;
}
}
}
}
}
}
if(i>=5)
{
DROW();
set_xy_pos(COL*3+4, ROW*2);
printf("sucess!\n");
exit(0);
}
}
int main(void)
{
int i=1;
while(1)
{
DROW();
set_hou_col(BLUE);
shuru(i);
if(i==1)i=2;
else i=1;
}
return 0;
}