
五子棋
需要的数据:
1、定义字符数组的棋盘15*15
2、定义变量用于记录落子的位置
3、定一个变量记棋子变量 黑棋‘@’ 白棋‘$’
业务逻辑:
定义数据
是否需要对数据进行初始化
for(;;)
{
1、清理屏幕、显示棋盘
2、落子
判断是否能下,是否合法,不能有其他棋子
否子继续重新落子
3、检查是否五子连珠
是,结束游戏
4、交换角色
}
#include#include #include #include // 棋盘数组 char board[15][15]; // 棋子坐标 char key_x = 7,key_y = 7; // 角色 黑'@' 白'$' char role = '@'; // 初始化棋盘 void init_board(void) { for(int i=0; i<15; i++) { for(int j=0; j<15; j++) { board[i][j] = '*'; } } } // 显示棋盘 void show_board(void) { system("clear"); for(int i=0; i<15; i++) { for(int j=0; j<15; j++) { printf(" %c",board[i][j]); } printf("n"); } } // 落子 void get_key(void) { printf("请%c落子",role); for(;;) { printf("33[%hhd;%hhdH",key_x+1,(key_y+1)*2);//位置 switch(getch()) { case 183: key_x>0 && key_x--; break; case 184: key_x<14 && key_x++;break; case 186: key_y>0 && key_y--; break; case 185: key_y<14 && key_y++;break; case 10: if('*' == board[key_x][key_y])//回车落子 { board[key_x][key_y] = role; return; } break; } } } // 检查是否五子连珠 bool is_win(void) { // 左上+右下 int cnt = 0; // 左上 for(int x=key_x-1,y=key_y-1; x>=0 && y>=0; x--,y--) { if(board[x][y] == role) { cnt++; } else { break; } } // 右下 for(int x=key_x+1,y=key_y+1; x<15 && y<15; x++,y++) { if(board[x][y] == role) { cnt++; } else { break; } } if(4 <= cnt) { return true; } cnt = 0; // 上下(思路同上) // 左右 // 右上+坐下 return false; } int main(int argc,const char* argv[]) { init_board(); for(;;) { show_board(); get_key(); if(is_win()) { show_board(); printf("%c胜利n",role); return 0; } // 交换角色 role = '@'==role?'$':'@'; } }
递归:
函数自己调用自己的 这种行为叫做函数递归,可能产生死循环
递归是可以实现分治的这种算法,把一个复杂的大问题,分解成若干个相同的小问题,知道所有问题全部解决
如何写好递归(全局眼光):
1、写好出口
2、解决一个小问题
3、调用自己
练习一:计算前n项斐波那锲 数列
#include// 计算第n个非波那切数列的值 int fibo(int n) { if(1 == n || 2 == n) return 1; return fibo(n-1) + fibo(n-2); } int main(int argc,const char* argv[]) { printf("%dn",fibo(6)); }
递归函数每一次调用都会在栈内存产生一份自己的拷贝,直到执行到达出口,才会释放这一层递归函数,因此与循环相比递归非常耗费内存、速度很慢,如果能用循环解决的问题就不要使用递归
递归的优缺点:
1、好理解、思路清晰(不要跟着思考)
2、很好地解决非线性问题
3、耗内存、速度很慢
练习二:使用递归模拟汉诺塔的移动过程
#includevoid hanio(int n,char s,char m,char e) { if(1 == n) { printf("1 from %c to %cn",s,e); return; } hanio(n-1,s,e,m); printf("%d from %c to %cn",n,s,e); hanio(n-1,m,s,e); } int main(int argc,const char* argv[]) { hanio(8,'A','B','C'); }
个人感受:递归比较难使用,会不由自主的跟着逻辑下去,然后就不知道怎么实现了