(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)
今天我们来尝试用c语言实现一个小游戏-三子棋
首先先打印一下游戏的菜单
void menu()//菜单 { printf("*************************\n"); printf("*****1.play 0.exit*****\n"); printf("*************************\n"); }
接下来就是游戏的整个运行框架的构建了,这里我们用switch()函数实现键盘控制,按下1则开始游戏,按下0则退出,如果不小心按到其他键,则会显示选择错误
void text()//运行 { int input = 0; while (1) { menu(); printf("请选择:"); scanf("%d", &input); switch(input) { case 1: game();//游戏的实现 break; case 0: printf("退出游戏\n"); break; default: printf("选择错误\n"); break; } } }
然后我们就对game()函数进行完善
如图所示,三子棋由井字构成框架,玩家在内部布棋,所以我们可以用二维数组实现井字及其内部的构建
首先先创建一个二维数组作为棋盘
#define ROW 3 #define COL 3 char board[ROW][COL] = {0};
然后对棋盘进行初始化,在玩家没有布棋之前,我们可以默认棋盘内容为空(空格)
//初始化棋盘 initboard(board,ROW,COL); void initboard(char board[ROW][COL],int row,int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { board[i][j] = ' ';//注意这里面是空格 } } }
接下来就是棋盘的打印,我们要打印的棋盘模型为:
//打印棋盘 displayboard(board,ROW,COL); void displayboard(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { //打印一行 for (int j = 0; j < col; j++) { printf(" %c ", board[i][j]);//为了与分割线平齐,注意%c左右都有空格 if (j < col - 1) { printf("|"); } } printf("\n"); //打印分割线 if (i < row - 1) { for (int j = 0; j < col; j++) { printf("---"); if (j < col - 1) { printf("|"); } } printf("\n"); } } }
棋盘打印完成后,接下来就要对下棋的操作进行编程
首先让玩家先下棋:注意玩家下棋时要确保其坐标的合法性(在棋盘范围内且当前位置没有棋子)
playermove(board,ROW,COL); void playermove(char board[ROW][COL], int row, int col) { int x = 0, y = 0; printf("玩家走:\n"); while (1) { printf("请输入坐标:"); scanf("%d%d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col)//确保棋子在棋盘内 { if (board[x - 1][y - 1] == ' ')//判断当前位置是否有棋子 { board[x - 1][y - 1] = '*'; break; } else { printf("该坐标被占用\n"); } } else { printf("超出范围\n"); } } }
接下来就是电脑走,这里我们用随机函数rand()来实现电脑的布棋,因为rand()函数每一次的随机值都是一样的,为了使电脑更加灵活,我们需要先创建一个随机函数种子
#include<time.h> srand((unsigned int)time(NULL));
与玩家行动一样,我们要确保电脑行动时的合法性。
//电脑走 computermove(board, ROW, COL); void computermove(char board[ROW][COL], int row, int col) { int x = 0, y = 0; printf("电脑走\n"); while (1) { x = rand() % row; y = rand() % col; if (board[x][y] == ' ') { board[x][y] = 'X'; break; } } }
在完成玩家和电脑的行动后,就要开始判断胜负了
三字棋胜负规则
1、双方轮流在格子里摆放棋子,先连成三棋一线者视为胜利;
2、棋盘被摆满棋子仍未分出胜利,视为平局。
首先对规则1进行编程
//判断胜负 char iswin(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')//横向连成一条线 return board[i][1]; } for (int i = 0; i < col; i++) { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')//纵向 return board[1][i]; } if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')//斜向 return board[0][0]; if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')//斜向 return board[1][1]; return 'c';//如果上述条件都没有满足,则表示棋没有下完,继续下棋 }
接下来对规则2进行编程
//判断棋盘是否满 int isfull(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (board[i][j] == ' ') return 0; } } return 1; } if (isfull(board, ROW, COL)==1)//棋盘满了,平局 return 'q';
接下来就是将上述代码全部转移到game()函数中
void game() { char ret = 0; char board[ROW][COL] = {0}; initboard(board,ROW,COL); displayboard(board,ROW,COL); while (1) { playermove(board,ROW,COL); displayboard(board, ROW, COL); ret = iswin(board, ROW, COL); if (ret != 'c') { break; } computermove(board, ROW, COL); displayboard(board, ROW, COL); ret = iswin(board, ROW, COL); if (ret != 'c') break; } if (ret == '*') printf("玩家赢\n"); else if (ret == 'X') printf("电脑赢\n"); else printf("平局\n"); }
总体代码就是这样,如果大家发现bug或者有更好的方法 ,欢迎大家一起来讨论呀,一起加油
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3 void menu()//菜单 { printf("*************************\n"); printf("*****1.play 0.exit*****\n"); printf("*************************\n"); } //初始化棋盘 void initboard(char board[ROW][COL],int row,int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { board[i][j] = ' '; } } } //打印棋盘 void displayboard(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { //打印一行 for (int j = 0; j < col; j++) { printf(" %c ", board[i][j]); if (j < col - 1) { printf("|"); } } printf("\n"); //打印分割线 if (i < row - 1) { for (int j = 0; j < col; j++) { printf("---"); if (j < col - 1) { printf("|"); } } printf("\n"); } } } //玩家移动 void playermove(char board[ROW][COL], int row, int col) { int x = 0, y = 0; printf("玩家走:\n"); while (1) { printf("请输入坐标:"); scanf("%d%d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col)//确保棋子在棋盘内 { if (board[x - 1][y - 1] == ' ')//判断当前位置是否有棋子 { board[x - 1][y - 1] = '*'; break; } else { printf("该坐标被占用\n"); } } else { printf("超出范围\n"); } } } //电脑走 void computermove(char board[ROW][COL], int row, int col) { int x = 0, y = 0; printf("电脑走\n"); while (1) { x = rand() % row; y = rand() % col; if (board[x][y] == ' ') { board[x][y] = 'X'; break; } } } //判断棋盘是否满 int isfull(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (board[i][j] == ' ') return 0; } } return 1; } //判断胜负 char iswin(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')//横向连成一条线 return board[i][1]; } for (int i = 0; i < col; i++) { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')//纵向 return board[1][i]; } if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')//斜向 return board[0][0]; if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')//斜向 return board[1][1]; if (isfull(board, ROW, COL)==1)//棋盘满了,平局 return 'q'; return 'c';//如果上述条件都没有满足,则表示棋没有下完,继续下棋 } void game() { char ret = 0; char board[ROW][COL] = {0}; initboard(board,ROW,COL); displayboard(board,ROW,COL); while (1) { playermove(board,ROW,COL); displayboard(board, ROW, COL); ret = iswin(board, ROW, COL); if (ret != 'c') { break; } computermove(board, ROW, COL); displayboard(board, ROW, COL); ret = iswin(board, ROW, COL); if (ret != 'c') break; } if (ret == '*') printf("玩家赢\n"); else if (ret == 'X') printf("电脑赢\n"); else printf("平局\n"); } void text()//运行 { srand((unsigned int)time(NULL)); int input = 0; while (1) { menu(); printf("请选择:"); scanf("%d", &input); switch(input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("选择错误\n"); break; } } } int main() { text(); return 0; }