C语言三子棋小游戏的实现

前言

三子棋又叫九宫棋、圈圈叉叉、一条龙、井字棋等。

三子棋游戏规则:三子连成一片即为赢,如果双方都没有连成线,即为平局。

一、如何实现?

1.棋盘大小如何确定?

我们要实现一个3×3的棋盘,就需要定义一个3行3列的数组,但是数组的下标从0开始,玩家选择落子坐标很不方便,所以要定义一个4×4的数组,第0行第0列不使用,如下图红框内的行和列不使用。这样就方便玩家选择落子坐标。

2.如何判定输赢?

三子棋的规则很简单,只要判断每一行、每一列、对角线中是否有连成线的,即为赢。

代码思路:

1、判断是否有相同的行并且不能为空格(数组初始化为空格)。
2、判断是否有相同的列并且不能为空格。
3、判断主次对角线是否相同并且不能为空格。
4、棋盘下满后是否为平局。

代码如下:

//判断谁赢,'X'表示玩家赢,'0'表示电脑赢,'p'表示平局
char IsWin(char map[ROWS][COLS], int row, int col)
{
 int i = 0;
 int j = 0;
 int ret = IsFull(map, ROWS, COLS);
 //判断行
 for (i = 1; i < row; i++)
 {
 if (map[i][1] == map[i][2] && map[i][2] == map[i][3] && map[i][1] != ' ')
 {
 return map[i][1];
 }
 }
 //判断列
 for (j = 1; j < col; j++)
 {
 if (map[1][j] == map[2][j] && map[2][j] == map[3][j] && map[1][j] != ' ')
 {
 return map[1][j];
 }
 }
 //判断主对角线
 if (map[1][1] == map[2][2] && map[2][2] == map[3][3] && map[1][1] != ' ')
 {
 return map[1][1];
 }
 //判断次对角线
 if (map[1][3] == map[2][2] && map[2][2] == map[3][1] && map[1][3] != ' ')
 {
 return map[1][3];
 }
 //判断是否为平局
 if (ret == 0)
 {
 return 'p';
 }
 else
 {
 return ' ';//防止编译器报错
 }
}

注意:

1、三个值比较时不可以使用连等,==是关系操作符,==是从左到右进行运算的,计算表达式 a == b == c 时,首先会进行逻辑运算 a == b得出逻辑值1或0,得到的结果作为返回值,然后进行逻辑运算 “返回值” == c 得出逻辑值1或0,作为整个表达式的返回值。所以不能这样用。
2、判断完是否平局后,要加一个else,返回一个字符,不然编译器会报错:

因为编译器认为还有一种情况:当所有的if都不满足时,没有返回值,所以要加一个else返回一个对结果没有影响的字符。

二、具体代码实现

1.头文件game.h

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>

#define ROW 3
#define COL 3
#define ROWS ROW+1
#define COLS COL+1

//初始化棋盘
void InitMap(char map[][COLS], int row, int col);

//打印棋盘
void DisplayMap(char map[][COLS], int row, int col);

//玩家落子
void PlayerMove(char map[][COLS], int row, int col);

//电脑落子
void ComputerMove(char map[][COLS], int row, int col);

//判断棋盘是否满,0表示满,1表示未满
int IsFull(char map[][COLS], int row, int col);

//判断谁赢,'X'表示玩家赢,'0'表示电脑赢,'p'表示平局
char IsWin(char map[][COLS], int row, int col);

2.主函数main.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

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

void game()
{
 char map[ROWS][COLS];
 char ret = ' ';//用来接收IsWin()的返回值
 InitMap(map, ROWS, COLS);//初始化棋盘
 DisplayMap(map, ROWS, COLS);//打印棋盘
 do
 {
 PlayerMove(map, ROWS, COLS);//玩家落子
 ret = IsWin(map, ROWS, COLS);
 if (ret == 'X')
 {
 printf("玩家赢......\n");
 break;
 }
 else if (ret == 'p')
 {
 printf("平局......\n");
 break;
 }
 ComputerMove(map, ROWS, COLS);//电脑落子
 ret = IsWin(map, ROWS, COLS);
 if (ret == '0')
 {
 printf("电脑赢......\n");
 break;
 }
 }while (IsFull(map,ROWS,COLS));//棋盘已满,结束循环
}

