小項目:
需要的數據
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"); }
}