1.三子棋规则:在九宫格棋盘上,只要将自己的三个棋子走成一条线(横、竖、对角线),对方就算输了。
2.三子棋过程程序过程(三部分:头文件,源文件函数部分,源文件游戏规则部分):
>先写一个头文件:
#ifndef _GAME_H_ #define _GAME_H_ #include<stdio.h> #include<Windows.h> #include<stdlib.h> #include<time.h> #define ROW 3 //行 #define COL 3 //列 #endif
>游戏规则部分:
(1)写一个游戏菜单界面,里面有选择进行游戏还是不进行游戏:
void meun(){ printf("#################################\n"); printf("# 1.play #\n"); printf("# 2.exit #\n"); printf("#################################\n"); printf("请选择是否进行游戏:"); }
运行结果:
(2).然菜单中有选项,我们就必须要设计一个变量用来接收用户的选择。
而且游戏程序本身应该允许用户反复进行玩耍,所以在主函数中,我们需要用一个循环来完成这个功能。
do-while循环在调用时会先运行循环体,而后在进行判断,所以这里我们选择使用do-while循环:当选1时我们需要为用户启动游戏程序,所以这里我们使用一个switch语句来接受用户的选择。选择2时退出程序,所以我们只需要跳出循环,即可退出。如果输入的数不是1或2会有提示错误,重新输入;
执行代码:
int main(){ int select=0; do{ meun(); scanf_s("%d",&select); switch (select){ case 1:game(); break; case 2: exit(0); default: printf("输入错误!请重新输入!\n"); } } while (1); system("pause"); return 0; }
运行结果:
>源代码的函数部分在game()中实现:
在game()函数下进行游戏的进行:整个游戏在二维数组的棋盘上进行,所以需要创建数组
void game() { char board[ROW][COL]; //创建数组初始化为空 char ret; memset(board, ' ', ROW*COL); //面板初始化 do{ system("CLS"); //覆盖式显示落子,不用走一步打印一个棋盘 displayBoard(board, ROW); //打印棋盘 playerMove(board, ROW); //游戏者下子 ret = isWin(board, ROW); //判断是否赢了,走一步判断一步 if (ret!=' ')break; computerMove(board, ROW); //电脑下子 ret = isWin(board, ROW); //判断是否赢了 } while (ret==' '); if (ret == 'x'){ printf("恭喜你,你赢了:)!\n"); } else if (ret == 'o'){ printf("你输了\n"); } else if (ret == 'q'){ printf("平局!\n"); }else printf("debug!"); }
游戏者棋子用‘x’表示,电脑棋子用‘o’表示,平局用q表示,如果是‘ ’的话就继续游戏
(1)打印棋盘:
void displayBoard(char board[][COL], int row) { for (int i = 0; i < row; i++){ printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]); if (i<row - 1){ printf("---|---|---\n"); } } }
运行结果:
代码:
void playerMove(char board[][COL], int row) { int x, y; do{ printf("plase Enter<x,y>:"); scanf_s("%d%d", &x, &y); //输入的坐标 if (x >= 1 && x <= 3 && y >= 1 && y <= 3){ if (board[x - 1][y - 1]==' '){ board[x - 1][y - 1] = 'x'; break; } else printf("此位置被占用!"); } else printf("输入错误!请重新输入!"); } while (1); }
输入坐标,首先判断坐标是否在棋盘内,然后在判断输入的坐标是否有棋子,如果有则提示位置有棋子,重新输入。如果没有棋子则放入游戏者对应的棋子。
(3)电脑落子:
void computerMove(char board[][COL], int row) { srand((unsigned)time(NULL)); do{ int x = rand() % ROW; int y = rand() % COL; if (board[x][y] == ' '){ board[x][y] = 'o'; break; } } while (1); }rand()是用来生成随机数的,这里我们还需要在主函数main中加上一行代码。由于我们不希望他多次生成随机数,生成一次就足够用了,所以直接computerMove()函数中加入:
srand((unsigned)time(NULL)); //需要在头文件中加入:#include<time.h>
x,y为随机坐标,需要进行判断是否为空,为空才落子;
(4)判断是否赢了:返回一个值来表示获胜者
char isWin(char board[][COL], int row) { int i = 0; for (; i < row; i++){ //判断行是否全相等 if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' '){ return board[i][0]; } } for (; i < COL; i++){ //判断列是否全相等 if (board[0][i] == board[0][i] && board[1][i] == board[2][i] && board[0][i] != ' '){ return board[0][i]; } } //判断斜着是否全相等 if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' '){ return board[0][0]; } else if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' '){ return board[0][2]; } else if (is_Full(board, row)){ //判断棋盘是否下满 return 'q'; } return ' '; }主要是判断行,列,斜着的棋子是否相同,并返回对应所代表的值。
(5)判断棋盘是否下满:
int is_Full(char board[][COL], int row) { int i = 0; for (; i < row; i++){ int j = 0; for (; j < COL; j++){ { if (board[i][j] == ' '){ return 0; } } } } return 1; }
也就是判断平局的情况。
下面是完整代码:
game.h: #ifndef _GAME_H_ #define _GAME_H_ #include<stdio.h> #include<Windows.h> #include<stdlib.h> #include<time.h> #define ROW 3 //行 #define COL 3 //列 #endif main.c: #include"game.h" void meun(){ printf("#################################\n"); printf("# 1.play #\n"); printf("# 2.exit #\n"); printf("#################################\n"); printf("请选择是否进行游戏:"); }int main(){ int select=0; do{ meun(); scanf_s("%d",&select); switch (select){ case 1:game(); break; case 2: exit(0); default: printf("输入错误!请重新输入!\n"); } } while (1); system("pause"); return 0; } game.c #include"game.h" void displayBoard(char board[][COL], int row) { for (int i = 0; i < row; i++){ printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]); if (i<row - 1){ printf("---|---|---\n"); } } } void playerMove(char board[][COL], int row) { int x, y; do{ printf("plase Enter<x,y>:"); scanf_s("%d%d", &x, &y); if (x >= 1 && x <= 3 && y >= 1 && y <= 3){ if (board[x - 1][y - 1]==' '){ board[x - 1][y - 1] = 'x'; break; } else printf("此位置被占用!"); } else printf("输入错误!请重新输入!"); } while (1); } void computerMove(char board[][COL], int row) { srand((unsigned)time(NULL)); do{ int x = rand() % ROW; int y = rand() % COL; if (board[x][y] == ' '){ board[x][y] = 'o'; break; } } while (1); } int is_Full(char board[][COL], int row) { int i = 0; for (; i < row; i++){ int j = 0; for (; j < COL; j++){ { if (board[i][j] == ' '){ return 0; } } } } return 1; } char isWin(char board[][COL], int row) { int i = 0; for (; i < row; i++){ if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' '){ return board[i][0]; } } for (; i < COL; i++){ if (board[0][i] == board[0][i] && board[1][i] == board[2][i] && board[0][i] != ' '){ return board[0][i]; } } if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' '){ return board[0][0]; } else if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' '){ return board[0][2]; } else if (is_Full(board, row)){ return 'q'; } return ' '; } void game() { char board[ROW][COL]; char ret; memset(board, ' ', ROW*COL); //面板初始化 do{ //system("CLS"); displayBoard(board, ROW); playerMove(board, ROW); ret = isWin(board, ROW); if (ret!=' ')break; computerMove(board, ROW); ret = isWin(board, ROW); } while (ret==' '); if (ret == 'x'){ printf("恭喜你,你赢了:)!\n"); } else if (ret == 'o'){ printf("你输了\n"); } else if (ret == 'q'){ printf("平局!\n"); }else printf("debug!"); }