用C语言编写三子棋的具体分析
2016-04-09 23:03
309 查看
在做这个三子棋时的时候首先我们该细心分析好我们应该做的每一部然后再用对应的函数实现。
首先我们先建立一个项目, 然后在添加一个头文件、一个放我们函数部分的.c文件和一个主函数的.c文件
下三子棋应该需要这么几步:
1.在屏幕打印出一个棋盘;
2.人移动棋子;
3.检查输赢;
4.电脑移动棋子;
5.检查输赢;
下一盘三子棋总共需要这么几步 ,让我们一步一步来实现。
这是我们的函数部分,在我们写函数的过程中也要调用库函数,以及我们自己写的函数,所以在我们的函数部分前面要写上我们所定义的的头文件,这样我们就不需要多次写我们函数声明,以及所用库函数的头文件了,头文件里边的内容最后在给大家展示。
然后让我们开始写大框架:
对应的函数我们接下来来一一实现。
打印棋盘:
我们需要在界面上打印出一个3*3的方格
其中每个方格内包括一个空格在加一个%c 放棋子在在加一个空格,这所有位置的棋子可以用一个2维数组都表示,在开始的时候我们把每一个位置都初始化成空格。
棋盘函数代码如下:
初始化棋子的函数:
2.人移动棋子:就是对这个二维数组进行赋值,如果每个点的值为空格的化说明其没被占可以下。
3.电脑移动棋子:我们利用随机函数举一个随机的2维数组的值然后判断其是否被占,如果被占重新随机一个值,在电脑放值之前我们还应该判断棋盘是否下满,如果不判断他会放不进去棋子然后一直随机从而造成死循环,所以我们首先应该判断棋盘是否满了。
①:判断棋盘是否满了的函数:
②:电脑移动:
最后是检查是否有人胜利的函数,在三子棋的游戏中要想取胜,必须横或竖成3个或是对角线成3个一样的时候才可以所以在检查是否胜利的函数为:
最后就是玩游戏了,弄一个菜单让我们可以玩完一局可以自己选择是否在来一局
这就是我们的主函数了
我们的头文件里边应该包括各个函数的声明,以及调用一些库函数的头文件,在我们使用我们定义的函数的时候就只需要在前面写上我们的头文件就可以了。
接下来就是测试了
首先这是我们的菜单:
然后按1 选择开始我们的游戏:
然后就可以输入坐标下棋了:
这是我们赢了
电脑也是可以胜利的说明我们的程序还是公平的
首先我们先建立一个项目, 然后在添加一个头文件、一个放我们函数部分的.c文件和一个主函数的.c文件
下三子棋应该需要这么几步:
1.在屏幕打印出一个棋盘;
2.人移动棋子;
3.检查输赢;
4.电脑移动棋子;
5.检查输赢;
下一盘三子棋总共需要这么几步 ,让我们一步一步来实现。
这是我们的函数部分,在我们写函数的过程中也要调用库函数,以及我们自己写的函数,所以在我们的函数部分前面要写上我们所定义的的头文件,这样我们就不需要多次写我们函数声明,以及所用库函数的头文件了,头文件里边的内容最后在给大家展示。
然后让我们开始写大框架:
void play_g() { char arr[ROW][LINE]; init_board(arr); char ret; do { display_board(arr);//棋盘函数 palyer_move(arr);//玩家移动 ret = check_win(arr);//检查输赢 if (ret != ' ') break; computer_move(arr);//电脑移动 ret = check_win(arr);//检查输赢 } while (ret == ' '); system("cls"); display_board(arr); if (ret == 'X') printf("玩家赢\n"); if (ret == '0') printf("电脑赢\n"); if (ret == 'q') printf("平局\n"); }
对应的函数我们接下来来一一实现。
打印棋盘:
我们需要在界面上打印出一个3*3的方格
其中每个方格内包括一个空格在加一个%c 放棋子在在加一个空格,这所有位置的棋子可以用一个2维数组都表示,在开始的时候我们把每一个位置都初始化成空格。
棋盘函数代码如下:
void display_board(char arr[ROW][LINE]) { int i = 0; printf(" 1 2 3 \n"); printf(" ___________\n"); for (i = 0; i < ROW; i++) { printf("%d", i+1); printf("| %c | %c | %c |\n", arr[i][0], arr[i][1], arr[i][2]); if (i != 2) printf(" |---|---|---|\n"); } printf(" ~~~~~~~~~~~~~\n"); }
初始化棋子的函数:
void init_board(char arr[ROW][LINE]) { int i=0,j=0; for (i = 0; i < ROW; i++) for (j = 0; j < LINE; j++) { arr[i][j] = ' '; } }
2.人移动棋子:就是对这个二维数组进行赋值,如果每个点的值为空格的化说明其没被占可以下。
void palyer_move(char arr[ROW][LINE]) { int x = 0,y=0; printf("请输入你下的坐标:"); while (1) { scanf("%d%d", &x, &y); x = x - 1; y = y - 1; if (0 <= (x)&&x < ROW && 0 <= y&&y < LINE) { if (arr[x][y] == ' ') { arr[x][y] = 'X'; break; } else printf("输入的坐标被占用"); } else printf("输入的坐标不存在"); } }
3.电脑移动棋子:我们利用随机函数举一个随机的2维数组的值然后判断其是否被占,如果被占重新随机一个值,在电脑放值之前我们还应该判断棋盘是否下满,如果不判断他会放不进去棋子然后一直随机从而造成死循环,所以我们首先应该判断棋盘是否满了。
①:判断棋盘是否满了的函数:
int is_full(char arr[ROW][LINE]) { int i = 0, j = 0; for (i = 0; i < ROW;i++) for (j = 0; j < LINE; j++) { if (arr[i][j] == ' ') return 0; } return 1; }
②:电脑移动:
void computer_move(char arr[ROW][LINE]) { int x = 0, y = 0; srand((unsigned int)time(NULL)); while(1) { x = rand() % ROW; y = rand() % LINE; if (is_full == 1) break; if (arr[x][y] ==' ') { arr[x][y] = '0'; break; } } }
最后是检查是否有人胜利的函数,在三子棋的游戏中要想取胜,必须横或竖成3个或是对角线成3个一样的时候才可以所以在检查是否胜利的函数为:
char check_win(char arr[ROW][LINE]) { int i = 0; for (i = 0; i < ROW; i++) { if ((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2]) && arr[i][2] != ' ') return arr[i][0]; } for (i = 0; i < LINE; i++) { if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && arr[2][i] != ' ') return arr[0][i]; } if (arr[0][2]==arr[1][1]&&arr[1][1]==arr[2][0]&&arr[1][1]!=' ') return arr[1][1]; if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && arr[2][2] != ' ') return arr[1][1]; if (is_full == 1) return 'q'; return ' '; }
最后就是玩游戏了,弄一个菜单让我们可以玩完一局可以自己选择是否在来一局
这就是我们的主函数了
#include"game.h"//这是自己定义的头文件 void manu() { printf("欢迎来到三子棋游戏\n"); printf("1.进入游戏\n"); printf("2.退出\n"); } int main() { int i = 0; while (1) { manu(); scanf("%d", &i); switch (i) { case 1: play_g(); break; case 2:return 0; } } manu(); }
我们的头文件里边应该包括各个函数的声明,以及调用一些库函数的头文件,在我们使用我们定义的函数的时候就只需要在前面写上我们的头文件就可以了。
#define _CRT_SECURE_NO_WARNINGS 1 #pragma once #include<stdio.h> #include<stdlib.h> #define ROW 3 #define LINE 3 void init_board(char arr[ROW][LINE]); void display_board(char arr[ROW][LINE]); void palyer_move(char arr[ROW][LINE]); void computer_move(char arr[ROW][LINE]); int is_full(char arr[ROW][LINE]); char check_win(char arr[ROW][LINE]); void play_g();
接下来就是测试了
首先这是我们的菜单:
然后按1 选择开始我们的游戏:
然后就可以输入坐标下棋了:
这是我们赢了
电脑也是可以胜利的说明我们的程序还是公平的
相关文章推荐
- C 【进制表示 及 相互转化】
- c++上机实验3——作业
- C 【#include <> 和 #include "" 的区别】
- 翻转句子中单词的顺序和字符串的旋转操作 c++面试题
- C++ 中 delete 和 delete[] 的区别?
- C 【函数 递归】
- 4.1 左值到右值的转换 中英文对照(C++标准中文版 ISO/IEC 14882:2014)
- C++第3次上机作业
- [LeetCode]15. 3Sum
- c++作业3
- C++Primer第5版读书笔记(第12章)
- c++第三次作业
- 读书笔记--C语言接口与实现--atom(原子)
- C++Primer第5版读书笔记(第11章)
- C++实现字符串数组作为函数的参数的反序输出
- C++和JAVA在内存管理上的特点
- 一种协程的 C/C++ 实现
- C 【for循环嵌套 图形规律 问题】
- C语言循环数组做FIFO队列--一些认识
- 排序