#include<stdio.h> #include<stdbool.h> #include<stdlib.h> #include<getch.h> char board[15][15]; //棋盘 char role = '@'; //角色 char key_x,key_y; //下子坐标 //初始化棋盘 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; } } } } //计算某个小方向上有多少个连续棋子 int count_key(int ox,int oy) // 左:ox=-1 右:ox=1 上: oy=-1 下: oy=1 { int count = 0; for(int x=key_x+ox,y=key_y+oy; 0<=x && 14>=x && 0<=y && 14>=y; x+=ox,y+=oy) { if(board[x][y] == role) count++; else break; } return count; } //判断是否五子连珠 bool is_win(void) { if(4<=count_key(-1,0)+count_key(1,0)) return true; //横 if(4<=count_key(0,-1)+count_key(0,1)) return true; //竖 if(4<=count_key(-1,-1)+count_key(1,1)) return true; //左对角线 if(4<=count_key(-1,1)+count_key(1,-1)) return true; //右对角线 return false; } int main(int argc,const char* argv[]) { init_board(); for(int i=0; i<225; i++) { show_board(); get_key(); if(is_win()) { show_board(); printf("游戏结束,恭喜%c胜利!\n",role); return 0; } //交换角色 role = role=='@'? '$' : '@'; } printf("和棋!\n"); }
标签:&&,落子,int,五子棋,break,oy,board,key,升级版 From: https://www.cnblogs.com/ljf-0804/p/17587700.html