我们今天要分享的题目是三子棋,相信大家对于三子棋并不陌生
我们在设计三子棋的时候,脑袋一定不要混,不要害怕
做任何题目脑袋里要慢慢形成框架
比如本题:三子棋
游戏开始要有游戏界面,进入游戏界面时候,要选择开始游戏(1),退出游戏(0)
当我们选择开始游戏的时候要有游戏内的棋盘,所以要先打印一个棋盘
我们脑海中想到的是棋盘,这里拿三子棋举例
3*3的网格结构所以需要的符号有---,这个用来挡住空格 的下部分,|这个用来挡住空格的两侧。
当我们设计好棋盘之后,肯定是填棋盘,放棋子
我们放完电脑放
在每次放完之后需要判断输赢,平局和继续比赛。
判断输赢无非就是,行是三个,列是三个,两个对角线是三个
平局就是我们在判断输赢之后并没有结论
这时候如果棋盘没有空格就是满了,就是平局
若还有则游戏继续。
我们在分析完题目之后,话不多说直接上代码
我们这个代码可以实现N子棋,并不局限于三子棋,具体改变可以改变宏定义中的大小。
#include <stdio.h> //输入输出函数头文件 #include <stdlib.h> //rand头文件 #include <time.h> //time头文件 #define Line 5 //宏定义line为3 #define Row 5 //宏定义row为3 //初始化棋盘 void Board_1(char ch[Line][Row],int line,int row) { int i = 0; int j = 0; for(i=0;i<line;i++) { for(j=0;j<row;j++) { ch[i][j] = ' '; //给每一个数组中的元素赋值个空格 } } } //打印棋盘 void Board_2(char ch[Line][Row],int line,int row) { int i = 0; int j = 0; for(i=0;i<line;i++) { for(j=0;j<row;j++) { if(j<row-1) { printf(" %c |",ch[i][j]); } else printf(" %c ",ch[i][j]); } printf("\n"); if(i<line-1) { for(j=0;j<row;j++) { if(j<row-1) { printf("---|"); } else printf("---"); } printf("\n"); } } } //玩家下棋 void People(char ch[Line][Row],int line,int row) { int i = 0; int j = 0; while(1) { printf("玩家下棋:>\n"); scanf("%d %d",&i,&j); if((i>=1&&i<=line)&&(j>=1&&j<=row)) { if(ch[i-1][j-1]!=' ') { printf("输入的坐标被占用,请重新输入:\n"); continue; } else { ch[i-1][j-1] = '*'; Board_2(ch,Line,Row); break; } } else { printf("输入坐标错误,请重新输入:\n"); continue; } } } //电脑下棋 void Computer(char ch[Line][Row],int line,int row) { printf("电脑下棋:> \n"); int x = 0; int y = 0; while(1) { x = rand()%line; //随机数生成 y = rand()%row; if(ch[x][y]== ' ') { ch[x][y] = 'a'; Board_2(ch,Line,Row); break; } } } //判断是否下满,下满了就平局 int Is_full(char ch[Line][Row],int line,int row) { int i = 0; int j = 0; for(i=0;i<line;i++) { for(j=0;j<row;j++) { if(ch[i][j]==' ') { return 1; } } } return 0; } //判断输赢 char Win_or(char ch[Line][Row],int line,int row) { int i = 0; int j = 0; int flag3 = 0; int flag4 = 0; int flag5 = 0; for(i=0;i<line;i++) //行 { int flag1 = 0; for(j=0;j<row-1;j++) { if(ch[i][j]!=ch[i][j+1]) { flag1 = 1; break; } } if(flag1==0) { if(ch[i][0]==' ') { continue; } else return ch[i][0]; } } for(j=0;j<row;j++)//列 { int flag2 = 0; for(i=0;i<line-1;i++) { if(ch[i][j]!=ch[i+1][j]) { flag2 = 1; break; } } if(flag2==0) { if(ch[0][j]==' ') { continue; } else return ch[0][j]; } } for(i=0,j=0,flag3=0;i<line-1;i++,j++)//对角线左上右下 { if(ch[i][j]!=ch[i+1][j+1]) { flag3 = 1; break; } } if(flag3==0) return ch[0][0]; for(i=line-1,j=row-1,flag4=0;i>0;i--,j--)//对角线左下右上 { if(ch[i][j]!=ch[i-1][j-1]) { flag4 = 1; break; } } if(flag4==0) return ch[0][0]; int full = Is_full(ch,Line,Row); if(full==1) { return 'C'; } return 'Q'; } void Game () { char ret = 0; char ch[Line][Row] = {0}; Board_1(ch,Line,Row);//初始化棋盘 Board_2(ch,Line,Row);//打印棋盘 while(1) { People(ch,Line,Row);//玩家下棋 ret = Win_or(ch,Line,Row);//比较比赛战况 if(ret != 'C') break; Computer(ch,Line,Row);//电脑下棋 ret = Win_or(ch,Line,Row); if(ret != 'C') break; } if(ret == '*') printf("恭喜你赢得比赛 (*^o^*)\n"); if(ret == 'a') printf("你输了 ╮( ̄▽ ̄"")╭\n"); if(ret == 'Q') printf("平局,不分伯仲\n"); } //菜单 void Menu() { int a = 0; do { printf("*********************\n"); printf("********1.play*******\n"); printf("********0.exit*******\n"); printf("*********************\n"); printf("1-开始游戏 0-退出游戏 \n"); scanf("%d",&a); if(a==1) { printf("开始比赛!!!\n"); Game(); } else if(a==0) { printf("退出游戏成功!!!\n"); break; } else { printf("输入错误,请重新输入:> "); continue; } } while (a); } int main () { srand((unsigned int)time(NULL));//写rand之前要写这个 Menu(); return 0; }