void test()
{
 int input = 0;
 srand((unsigned)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);
}

int main()
{
 test();
 return 0;
}

3.函数game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

void InitMap(char map[][COLS], int row, int col)
{
 int i = 0;
 int j = 0;
 for (i = 1; i < row; i++)
 {
 for (j = 1; j < col; j++)
 {
 map[i][j] = ' ';
 }
 }
}

void DisplayMap(char map[][COLS], int row, int col)
{
 int i = 0;
 int j = 0;
 for (i = 1; i < row; i++)
 {
 for (j = 1; j <= col; j++)
 {
 printf("%3c",map[i][j]);
 if (j < col - 1)
 {
 printf(" | ");
 }
 }
 printf("\n");
 if (i < row - 1)
 {
 for (j = 1; j < col; j++)
 {
 printf(" --- ");
 }
 }
 printf("\n");
 }
}

void PlayerMove(char map[][COLS], int row, int col)
{
 int x = 0;
 int y = 0;
 printf("玩家走->\n");
 while (1)
 {
 printf("请选择落子坐标->");
 scanf("%d %d", &x, &y);
 if (x >= 1 && x <= 3 && y >= 1 && y <= 3)
 {
 if (map[x][y] == ' ')
 {
 map[x][y] = 'X';
 break;//落子成功就跳出循环
 }
 else
 {
 printf("该位置已被占用请重新输入->\n");
 }
 }
 else
 {
 printf("坐标非法,请重新输入......\n");
 }
 }
 DisplayMap(map, ROWS, COLS);
}

void ComputerMove(char map[][COLS], int row, int col)
{
 int x = 0;
 int y = 0;
 printf("电脑走->\n");
 while (1)
 {
 x = rand() % 3 + 1;//1-3
 y = rand() % 3 + 1;//1-3
 if (map[x][y] == ' ')
 {
 map[x][y] = '0';
 break;
 }
 }
 DisplayMap(map, ROWS, COLS);
 }

//判断棋盘是否满,0表示满,1表示未满
int IsFull(char map[][COLS], int row, int col)
{
 int i = 0;
 int j = 0;
 int count = 0;//计算落子过的格子
 for (i = 1; i < row; i++)
 {
 for (j = 1; j < col; j++)
 {
 if (map[i][j] == 'X' || map[i][j] == '0')
 {
 count++;
 }
 }
 }
 if (count == ROW * COL)
 {
 return 0;//满
 }
 else
 {
 return 1;
 }
}

//判断谁赢,'X'表示玩家赢,'0'表示电脑赢,'p'表示平局
char IsWin(char map[ROWS][COLS], int row, int col)
{
 int i = 0;
 int j = 0;
 int ret = IsFull(map, ROWS, COLS);
 //判断行
 for (i = 1; i < row; i++)
 {
 if (map[i][1] == map[i][2] && map[i][2] == map[i][3] && map[i][1] != ' ')
 {
 return map[i][1];
 }
 }
 //判断列
 for (j = 1; j < col; j++)
 {
 if (map[1][j] == map[2][j] && map[2][j] == map[3][j] && map[1][j] != ' ')
 {
 return map[1][j];
 }
 }
 //判断主对角线
 if (map[1][1] == map[2][2] && map[2][2] == map[3][3] && map[1][1] != ' ')
 {
 return map[1][1];
 }
 //判断次对角线
 if (map[1][3] == map[2][2] && map[2][2] == map[3][1] && map[1][3] != ' ')
 {
 return map[1][3];
 }
 //判断是否为平局
 if (ret == 0)
 {
 return 'p';
 }
 else
 {
 return ' ';//防止编译器报错
 }
}

