我们想要完成一个真正的项目,我们需要先创建一个(test.c)文件存放主函数部分;再创建一个(game.c)文件去完成游戏的基本逻辑;最后,用(game.h)文件来包含我们使用的头文件。
一、三子棋游戏实现的思路
1.创建一个菜单让玩家选择,进入或退出
2.创建一个棋盘并初始化
3.打印棋盘
4.玩家落子
5.电脑落子
6.判断输赢的条件
1.菜单界面
菜单,我们直接使用printf函数来实现。
void menu(){printf("**********************\n");printf("****** 1.play ******\n");printf("****** 0.exit ******\n");printf("**********************\n");}
2.主函数的构建
当我们在游戏结束之后,依然是想玩,我们这里就要用到循环结构。
代码实现
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);return 0;}
3.创建棋盘
因为我们是三子棋,所以只需要一个3行3列的棋盘
void game(){//使用一个二维数组来存放数据char board[ROW][COL]={0};}
此处我们使用了宏定义来初始化棋盘的大小
在“game.h"头文件中声明这个初始化函数
#define ROW 3#define COL 3//初始化棋盘void init_borad(char board[ROW][COL], int row, int col);
在game.c中初始化棋盘
void init_borad(char board[ROW][COL], int row, int col){int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = ' ';}}}
4.打印棋盘
void display_borad(char board[ROW][COL], int row, int col){int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){//打印数据printf(" %c ", board[i][j]);if (j < col - 1){printf("|");}}printf("\n");if (i < row - 1){for (j = 0; j < col; j++){//打印棋盘的分割行printf("---");if (j < col - 1){printf("|");}}}printf("\n");}}
5.玩家落子
二维数组中,直接输入在坐标
这里需要判断,棋盘坐标之前已经是否落过位并且判断输入坐标是否违规
void player_move(char board[ROW][COL], int row, int col){int x = 0;int y = 0;while (1){printf("玩家下棋:>\n");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");}}else{printf("坐标非法,重新输入\n");}}}
6.电脑落子
我们使用用时间戳来生成一个随机数,并把数控制在0-2之间
因为随机数时间戳只需要产生一次,所以我们放在main函数中
srand((unsigned int)time(NULL));//产生随机数
void computer_move(char board[ROW][COL], int row, int col){printf("电脑下棋:>\n");int x = 0;int y = 0;while (1){x = rand() % row;y = rand() % col;if (board[x][y] == ' '){board[x][y] = '#';break;}}}
电脑不需要判断,电脑只要在那个位置下不了,那么电脑就会重新产生新的坐标
7.判断输赢
1.玩家赢----->返回 ‘*’
2.电脑赢----->返回’#‘
3.平局-------->返回Q
4.继续--------->返回C
har is_win(char board[ROW][COL], int row, int col){int i = 0;int j = 0;for (i = 0; i < row; i++){//判断行if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' '){return board[i][0];}}for (j = 0; j < col; j++){//判断列if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' '){return board[0][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_fun(board, row, col) == 1){return 'Q';}return 'C';}
二、总代码
1.game.h
#pragma once#include<stdio.h>#include<time.h>#include<stdlib.h>#define ROW 3#define COL 3//初始化棋盘void init_borad(char board[ROW][COL], int row, int col);//打印棋盘void display_borad(char board[ROW][COL], int row,int col);//玩家界面void player_move(char board[ROW][COL], int row, int col);//电脑界面void computer_move(char board[ROW][COL], int row, int col);//判断赢的条件char is_win(char board[ROW][COL], int row, int col);
2.game.c
#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"void init_borad(char board[ROW][COL], int row, int col){int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = ' ';}}}void display_borad(char board[ROW][COL], int row, int col){int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){printf(" %c ", board[i][j]);if (j < col - 1){printf("|");}}printf("\n");if (i < row - 1){for (j = 0; j < col; j++){printf("---");if (j < col - 1){printf("|");}}}printf("\n");}}void player_move(char board[ROW][COL], int row, int col){int x = 0;int y = 0;while (1){printf("玩家下棋:>\n");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");}}else{printf("坐标非法,重新输入\n");}}}void computer_move(char board[ROW][COL], int row, int col){printf("电脑下棋:>\n");int x = 0;int y = 0;while (1){x = rand() % row;y = rand() % col;if (board[x][y] == ' '){board[x][y] = '#';break;}}}static int is_fun(char board[ROW][COL], int row, int col){int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (' ' == board[i][j]){return 0;}}}return 1;}char is_win(char board[ROW][COL], int row, int col){int i = 0;int j = 0;for (i = 0; i < row; i++){if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' '){return board[i][0];}}for (j = 0; j < col; j++){if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' '){return board[0][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_fun(board, row, col) == 1){return 'Q';}return 'C';}
3.test.c
#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void menu(){printf("**********************\n");printf("****** 1.play ******\n");printf("****** 0.exit ******\n");printf("**********************\n");}void game(){char ret = 0;char board[ROW][COL] = {0 };init_borad(board, ROW, COL);display_borad(board, ROW, COL);while (1){player_move(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C'){break;}display_borad(board, ROW, COL);computer_move(board, ROW, COL);if(ret != 'C'){break;}display_borad(board, ROW, COL);}if (ret == '*'){printf("玩家赢\n");}if (ret == '#'){printf("电脑赢\n");}if (ret == 'Q'){printf("平局\n");}display_borad(board, ROW, COL);}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;}
总结
@_@看一遍一定不会吧!!!@ _@
快!快!快!
自己快敲一遍
如果觉得《三子棋游戏实现(c语言)》对你有帮助,请点赞、收藏,并留下你的观点哦!