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

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

时间:2018-11-08 05:35:48

相关推荐

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

文章目录

前言一、main函数所在源文件:test.c二、游戏相关函数定义源文件:game.c三、头文件、宏定义、游戏函数等声明头文件:game.h总结

前言

个人写的三子棋C语言实现,望交流

一、main函数所在源文件:test.c

#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"// 三子棋void Game(void) {// 用头文件的宏定义来确定棋盘大小char board[ROW][LINE] = {0};// 初始化棋盘,放在循环外Init(board);// 游戏过程放在死循环,用break跳出while (1) {// 打印棋盘//Print(board);//玩家下棋printf("玩家下棋:\n");Player(board);// 打印棋盘Print(board);// 判定棋局char ret = Judge(board);if ('*' == ret) {printf("游戏结束,玩家胜利!\n");break;}else if ('#' == ret) {printf("游戏结束,电脑胜利!\n");break;}else if('=' == ret) {printf("游戏结束,平局!\n");break;}else {printf("游戏继续!\n");}printf("\n------------------------\n");// 电脑下棋printf("电脑下棋:\n");Robot(board);// 打印棋盘Print(board);// 判定棋局ret = Judge(board);if ('*' == ret) {printf("游戏结束,玩家胜利!\n");break;}else if ('#' == ret) {printf("游戏结束,电脑胜利!\n");break;}else if ('=' == ret) {printf("游戏结束,平局!\n");break;}else {printf("游戏继续!\n");}printf("\n------------------------\n");}}int main() {srand(time(NULL));// 首先根据用户需要来决定是否要玩游戏或结束,且将用户的输入作为循环条件,0表示结束可以直接退出循环int input = 0;do {printf("请问您是否继续开始游戏(0结束/1开始)\n");scanf("%d", &input);// switch分支来根据用户输入判别switch (input){case 1:Game();break;case 0:printf("已退出\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);return 0;}

二、游戏相关函数定义源文件:game.c

#define _CRT_SECURE_NO_WARNINGS 1// game源文件实现函数定义#include "game.h"void Init(char board[ROW][LINE]) {int i = 0;int j = 0;for (i = 0; i < ROW; i++) {for (j = 0; j < LINE; j++) {board[i][j] = ' ';}}}void Print(char board[ROW][LINE]) {int i = 0;int j = 0;for (i = 0; i < ROW; i++) {for (j = 0; j < LINE; j++) {if (LINE - 1 == j) {printf("| %c |", board[i][j]);}else {printf("| %c ", board[i][j]);}}printf("\n");for (j = 0; j < LINE; j++) {printf("——");}printf("\n");}}void Player(char board[ROW][LINE]) {// 不断下棋,直到找到一个合法位置,或者已经判定到棋盘满while (1) {// 玩家输入想下棋的位置(玩家棋子:*)int x = 0;int y = 0;// 玩家选择坐标直接根据从0开始数printf("请选择您要下的位置(x y)\n");//以%d,%d输入时,小心逗号格式必须也为英文的,对应起来scanf("%d %d", &x, &y);// 判断该位置是否合法if (x > 0 && y > 0 && x <= ROW && y <= LINE && ' ' == board[x - 1][y - 1]) {board[x - 1][y - 1] = '*';break;}else if ('=' == Judge(board)) {// 已满,退出即可,游戏函数紧接着后面就有判定break;}else {printf("该位置不合法,请重新输入\n");}}}void Robot(char board[ROW][LINE]) {// 不断下棋,直到找到一个合法位置,或者已经判定到棋盘满while (1) {// 电脑确定下棋的位置(电脑棋子:#)// x、y分别为0-ROW 和 0-LINE的数字int x = rand() % ROW;int y = rand() % LINE;// 判断该位置是否合法(与玩家判定下标有点区别)if (x >= 0 && y >= 0 && x < ROW && y < LINE && ' ' == board[x][y]) {board[x][y] = '#';break;}else if('=' == Judge(board)) {// 已满,退出即可,游戏函数紧接着后面就有判定break;}else {printf("该位置不合法,请重新筛选\n");}}}int Is_Full(char board[ROW][LINE]) {int i = 0;int j = 0;for (i = 0; i < ROW; i++) {for (j = 0; j < LINE; j++) {if (' ' == board[i][j]) {// 说明未满,直接返回0return 0;}}}// 否则满了返回1return 1;}// 判定函数看答案了,自己写的有问题!!!!!!!!!!!!!!!!// 只要在一行中任意3个连续位置都有同一个棋子,则一方胜利// 玩家胜利返回*// 电脑胜利返回#// 平局(棋盘满)返回=// 继续返回+(直接在函数最外面return '+')char Judge(char board[ROW][LINE]) {// 判定行int i = 0;int j = 0;for (i = 0; i < ROW; i++) {//自己写的:for (j = 0; j < LINE; j++) {for (j = 1; j < LINE - 1; j++) {// 如果一行内判定出来相邻三个棋子相同,则直接返回该棋子对应字符// 自己写的没有判断不为空if (board[i][j - 1] == board[i][j] && board[i][j] == board[i][j + 1] && board[i][j] != ' ') {return board[i][j];}}}// 判定列for (j = 0; j < LINE; j++) {//自己写的从0开始for (i = 1; i < ROW - 1; i++) {// 如果一列内判定出来相邻三个棋子相同,则直接返回该棋子对应字符// 自己写的没有判断不为空if (board[i - 1][j] == board[i][j] && board[i][j] == board[i + 1][j] && board[i][j] != ' ') {return board[i][j];}}}// 判定主对角线for (i = 0; i < ROW; i++) {//自己写的从0开始for (j = 1; j < LINE - 1; j++) {// 如果主对角线内判定出来相邻三个棋子相同,则直接返回该棋子对应字符// 自己写的没有判断不为空if (board[i - 1][j - 1] == board[i][j] && board[i][j] == board[i + 1][j + 1] && board[i][j] != ' ') {return board[i][j];}}}// 判定次对角线for (i = 0; i < ROW; i++) {//自己写的从0开始for (j = 1; j < LINE - 1; j++) {// 如果次对角线内判定出来相邻三个棋子相同,则直接返回该棋子对应字符// 自己写的没有判断不为空if (board[i + 1][j - 1] == board[i][j] && board[i][j] == board[i - 1][j + 1] && board[i][j] != ' ') {return board[i][j];}}}// 当判断是否满的函数返回1时为满,返回0时继续// 相当if (1 == Is_full(board))if (Is_Full(board)) {return '=';}else {// 判断平局return '+';}}

三、头文件、宏定义、游戏函数等声明头文件:game.h

#pragma once// 头文件实现声明// //易错:宏定义后面不加分号;#define ROW 3#define LINE 3#include <stdio.h>#include <stdlib.h>#include <time.h>extern void Init(char board[ROW][LINE]);extern void Print(char board[ROW][LINE]);extern void Player(char board[ROW][LINE]);extern void Robot(char board[ROW][LINE]);extern char Judge(char board[ROW][LINE]);extern int Is_Full(char board[ROW][LINE]);

总结

这里对文章进行总结:

以上就是今天总结的内容,本文包括了所有个人写的三子棋C语言代码,分享给大家。

真💙欢迎各位给予我更好的建议,欢迎访问!!!小编创作不易,觉得有用可以一键三连哦,感谢大家。peace

希望大家一起坚持学习,共同进步。梦想一旦被付诸行动,就会变得神圣。

欢迎各位大佬批评建议,分享更好的方法!!!🙊🙊🙊

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