1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 【C语言】三子棋(井字棋)的实现

【C语言】三子棋(井字棋)的实现

时间:2020-01-31 12:11:56

相关推荐

【C语言】三子棋(井字棋)的实现

文章目录

前言一、新建项目二、设计思路1.头文件game.h2.源文件test.c3.源文件game.h3.1 数组初始化3.2打印棋盘3.3玩家下棋3.4电脑下棋3.5判断游戏状态3.6 test.c文件中game函数的设计 总结1.game.h2.game.c3.test.c

前言

在学完C语言的一些基础知识了后,其实我们可以自己动手写一些较为复杂的代码了,在这里,我为大家介绍一个小游戏——三子棋。

一、新建项目

例如我所用的Visual Studio 新建了一个头文件game.h和两个源文件game.ctest.c来编写整个程序。

二、设计思路

1.头文件game.h

代码如下:

#pragma once#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);//打印棋盘void display_board(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);

把所需要的各种函数声明,C语言库函数的调用和宏定义定义的量全部放在头文件中,这样在两个源文件里可以直接引用这个头文件就可以了,像这样*#include “game.h”*。

2.源文件test.c

主函数所在的源文件,在此文件中设计整个项目的主要思路。

int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,重新选择!\n");break;}} while (input);

首先用户要自己选择玩还是不玩,然后用switch—case语句进行判断,输入1即使玩,进入game函数,0就是退出游戏,否则重新选择。

void menu(){printf("*********************************\n");printf("********1. play ********\n");printf("********0. exit ********\n");printf("*********************************\n");}void game(){}

接下来,就是对最重要的game函数的编写。

3.源文件game.h

3.1 数组初始化

void init_board(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] = ' ';}}}

将一个3*3的数组全部初始化为空格,方便打印出一个规整的棋盘。

3.2打印棋盘

最后打印出这样的一个棋盘:

3.3玩家下棋

在棋盘打印完成之后,玩家开始下棋。

3.4电脑下棋

由于想要电脑做到智能下棋,那可能涉及深度学习的相关知识,就不是我现在能接触到的了。所以还是让计算机随机生成坐标。

利用rand函数:

int x = rand() % row;int y = rand() % col;

srand((unsigned int)time(NULL));//主函数中利用时间戳生成随机数

完整代码如下:

void computer_move(char board[ROW][COL], int row, int col){printf("电脑下棋:>\n");//0~32726//%3-->0~2while (1){int x = rand() % row;//这里利用随机数除以函数和列数,这样得到的int y = rand() % col;//x,y的值就是在0~2之间了if (board[x][y] == ' '){board[x][y] = '#';break;}}}

3.5判断游戏状态

在玩家和计算机激烈的对抗之后,接下来就是判断游戏的输赢。

要设计四种状态,

1.计算机赢

2.玩家赢

3.平局

4.三种状态都不是,游戏继续、

//玩家赢 - '*'//电脑赢 - '#'//平局了 - 'Q'//游戏继续 - 'C'//通过这样的判断,可以省很多事,因为玩家执‘*’,计算机执‘#’,这样可//以直接返回数组的元素值来进行判断游戏状态char is_win(char board[ROW][COL], int row, int col){int i = 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 (i = 0; i < col; i++){//行if (board[0][i] == board[1][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[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) == 1){return 'Q';}//继续return 'C';}

//用于判断是否平局//如果棋盘满了,返回1//不满,返回0int is_full(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++){if (' ' == board[i][j]){return 0;}}}return 1;}

3.6 test.c文件中game函数的设计

void game(){char ret = 0;//数据的存储需要一个3*3的二维数组char board[ROW][COL] = {0};init_board(board, ROW, COL);display_board(board, ROW, COL);//玩游戏while(1){//设计循环来进行判断,如果返回‘C’,则继续下棋,返回不是‘C’,则游戏继续player_move(board, ROW, COL);display_board(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C')break;computer_move(board, ROW, COL);display_board(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C')break;}//根据返回值进行判断游戏结局,最后再将游戏的最终状态打印出来if (ret == '*'){printf("玩家赢\n");}else if (ret == '#'){printf("电脑赢\n");}else if(ret == 'Q'){printf("平局\n");}display_board(board, ROW, COL);}

总结

到这里,这个简单的小游戏就这么如此粗糙的设计好了。最后完整代码放在这里,供大家参考。

1.game.h

#pragma once#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);//打印棋盘void display_board(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

#include "game.h"void init_board(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_board(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){//printf("---|---|---\n");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;printf("玩家下棋:>\n");while (1){printf("请输入要下棋的坐标:>");scanf("%d %d", &x, &y);//1.坐标的合法性//2.坐标是否被占用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");//0~32726//%3-->0~2while (1){int x = rand() % row;int y = rand() % col;if (board[x][y] == ' '){board[x][y] = '#';break;}}}//用于判断是否平局//如果棋盘满了,返回1//不满,返回0static int is_full(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++){if (' ' == board[i][j]){return 0;}}}return 1;}//玩家赢 - '*'//电脑赢 - '#'//平局了 - 'Q'//游戏继续 - 'C'char is_win(char board[ROW][COL], int row, int col){int i = 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 (i = 0; i < col; i++){//行if (board[0][i] == board[1][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[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) == 1){return 'Q';}//继续return 'C';}

3.test.c

#include "game.h"void menu(){printf("*********************************\n");printf("********1. play ********\n");printf("********0. exit ********\n");printf("*********************************\n");}void game(){char ret = 0;//数据的存储需要一个3*3的二维数组char board[ROW][COL] = {0};init_board(board, ROW, COL);display_board(board, ROW, COL);//玩游戏while(1){player_move(board, ROW, COL);display_board(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C')break;computer_move(board, ROW, COL);display_board(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C')break;}//玩家赢 - '*'//电脑赢 - '#'//平局了 - 'Q'//游戏继续 - 'C'if (ret == '*'){printf("玩家赢\n");}else if (ret == '#'){printf("电脑赢\n");}else if(ret == 'Q'){printf("平局\n");}display_board(board, ROW, COL);}int main(){int input = 0;srand((unsigned int)time(NULL));do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,重新选择!\n");break;}} while (input);return 0;}

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