c语言实现简易版三子棋(附完整代码)
目录
- 一、菜单栏
- 二、初始化棋盘
- 三、打印棋盘
- 四、玩家下棋
- 五、电脑下棋
- 六、判断输赢
- 七、调用玩家、电脑下棋函数和判断输赢函数
- 八、全部代码
- 总结
一、菜单栏 1.制作一个简易版的菜单,并附上选项提示

文章图片
2.因为该程序想至少运行一次,所有选择用do while循环,而选择玩与不玩游戏时,则采用switch case语句比较合适,然后调用相应的函数即可

文章图片
二、初始化棋盘 1.先创建一个棋盘
为了便于更改棋盘大小,所有采用宏定义的方式来定义其行与列

文章图片

文章图片
2.对棋盘进行初始化
起初未下棋时,棋盘应该是空白的,所有将其全部元素初始化为空格

文章图片
三、打印棋盘

文章图片

文章图片

文章图片
四、玩家下棋 由于玩家不知道数组下标以0开头,所有在用棋盘数组时,行与列都应该-1
而下棋时,可能会出现写错坐标或者写的坐标已经有棋子的情况,所有采用循环

文章图片
五、电脑下棋 电脑下棋采用随机数的方法,就需要用到时间戳和随机数的函数:rand(),time()两个函数,而调用rand()函数时需要调用srand()函数
由于随机数不确定,所有采用取模的方法,将其范围改成棋盘数组行标和列标的范围
由于不知道所下棋的地方是否有棋子,同样采用循环的方式

文章图片
六、判断输赢 1.判断输赢的四种结果
如果玩家赢——返回'*'
如果电脑赢——返回 '#'
如果平局——返回 'Q'
游戏继续——返回 'C'
2.判断行是否相等

文章图片
3.判断列是否相等

文章图片
4.判断对角线是否相等

文章图片
如果棋盘比较大时,就需要采取循环的方式来判断
5.判断平局或者游戏继续时得看棋盘是否满了

文章图片

文章图片
七、调用玩家、电脑下棋函数和判断输赢函数 由于下棋是多步操作,所有采用循环
每下一步棋都应该打印棋盘,同时还有判断游戏是否还需要继续,不继续,则跳出,判断输赢

文章图片
八、全部代码
//测试文件#include"game.h"void menu(){ printf("*****************************\n"); printf("*****1.play**********\n"); printf("*****0.exit**********\n"); printf("*****************************\n"); }void game(){ //创建一个棋盘数组 char board[ROW][COL]; //对棋盘进行初始化 InitBoard(board, ROW, COL); //打印棋盘 DisplayBoard(board, ROW, COL); char ret = '\0'; 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; } //声明文件#include#include#include//用宏定义的方法定义行与列,便于修改棋盘#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][COL], int row, int col); //函数定义文件#include"game.h"//初始化棋盘void InitBoard(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++){board[i][j] = ' '; //初始化为空格} }} //打印棋盘void DisplayBoard(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 PlayerMove(char board[ROW][COL], int row, int col){ int x = 0; int y = 0; printf("玩家下棋,输入坐标:"); while (1) {scanf("%d %d", &x, &y); if (x <= row && x > 0 && y <= col && y > 0 ){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){ int x = 0; int y = 0; printf("电脑下棋:"); while (1) {x = rand() % row; y = rand() % col; if (board[x][y] == ' '){board[x][y] = '#'; printf("\n"); break; } }} //判断输赢//玩家赢-- 返回‘*'//电脑赢-- 返回‘#'//平局-- 返回‘Q'//游戏继续-- 返回‘C' //判断棋盘是否满了int IsFull(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; //棋盘满了}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][1] != ' '){return board[i][1]; } } //列相等 for (i = 0; i < row; i++) {if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' '){return board[1][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 (IsFull(board, row, col) == 1) {return 'Q'; } //游戏继续 else {return 'C'; }}
总结 【c语言实现简易版三子棋(附完整代码)】到此这篇关于c语言实现简易版三子棋(附完整代码)的文章就介绍到这了,更多相关c语言三子棋内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- vue实现导航收缩框
- Unity实战之FlyPin(见缝插针)小游戏的实现
- MySQL 深潜 - MDL 锁的实现与获取机制
- java实现第三届蓝桥杯机器人行走
- 第六届蓝桥杯国赛:机器人繁殖从公式推导到C++/Python的实现
- 自然语言处理|NLP实用阅读英文文献技巧分享
- 程序设计语言|【spark】windows本地通过pyCharm调试pyspark程序的配置
- SpringCloud|Spring Cloud Stream 使用延迟消息实现定时任务(RabbitMQ)
- Q-learning理解、实现以及动态分配应用(一)
- Vue|Vuex实现todolist