咖啡网站设计建设,佛山网站建设怎么选,wordpress的icon,坪山手机网站建设三子棋 前言一#xff0c;游戏规则二#xff0c;所需文件三#xff0c;创建菜单四#xff0c;游戏核心内容实现1.棋盘初始化1.棋盘展示3.玩家下棋4.电脑下棋5.游戏胜负判断6.game#xff08;#xff09;函数内部具体实现 四#xff0c;游戏运行实操 前言 C语言实现三子棋… 三子棋 前言一游戏规则二所需文件三创建菜单四游戏核心内容实现1.棋盘初始化1.棋盘展示3.玩家下棋4.电脑下棋5.游戏胜负判断6.game函数内部具体实现 四游戏运行实操 前言 C语言实现三子棋是对大家对数组函数循环与分支等内容的考察。通过本篇文章你将学会如何制作出三子棋坚持一段时间的复习相信你肯定能够掌握三子棋**文末附三子棋全部代码.** 一游戏规则 设计游戏前先了解三子棋基本规则以围绕规则用C语言实现 1、人机双方轮流在格子里落子棋子先连成三棋一线者视为胜利
2、棋盘被摆满棋子仍未分出胜利视为平局
二所需文件
三子棋并不是一项容易的代码需要我们进行分文件编写。 什么是分文件编写 就是把我们的程序代码划分成多个文件这样就不会把所有的代码都放在main.c里面采用分模块的编程思想进行功能划分把每个功能不一样的单独放在一个c文件里然后写头文件把它封装成可调用的一个函数在主函数调用这个封装好的函数编译的时候一起编译即可 好处 a.功能责任划分 b.方便调试 c.主程序简洁 来让给我们看看具体操作如下 头文件中创建game.h ----用来声明函数 源文件中创建game.c—函数具体实现 / test.c—主题流程
三创建菜单
先创建一个菜单以展示进入退出游戏功能
void menu()
{printf(**********************\n);printf(****** 1.play ******\n);printf(****** 0.exit ******\n);printf(**********************\n);
}用do…while循环实现菜单使用switch语句进行菜单选择
int main()
{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);return 0;
}四游戏核心内容实现 game函数中实现整个游戏先数组棋盘 char board[ROW][COL];
1.棋盘初始化
在game.h中定义行和列为3
#define ROW 3
#define COL 3在game.h中声明初始化函数Initboard
//初始化棋盘
void Initboard(char board[ROW][COL], int row, int col);在game.c中实现初始化函数创造三行三列的空格
void Initboard(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] ;}}
}期盼初始化完成。
1.棋盘展示
初始化完棋盘需要将棋盘打印在键盘上 在game.文件中声明打印棋盘
//打印棋盘
void Displayboard(char board[ROW][COL], int row, int col);在game.c文件中实现棋盘打印函数
void DisplayBoard(char board[ROW][COL], int row, int col)
{int i 0;int j 0;for (i 0; i row; i){//先打印数据printf( %c | %c | %c \n, board[i][0], board[i][1], board[i][2]);//再打印分割行if(irow-1)printf(---|---|---\n);}
}棋盘打印完成
3.玩家下棋 在game.h声明玩家下棋函数 //玩家下棋
void Playermove(char board[ROW][COL], int row, int col);在game.h中实现玩家下棋函数。玩家所在下棋子不能出棋盘否则坐标非法重新下所下棋子必须在无棋子格子中否则坐标备占有重新下while实现玩家下错棋子重新下直到下正确退出循环 void PlayerMove(char board[ROW][COL], int row, int col)
{int x 0;int 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] )//数组下标从0开始所以横纵坐标各减一{board[x - 1][y - 1] *;break;}else{printf(该坐标被占有请输入其他坐标\n);}}else{printf(坐标非法请重新输入\n);}}
}玩家下棋完成。 4.电脑下棋 在game.h声明电脑下棋函数 //电脑下棋
void Computermove(char board[ROW][COL], int row, int col);在game.c文件中实现电脑下棋函数。电脑随机下棋需要随机坐标引头文件#include stdlib.h随机数生成需要头文件#include time.h。将电脑所下棋控制在棋盘内然后判断是否下在空棋盘内否则重下while实现玩家下错棋子重新下直到下正确退出循环 void Computermove(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;}}
}5.游戏胜负判断 在game.h中声明胜负判断函数。 //判断输赢
char IsWin(char board[ROW], int row, int col);在game.c中实现胜负判断函数。每次下棋结果共有四种1.玩家嬴2.电脑嬴3.平局4.继续游戏 for循环实现行列三点成直线if判断玩家或电脑三点成直线打印‘ * ’或‘ # ’ char IsWin(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] board[i][0] board[i][2] ! )//行连成线{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] board[2][i] board[0][i] ! )//列连成线{return board[i][0];}}if (board[0][0] board[1][1] board[1][1] board[2][2] board[0][0] board[2][2] board[0][0] ! )//斜方连成线{return board[0][0];}if (board[2][0] board[1][1] board[1][1] board[0][2] board[0][2] board[2][0] board[1][1] ! )//斜方连成线{return board[1][1];}if (isFull(board, ROW, COL)){return Q;}return C;
}嵌套平局函数在game.h中。若所有坐标被占满坐标都不为空平局函数返回真判断胜负函数返回Q平局。若坐标有空平局函数返回假在判断胜负函数中返回C继续游戏 static isFull(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;
}6.game函数内部具体实现 创建数组char board[ROW][COL];调用初始化棋盘(Initboard(board, ROW, COL))和打印棋盘Displayboard(board, ROW, COL)函数while循环实现电脑和玩家相互下棋用ret接受胜负结果如果不是继续游戏C则跳出循环。若结果为玩家*则玩家嬴若结果为电脑#则电脑应否则结果为平局。 void game()
{int ret 0;char board[ROW][COL];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 #){printf(电脑嬴\n);}else{printf(平局\n);}
}四游戏运行实操 1.运行程序出现菜单 1.选择1开始玩游戏出现棋盘 2.输入下棋位置开始下棋 3.棋子没有落在空位置重新下棋 4出现三点成直线获得胜利 5若棋盘下满则平局 6.选择0退出游戏 完整代码: game.h #pragma once#include stdio.h
#include time.h
#include stdlib.h#define ROW 3
#define COL 3//初始化棋盘
void Initboard(char board[ROW][COL], int row, int col);
//打印棋盘
void Displayboard(char board[ROW][COL], int row, int col);
//玩家下棋
void Playermove(char board[ROW][COL], int row, int col);
//电脑下棋
void Computermove(char board[ROW][COL], int row, int col);
//判断输赢
char IsWin(char board[ROW], int row, int col); game.c #define _CRT_SECURE_NO_WARNINGS 1
#includegame.hvoid Initboard(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 Displayboard(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){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 Playermove(char board[ROW][COL], int row, int col)
{int x 0;int y 0;printf(玩家要下棋:\n);while (1){printf(请输入下棋位置);scanf(%d %d, x, y);if (x 1 x row y1 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)
{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 isFull(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 IsWin(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] board[i][0] board[i][2] ! ){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] board[2][i] board[0][i] ! ){return board[i][0];}}if (board[0][0] board[1][1] board[1][1] board[2][2] board[0][0] board[2][2] board[0][0] ! ){return board[0][0];}if (board[2][0] board[1][1] board[1][1] board[0][2] board[0][2] board[2][0] board[1][1] ! ){return board[1][1];}if (isFull(board, ROW, COL)){return Q;}return C;
}test.c #define _CRT_SECURE_NO_WARNINGS 1
#includegame.h
//创建菜单
void menu()
{printf(**********************\n);printf(****** 1.play ******\n);printf(****** 0.exit ******\n);printf(**********************\n);
}
//创建游戏
void game()
{int ret 0;char board[ROW][COL];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 #){printf(电脑嬴\n);}else{printf(平局\n);}
}
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;
}本次三子棋学习告一段落三子棋详解完整代码反复阅读坚持打码相信你在不久的将来就会拿下三子棋以扩展更高级代码。期待下次作品与大家见面