C语言实现三子棋(简易版)
首先构建游戏的整体框架,(游戏的逻辑),实现为
int main() { int input = 0; do{ menu(); printf("请选择> \n"); scanf("%d", &input); switch(input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("输入错误,请重新输入\n"); break; } }while(input); }
一旦启动程序,就会出现菜单,选择1的时候启动程序,选择0的时候退出游戏,如果选择的数不符合规则,就会让你重新选择.
整体的菜单页面非常简单
void menu() { printf("****************************\n"); printf("***********1.play***********\n"); printf("***********0.exit***********\n"); printf("****************************\n"); }
显示的结果为
具体实现就是这个game
函数了,我们想到要下棋是不是要有棋盘?所以第一步我们应该打印棋盘,具体打印,我们应该将所有的棋盘都初始化为空格,
void init_board(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 display_board(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 play_move(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; while (1) { printf("请输入你要下的坐标> \n"); 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"); } } } }
玩家下完棋之后,就该电脑下棋了,电脑下棋,由于自己能力有限,只能每次随机生成两个坐标进行下棋。
生成随机数的方法
首先要有一个时间种子
然后就可以随机生成
void computer_move(char board[ROW][COL], int row, int col) { printf("电脑下棋> \n"); while (1) { int x = rand() % row; int y = rand() % col; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } }
在这里我们可以想到玩家和电脑下棋这也是一个循环,所以在调用函数的时候使用循环,只有分出胜负或平局的时候才结束循环。
所以我们要设计一个函数判断输赢
char is_win(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 j = 0; j < col; j++) { if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ') { return board[1][j]; } } if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ') { return board[1][1]; } if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') { return board[1][1]; } if (is_full(board, row, col)) { return 'Q'; } return 'C'; }
返回*
代表玩家赢
返回
#
代表电脑赢返回
Q
代表平局如果返回
C
代表游戏继续
最后综合的代码
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 3 #define COL 3 void init_board(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 display_board(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 play_move(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; while (1) { printf("请输入你要下的坐标> \n"); 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"); } } } } void computer_move(char board[ROW][COL], int row, int col) { printf("电脑下棋> \n"); while (1) { int x = rand() % row; int y = rand() % col; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } } int is_full(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 is_win(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 j = 0; j < col; j++) { if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ') { return board[1][j]; } } if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ') { return board[1][1]; } if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') { return board[1][1]; } if (is_full(board, row, col)) { return 'Q'; } return 'C'; } void menu() { printf("****************************\n"); printf("***********1.play***********\n"); printf("***********0.exit***********\n"); printf("****************************\n"); } void game() { char board[ROW][COL] = { 0 }; init_board(board, ROW, COL); display_board(board, ROW, COL); while (1) { play_move(board, ROW, COL); display_board(board, ROW, COL); if (is_win(board, ROW, COL) != 'C') { break; } computer_move(board, ROW, COL); display_board(board, ROW, COL); if (is_win(board, ROW, COL) != 'C') { break; } } if (is_win(board, ROW, COL) == '*') { printf("玩家赢\n"); } if (is_win(board, ROW, COL) == '#') { printf("电脑赢\n"); } if (is_win(board, ROW, COL) == 'Q') { printf("平局\n"); } } int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择> \n"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("选择错误,请重新输入\n"); break; } } while (input); return 0; }