失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 三子棋游戏实现(c语言)

三子棋游戏实现(c语言)

时间:2023-05-04 12:52:43

相关推荐

三子棋游戏实现(c语言)

我们想要完成一个真正的项目,我们需要先创建一个(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语言)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。