目录
三子棋规则
将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了
三子棋游戏运行步骤
一、代码构成
游戏模块图
main函数在test.c文件中,test.c文件里编写测试游戏逻辑,game.c里进行函数的实现,game.h文件里进行函数的声明。通过#include "game.h"来调用。
如何在vs编译器中建立game.c和game.h文件
建立test.c文件和game.c文件
建立game.h头文件
新建完文件
二、游戏代码和讲解
程序步骤
- 程序运行进入游戏菜单栏
- 定义一个char类型的数组
- 初始化棋盘
- 打印空棋盘(九宫格)
- 玩家下棋函数
- 电脑下棋函数
- 判断游戏状态函数
1.建立菜单(游戏选择界面)
voidmenu() { printf("***********************\n"); printf("******1. 开始游戏******\n"); printf("******0. 退出游戏******\n"); printf("***********************\n"); }
这样就拥有了游戏开始界面
2.用switch语句来实现选择
do { menu(); printf("请选择|:"); scanf("%d", &input); switch (input) { case1: /*printf("游戏开始\n");*/game(); break; case0: printf("退出游戏\n"); break; default: printf("输入错误,重新输入!\n"); break; } } while (input);
这里定义一个整形变量 当input为0时,跳出do...while循环。
输入1 进入游戏
输入0 退出游戏
输入其他数字 则输出( 输入错误,重新输入 ) input不为0,则继续进入循环。
3.定义一个char类型的数组
在game.h中定义 ROW COL 为3 方便后期的调整
在game函数里定义一个char类型的素组
charboard[ROW][COL] = { 0 };
记得引用game.h的头文件。
4.初始化棋盘
头文件game.h 声明
voidNewRoard(charboard[ROW][COL], introw, intcol);
在test.c 调用 NewRoard 函数
//棋盘初始化NewRoard(board, ROW, COL);
在game.c中完成函数的实现
voidNewRoard(charboard[ROW][COL], introw, intcol) { inti=0; for (i=0; i<row; i++) { intj=0; for (j=0; j<col; j++) { board[i][j] =' '; } } }
5.打印棋盘函数(九宫格)
九宫格由符号来实现 横线使用 --- 竖线使用 |
代码顺序(头文件、test.c、game.c)
voidPriRoard(charboard[ROW][COL], introw, intcol);
PriRoard(board, ROW, COL);
voidPriRoard(charboard[ROW][COL], introw, intcol) { inti=0; for (i=0; i<row; i++) { intj=0; for (j=0; j<col; j++) { printf(" %c ", board[i][j]); if(j<col-1) printf("|"); } printf("\n"); if (i<row-1) { intj=0; for (j=0; j<row; j++) { printf("---"); if(j<row-1) printf("|"); } } printf("\n"); } }
6.玩家下棋
由于玩家不一定是程序员,不知道数组起始是0,也为了方便游玩的时候使用方便,玩家输入1-3 之间的两个数字进入 函数编写时要进行减运算
代码顺序(头文件、test.c、game.c)
voidPlayRoard(charboard[ROW][COL], introw, intcol);
PlayRoard(board, ROW, COL);
voidPlayRoard(charboard[ROW][COL], introw, intcol) { intx=0; inty=0; printf("玩家请下棋\n"); while (1) { printf("玩家请输入坐标:>"); scanf("%d %d", &x, &y); if (x>=1&&x<=row&&y>=1&&y<=row) { if (board[x-1][y-1] ==' ') { board[x-1][y-1] ='*'; break; } else { printf("位置已被占用,请重新输入\n"); } } else { printf("输入错误,重新输入\n"); } } }
7.电脑下棋
这里使用srand函数来生成随机数
需要用到 #include #include 两个库函数
用rand进行调用,将rand的随机数%(模)3得到0-2随机数
代码顺序(头文件、test.c、game.c)
voidCompRoard(charboard[ROW][COL], introw, intcol);
CompRoard(board, ROW, COL);
voidCompRoard(charboard[ROW][COL], introw, intcol) { intx=0; inty=0; printf("电脑下棋\n"); while (1) { intx=rand() %row; inty=rand() %col; if (board[x][y] ==' ') { board[x][y] ='#'; break; } } }
8.判断游戏状态函数
判断游戏状态可以分为 玩家赢 电脑赢 平局(棋盘满) 继续
编写一个函数 当玩家赢的时候返回 " * "
当电脑赢的时候返回 " # "
当平局的时候返回 " Q "
当继续的时候返回 " C "
代码顺序(test.c、game.c)
IsWin(board, ROW, COL);
intIsFull(charboard[ROW][COL], introw, intcol) { inti=0; for (i=0; i<row; i++) { intj=0; for (j=0;j<col;j++) { if (board[i][j] ==' ') return0; } } return1; } charIsWin(charboard[ROW][COL], introw, intcol) { inti=0; for (i=0; i<row; i++) { if (board[i][0] ==board[i][1] &&board[i][1] ==board[i][2] &&board[i][0] !=' ') { returnboard[i][0]; } } for (i=0; i<col; i++) { if (board[0][i] ==board[1][i] &&board[1][i] ==board[2][i] &&board[0][i] !=' ') { returnboard[0][i]; } } if (board[0][0] ==board[1][1] &&board[1][1] ==board[2][2]&&board[1][1] !=' ') { returnboard[0][0]; } if (board[0][2] ==board[1][1] &&board[1][1] ==board[2][0] &&board[1][1] !=' ') { returnboard[1][1]; } if (IsFull(board,row,col)) { return'Q'; } return'C'; }
三、全部代码如下
game.h
voidNewRoard(charboard[ROW][COL], introw, intcol); voidPriRoard(charboard[ROW][COL], introw, intcol); voidPlayRoard(charboard[ROW][COL], introw, intcol); voidCompRoard(charboard[ROW][COL], introw, intcol); charIsWin(charboard[ROW][COL], introw, intcol);
game.c
voidNewRoard(charboard[ROW][COL], introw, intcol) { inti=0; for (i=0; i<row; i++) { intj=0; for (j=0; j<col; j++) { board[i][j] =' '; } } } voidPriRoard(charboard[ROW][COL], introw, intcol) { inti=0; for (i=0; i<row; i++) { intj=0; for (j=0; j<col; j++) { printf(" %c ", board[i][j]); if(j<col-1) printf("|"); } printf("\n"); if (i<row-1) { intj=0; for (j=0; j<row; j++) { printf("---"); if(j<row-1) printf("|"); } } printf("\n"); } } voidPlayRoard(charboard[ROW][COL], introw, intcol) { intx=0; inty=0; printf("玩家请下棋\n"); while (1) { printf("玩家请输入坐标:>"); scanf("%d %d", &x, &y); if (x>=1&&x<=row&&y>=1&&y<=row) { if (board[x-1][y-1] ==' ') { board[x-1][y-1] ='*'; break; } else { printf("位置已被占用,请重新输入\n"); } } else { printf("输入错误,重新输入\n"); } } } voidCompRoard(charboard[ROW][COL], introw, intcol) { intx=0; inty=0; printf("电脑下棋\n"); while (1) { intx=rand() %row; inty=rand() %col; if (board[x][y] ==' ') { board[x][y] ='#'; break; } } } intIsFull(charboard[ROW][COL], introw, intcol) { inti=0; for (i=0; i<row; i++) { intj=0; for (j=0;j<col;j++) { if (board[i][j] ==' ') return0; } } return1; } charIsWin(charboard[ROW][COL], introw, intcol) { inti=0; for (i=0; i<row; i++) { if (board[i][0] ==board[i][1] &&board[i][1] ==board[i][2] &&board[i][0] !=' ') { returnboard[i][0]; } } for (i=0; i<col; i++) { if (board[0][i] ==board[1][i] &&board[1][i] ==board[2][i] &&board[0][i] !=' ') { returnboard[0][i]; } } if (board[0][0] ==board[1][1] &&board[1][1] ==board[2][2]&&board[1][1] !=' ') { returnboard[0][0]; } if (board[0][2] ==board[1][1] &&board[1][1] ==board[2][0] &&board[1][1] !=' ') { returnboard[1][1]; } if (IsFull(board,row,col)) { return'Q'; } return'C'; }
test.c
voidgame() { printf("游戏开始\n"); //存放数组charboard[ROW][COL] = { 0 }; //棋盘初始化NewRoard(board, ROW, COL); //打印棋盘PriRoard(board, ROW, COL); charret=0; while (1) { //玩家下棋PlayRoard(board, ROW, COL); //打印棋盘PriRoard(board, ROW, COL); //判断输赢ret=IsWin(board, ROW, COL); if (ret!='C') { break; } 电脑下棋CompRoard(board, ROW, COL); 打印棋盘PriRoard(board, ROW, COL); 判断输赢ret=IsWin(board, ROW, COL); if (ret!='C') { break; } } if (ret=='*') printf("玩家赢\n"); elseif (ret=='#') printf("电脑赢\n"); elseif (ret=='Q') printf("平局\n"); } voidmenu() { printf("***********************\n"); printf("******1. 开始游戏******\n"); printf("******0. 退出游戏******\n"); printf("***********************\n"); } intmain() { intinput=0; srand((unsignedint)time(NULL)); do { menu(); printf("请选择|:"); scanf("%d", &input); switch (input) { case1: /*printf("游戏开始\n");*/game(); break; case0: printf("退出游戏\n"); break; default: printf("输入错误,重新输入!\n"); break; } } while (input); return0; }