小项目:五子棋
需要的数据:
1、定义字符数组棋盘 15*15
2、定义变量用于记录落子的位置
3、定义一个变量记录棋子角色 黑棋 '@' 白棋 '$'
业务逻辑:
定义需要数据
是否需要对数据进行初始化
for(;;)
{
1、清理屏幕、显示棋盘
2、落子
坐标要合法、该位置不能有棋子
否则继续重新落子
3、检查是否五子连珠
是,结束游戏
4、交换角色
}
#include#include #include //棋盘数组 char board[15][15]={}; //棋子坐标 int man_x=0,man_y=0; //棋子 黑“@” 白“$” int man='@'; //初始化棋盘 void initialize(void); //显示棋盘 void print_board(void); //落子 void drop(void); //检查是否五子连珠 bool is_win(void); int is_win_count(int num1,int num2); int main(int argc,const char* argv[]) { initialize(); for(int i=0;i<225;i++) { print_board(); drop(); if(is_win()) { print_board(); printf("%c赢,游戏结束",board[man_x-1][man_y-1]); return 0; } //交换角色 man = '@'==man?'$':'@'; } } void initialize(void) //初始化棋盘 { for(int i=0;i<15;i++) { for(int j=0;j<15;j++) { board[i][j]='*'; } } } void print_board(void) //显示棋盘 { system("clear"); printf("0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15n"); for(int i=0;i<15;i++) { printf("%-2d ",i+1); for(int j=0;j<15;j++) { printf("%c ",board[i][j]); } printf("n"); } } void drop(void) //落子 { printf("请%c输入棋子的位置:",man); scanf("%d%d",&man_x,&man_y); for(;;) { //检验坐标是否合法 if(man_x>15 || man_x<1 || man_y>15 || man_x<1) { printf("该坐标不合法,请重新输入%c的位置:",man); scanf("%d%d",&man_x,&man_y); } //检查是否有棋子 else if(board[man_x-1][man_y-1] != '*') { printf("该做标已经被占据,请重新输入%c的位置:",man); scanf("%d%d",&man_x,&man_y); } else { board[man_x-1][man_y-1]=man; break; } } } bool is_win(void) //检查是否五子连珠 { if(is_win_count(1,0)+is_win_count(-1,0)>=4) return true; if(is_win_count(0,1)+is_win_count(0,-1)>=4) return true; if(is_win_count(1,1)+is_win_count(-1,-1)>=4) return true; if(is_win_count(-1,1)+is_win_count(1,-1)>=4) return true; return false; } int is_win_count(int num1,int num2) { int count=0; int x=num1; int y=num2; for(;;) { if(man_x-1+x<0 ||man_x-1+x>=15||man_y-1+y<0||man_y-1+y>=15) { break; } if(board[man_x-1+x][man_y-1+y]==board[man_x-1][man_y-1]) { count++; x=x+num1; y=y+num2; } else { break; } } return count;
优化:引入了光标
1 #include2 #include 3 #include 4 #include 5 6 //棋盘数组 7 char board[15][15]={}; 8 //棋子坐标 9 int man_x=7,man_y=7; 10 //棋子 黑“@” 白“$” 11 int man='@'; 12 13 //初始化棋盘 14 void initialize(void); 15 16 //显示棋盘 17 void print_board(void); 18 19 //落子 20 void drop(void); 21 22 //检查是否五子连珠 23 bool is_win(void); 24 int is_win_count(int num1,int num2); 25 26 int main(int argc,const char* argv[]) 27 { 28 initialize(); 29 for(int i=0;i<225;i++) 30 { 31 print_board(); 32 drop(); 33 if(is_win()) 34 { 35 print_board(); 36 printf("%c赢,游戏结束",board[man_x][man_y]); 37 return 0; 38 } 39 //交换角色 40 man = '@'==man?'$':'@'; 41 } 42 } 43 44 void initialize(void) //初始化棋盘 45 { 46 for(int i=0;i<15;i++) 47 { 48 for(int j=0;j<15;j++) 49 { 50 board[i][j]='*'; 51 } 52 53 } 54 55 void print_board(void) //显示棋盘 56 { 57 system("clear"); 58 for(int i=0;i<15;i++) 59 { 60 for(int j=0;j<15;j++) 61 { 62 printf(" %c",board[i][j]); 63 } 64 printf("n"); 65 } 66 } 67 68 void drop(void) //落子 69 { 70 printf("请%c落子",man); 71 for(;;) 72 { 73 printf("33[%d;%dH",man_x+1,(man_y+1)*2); 74 switch(getch()) 75 { 76 case 183: man_x>0 && man_x--; break; 77 case 184: man_x<14 && man_x++; break; 78 case 186: man_y>0 && man_y--; break; 79 case 185: man_y<14 && man_y++; break; 80 case 10: 81 if(board[man_x][man_y]=='*') 82 { 83 board[man_x][man_y]=man; 84 return; 85 } 86 break; 87 } 88 } 89 } 90 91 92 bool is_win(void) //检查是否五子连珠 93 { 94 if(is_win_count(1,0)+is_win_count(-1,0)>=4) 95 return true; 96 if(is_win_count(0,1)+is_win_count(0,-1)>=4) 97 return true; 98 if(is_win_count(1,1)+is_win_count(-1,-1)>=4) 99 return true; 100 if(is_win_count(-1,1)+is_win_count(1,-1)>=4) 101 return true; 102 return false; 103 } 104 105 int is_win_count(int num1,int num2) 106 { 107 int count=0; 108 int x=num1; 109 int y=num2; 110 for(;;) 111 { 112 if(man_x+x<0 ||man_x+x>=15||man_y+y<0||man_y+y>=15) 113 { 114 break; 115 } 116 if(board[man_x+x][man_y+y]==board[man_x][man_y]) 117 { 118 count++; 119 x=x+num1; 120 y=y+num2; 121 } 122 else 123 { 124 break; 125 } 126 } 127 return count; 128 }
暑期编程PK赛 得CSDN机械键盘等精美礼品!



