小项目:
需要的数据
1、定义棋盘的二维数组
2、定义变量用于记录下棋的坐标
3、定义角色 @ 黑棋 O 白棋 * 空位业务逻辑:
是否需要对数据初始化
for(;;)
{1、清屏、显示棋盘2、落子坐标是否合法、该位置是否有棋子3、判断是否五子连珠4、交换角色5、显示棋盘
}
代码1
#include<stdio.h>
#include<getch.h>
#include<stdlib.h>
int map[15][15]={};
int bx=0,by=0;
int cnt=1,ret=0;int if_end(void);
int color(void);void init(void)
{map[bx][by]=3;
}void show(void)
{system("clear");for(int i=0;i<15;i++){for(int j=0;j<15;j++){switch(map[i][j]){case 0:printf("* ");break; case 1:printf("@ ");break; case 2:printf("O ");break; default:printf("# ");break;}}printf("\n");}printf("棋手1: @ 棋手2: O\n");printf("当前棋手:%d\n",color());
}void move_left(void)
{if(by-1>=0){map[bx][by] -=3;map[bx][by-1] +=3;by--;}
}void move_right(void)
{if(by+1<15){map[bx][by] -=3;map[bx][by+1] +=3;by++;}
}void move_up(void)
{if(bx-1>=0){map[bx][by] -=3;map[bx-1][by] +=3;bx--;}
}void move_down(void)
{if(bx+1<15){map[bx][by] -=3;map[bx+1][by] +=3;bx++;}
}void drop()
{if(map[bx][by]==3){map[bx][by] += color();cnt++;}
}void move(void)
{switch(getch()){case 183:move_up();break;case 184:move_down();break;case 186:move_left();break;case 185:move_right();break;case 48:drop();break;}
}int color(void)
{if(cnt%2){return 1;}return 2;
}int check1(void)
{int num=0;for(int i=0;i<15;i++){if(map[bx][i]==1 || map [bx][i]==4){num++;if(num==5)return 1;}else{num=0;}}for(int i=0;i<15;i++){if(map[bx][i]==2 || map [bx][i]==5){num++;if(num==5)return 1;}else{num=0;}}return 0;
}int check2(void)
{int num=0;for(int i=0;i<15;i++){if(map[i][by]==1 || map [i][by]==4){num++;if(num==5)return 1;}else{num=0;}}for(int i=0;i<15;i++){if(map[i][by]==2 || map [i][by]==5){num++;if(num==5)return 1;}else{num=0;}}return 0;
}int check3(void)
{int i=1,num=0;while(by+i<15 && bx+i<15){if(map[bx][by]-3 != 0 && map[bx+i][by+i]==map[bx][by]-3){num++;i++;}else{i=1;break;}}while(by-i>=0 && bx-i>=0){if(map[bx][by]-3 != 0 && map[bx-i][by-i]==map[bx][by]-3){num++;i++;}else{i=1;break;}}if(num>=4)return 1;return 0;
}int check4(void)
{int i=1,num=0;while(by+i<15 && bx-i>=0){if(map[bx][by]-3 != 0 && map[bx-i][by+i]==map[bx][by]-3){num++;i++;}else{i=1;break;}}while(by-i>=0 && bx+i<15){if(map[bx][by]-3 != 0 && map[bx+i][by-i]==map[bx][by]-3){num++;i++;}else{i=1;break;}}if(num>=4)return 1;return 0;
}int is_end(void)
{if(check1()==1) return 1;if(check2()==1) return 1;if(check3()==1) return 1;if(check4()==1) return 1;return 0;
}int main(int argc,const char* argv[])
{init();while(1){show();if(is_end()==1){map[bx][by] -=3;show();break;}move();}if(cnt%2){printf("白棋win");}else{printf("黑棋win"); }
}
代码2:光标代替字符#
#include<stdio.h>
#include<getch.h>
#include<stdlib.h>
int map[15][15]={};
int bx=7,by=7;
int cnt=1,ret=0;int if_end(void);
int color(void);void show(void)
{system("clear");for(int i=0;i<15;i++){for(int j=0;j<15;j++){switch(map[i][j]){case 0:printf(" *");break; case 1:printf(" @");break; case 2:printf(" O");break; }}printf("\n");}printf("棋手1: @ 棋手2: O\n");printf("当前棋手:%d\n",color());
}void drop()
{if(map[bx][by]==0){map[bx][by] += color();cnt++;}
}void move(void)
{printf("\33[%d;%dH",bx+1,(by+1)*2);switch(getch()){case 183:bx>0&& bx--;break;case 184:bx<14&& bx++;break;case 186:by>0&& by--;break;case 185:by<14&& by++;break;case 48:drop();break;}
}int color(void)
{if(cnt%2){return 1;}return 2;
}int check1(void)
{int num=0;for(int i=0;i<15;i++){if(map[bx][i]==1 || map [bx][i]==4){num++;if(num==5)return 1;}else{num=0;}}for(int i=0;i<15;i++){if(map[bx][i]==2 || map[bx][i]==5){num++;if(num==5)return 1;}else{num=0;}}return 0;
}int check2(void)
{int num=0;for(int i=0;i<15;i++){if(map[i][by]==1 || map [i][by]==4){num++;if(num==5)return 1;}else{num=0;}}for(int i=0;i<15;i++){if(map[i][by]==2 || map [i][by]==5){num++;if(num==5)return 1;}else{num=0;}}return 0;
}int check3(void)
{int i=1,num=0;while(by+i<15 && bx+i<15){if(map[bx][by] != 0 && map[bx+i][by+i]==map[bx][by]){num++;i++;}else{i=1;break;}}while(by-i>=0 && bx-i>=0){if(map[bx][by] != 0 && map[bx-i][by-i]==map[bx][by]){num++;i++;}else{i=1;break;}}if(num>=4)return 1;return 0;
}int check4(void)
{int i=1,num=0;while(by+i<15 && bx-i>=0){if(map[bx][by] != 0 && map[bx-i][by+i]==map[bx][by]){num++;i++;}else{i=1;break;}}while(by-i>=0 && bx+i<15){if(map[bx][by] != 0 && map[bx+i][by-i]==map[bx][by]){num++;i++;}else{i=1;break;}}if(num>=4)return 1;return 0;
}int is_end(void)
{if(check1()==1) return 1;if(check2()==1) return 1;if(check3()==1) return 1;if(check4()==1) return 1;return 0;
}int main(int argc,const char* argv[])
{while(1){show();if(is_end()==1){}move();}if(cnt%2){printf("白棋win");}else{printf("黑棋win"); }
}