4、运行结果示例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言实现简单的三子棋游戏

    C语言:三子棋游戏,供大家参考,具体内容如下 首先,我们从main函数开始写起,分析游戏的整体逻辑 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")

  • C语言实现三子棋程序

    本文实例为大家分享了C语言实现三子棋的具体代码,供大家参考,具体内容如下 先直接上代码: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //2.实现三子棋游戏. #include<Windows.h> //Sleep() RAND_MAX 的头文件 void menu() //打印菜单 { printf("****************************\n"); printf("***

  • C语言三子棋小游戏的实现代码

    本文实例为大家分享了C语言三子棋小游戏的具体代码,供大家参考,具体内容如下 一.介绍: 运用C语言的数组等相关知识:实现一个简易的三子棋小游戏: 三子棋小游戏的大概内容为 此游戏在设计时:总共设计了三个文件: game.h: 类型的声明和函数的声明 game.c:函数功能的具体实现 test.c: 测试文件 二.具体实现: (1).game.h模块: 代码实现如下: #define _CRT_SECURE_NO_WARNINGS 1 //头文件包含 #include <stdio.h> #in

  • C语言实现三子棋

    本文实例为大家分享了C语言实现三子棋的具体代码,供大家参考,具体内容如下 题目:C语言实现三子棋 问题分析:首先用到数组,存储信息.棋盘的信息和棋子的信息 打印棋盘 读取棋子的位置 判断是否连子 打印棋盘 然后重复 代码如下: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> //数组沙盘 char Global_Gobang[10][10]; int Global_line, Global_p

  • C语言实现简单的三子棋

    本文实例为大家分享了C语言实现简单三子棋游戏的具体代码,供大家参考,具体内容如下 一.主要思想 1.创建一个3*3的棋盘(使用字符数组) 2.初始化棋盘(用空格填充) 3.打印棋盘(使其有可见的边框) 4.玩家落子,用x表示(检验是否越界,是否已经落子,是否赢) 5.电脑落子,用o表示(检验是否已经落子,是否赢)  注:电脑在有效范围内随机落子,使用当前时间戳设置随机种子即srand(time(0)) 6.三种情况:玩家赢,电脑赢,和棋 二.代码实现 #define _CRT_SECURE_NO

  • C语言实现简单三子棋程序

    使用C语言实现简单的三子棋程序,主要是对二维数组的运用,我们需要一个头文件,两个源文件来实现. game.h //包含函数的声明,宏定义 test.c //包含主函数,函数调用 game.c //包含函数的定义 整体思路 1.要完成一个简单的三子棋程序,首先需要创建一个二维数组,并完成数组初始化. //使用宏定义定义常量,方便之后对数组的使用 #define ROW 3 //行 #define COL 3 //列 char arr[ROW][COL] = { 0 }; Arr_init(arr,

  • C语言实现三子棋小游戏详解

    在用c语言实现三子棋小游戏之前,我们应当了解三子棋的游戏规则:在九宫格棋盘上,哪一方三个棋子连成一线(一行或一列或对角线)即判定哪一方胜利. 以下为源代码: 1.首先打印出菜单. void menu() { printf("**********************************\n"); printf("**********************************\n"); printf("***** 0.play *********

  • C语言实现简单三子棋游戏

    本文实例为大家分享了C语言实现简单三子棋游戏的具体代码,供大家参考,具体内容如下 游戏介绍:使用C语言中二维数组和函数的基本知识实现一个三子棋游戏,这个游戏要实现的基本功能有初始化棋盘.棋盘的打印.玩家下棋.电脑下棋.判断输赢. 代码框架: 1.头文件(game.h) #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<st

  • C语言实现三子棋游戏

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> #include<time.h> void chess_board(char arr[3][3]) //打印棋盘 { int i = 0; int j = 0; for (i = 0; i < 3; i++) { printf( " %c | %c | %c \n", arr [i][0], a

  • C语言实现三子棋小游戏

    在这里我们要写出一个三子棋的小游戏,能够实现所需要的三字连珠的功能,并且可以使得游戏让玩家进行选择是否继续的功能. 代码: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3 void init_board(char arr[ROW][COL]) { int i=0; int j=0; for

随机推荐