服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言简单实现三子棋游戏

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

2021-12-10 15:07长路不漫漫 C/C++

这篇文章主要为大家详细介绍了C语言简单实现三子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C语言简单实现三子棋游戏的具体代码,供大家参考,具体内容如下

设计思路

1. 二维数组实现棋盘

2. 设计并打印出棋盘

3. 玩家先手

4. 每一次下棋后判断输赢

首先我们写出游戏的主函数,让玩家能自由选择开始游戏或者退出游戏。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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);
 }

接下来我们看看游戏该怎样具体实现

首先确定我们的棋盘长度和宽度

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

我们希望能够将完整棋盘展示给玩家,所以我们通过以下方式来实现

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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-1; j++)
   {
    printf("---|");
   }
   printf("---\n");
  }
 }
}

当我们下棋时,棋盘中最好时没有任何内容的,这样才能方便玩家使用

所以我们可以将棋盘中的内容先放入 “空格”

?
1
2
3
4
5
6
7
8
9
10
11
12
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] = ' ';
  }
 }
}

为了更好区别玩家与电脑 ,我们采用两种不同符号来代表玩家与电脑(“*” 和“#”)

当我们思考玩家下棋时,我们会考虑到棋盘中原来的位置是否已经下过棋了,如果已经下过,我们又该怎样解决?

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void PlayerMove(char board[ROW][COL], int row, int col)
{
 printf("请输入坐标>\n");
 int x = 0;
 int y = 0;
 
 while (1)
 {
  scanf("%d%d", &x,&y);
  if (1<= x && x <=COL && 0 <= y && y <= ROW)
  {
   if (board[x-1][y-1] == ' ')
   {
    board[x-1][y-1] = '*';
    break;
   }
   else
   {
    printf("坐标已被占用,请重新输入>\n");
   }
  }
  else
  {
   printf("坐标不合法,请重新输入>\n");
  }
 }
}

电脑下棋我们又该如何实现呢?

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void ComputerMove(char board[ROW][COL], int row, int col)
{
 int x = 0;
 int y = 0;
 printf("电脑输入>\n");
 while (1)
 {
  x = rand() % row;
  y = rand() % col;
  if (board[x][y] == ' ')
  {
   board[x][y] = '#';
   break;
  }
 }
}

玩家或电脑下棋之后,如果已经成型,也就是“三子一线”,我们不能再继续游戏了,所以我们要考虑何时游戏结束,这里给出了我的判断函数。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
char IsWin(char board[ROW][COL], int row, int col)
{
 int x=0, y=0;
 int z = 0;
 for (x = 0; x < COL; x++)
 {
  int m = 0;//用于判断某一行
  int n = 0;//用于判断某一列
  int i = 0;//用于判断升斜线方向
  int j = 0;//用于判断降斜线方向
  
  for (y = 0; y < ROW; y++)
  {
   if (board[x][0] != ' '&&board[x][0] == board[x][y])
   {
    n++;
   }
   else if ( board[0][x] != ' '&&board[0][x] == board[y][x] )
   {
    m++;
   }
   if (board[x][y]==' ')
   {
    z++;
   }
  }
  if ( board[0][0] != ' '&&board[0][0] == board[x][x])
  {
   i++;
  }
  if (board[ROW - 1][0] == board[ROW - 1 - x][x] && board[ROW-1][0] != ' ')
  {
   j++;
  }
  if (n == COL)
  {
   return board[x][0];
  }
  else if (m == ROW)
  {
   return board[0][x];
  }
  else if (i == COL)
  {
   return board[0][0];
  }
  else if (j == ROW)
  {
   return board[ROW - 1][0];
  
 }
 if (z == 0)
 {
  return z;
 }
 return 'C';
}

将这些函数做成我们的游戏函数

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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");
  }
 }

到此我们的游戏就做好啦,让我们看看效果吧。

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

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

哈哈 我赢啦❗

最后是总体代码

game.h

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once
#include<stdio.h>
#include <stdlib.h>
#include <time.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][COL], int row, int col);

game.c

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#define _CRT_SECURE_NO_WARNINGS
#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-1; j++)
   {
    printf("---|");
   }
   printf("---\n");
  }
 }
}
void PlayerMove(char board[ROW][COL], int row, int col)
{
 printf("请输入坐标>\n");
 int x = 0;
 int y = 0;
 
 while (1)
 {
  scanf("%d%d", &x,&y);
  if (1<= x && x <=COL && 0 <= y && y <= ROW)
  {
   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("电脑输入>\n");
 while (1)
 {
  x = rand() % row;
  y = rand() % col;
  if (board[x][y] == ' ')
  {
   board[x][y] = '#';
   break;
  }
 }
}
char IsWin(char board[ROW][COL], int row, int col)
{
 int x=0, y=0;
 int z = 0;
 for (x = 0; x < COL; x++)
 {
  int m = 0;//用于判断某一行
  int n = 0;//用于判断某一列
  int i = 0;//用于判断升斜线方向
  int j = 0;//用于判断降斜线方向
  
  for (y = 0; y < ROW; y++)
  {
   if (board[x][0] != ' '&&board[x][0] == board[x][y])
   {
    n++;
   }
   else if ( board[0][x] != ' '&&board[0][x] == board[y][x] )
   {
    m++;
   }
   if (board[x][y]==' ')
   {
    z++;
   }
  }
  if ( board[0][0] != ' '&&board[0][0] == board[x][x])
  {
   i++;
  }
  if (board[ROW - 1][0] == board[ROW - 1 - x][x] && board[ROW-1][0] != ' ')
  {
   j++;
  }
  if (n == COL)
  {
   return board[x][0];
  }
  else if (m == ROW)
  {
   return board[0][x];
  }
  else if (i == COL)
  {
   return board[0][0];
  }
  else if (j == ROW)
  {
   return board[ROW - 1][0];
  
 }
 if (z == 0)
 {
  return z;
 }
 return 'C';
}

三子棋.c

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#define _CRT_SECURE_NO_WARNINGS
#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);
 }

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

原文链接:https://blog.csdn.net/qq_58259923/article/details/119225845

延伸 · 阅读

精彩推荐
  • C/C++深入理解goto语句的替代实现方式分析

    深入理解goto语句的替代实现方式分析

    本篇文章是对goto语句的替代实现方式进行了详细的分析介绍,需要的朋友参考下...

    C语言教程网7342020-12-03
  • C/C++详解c语言中的 strcpy和strncpy字符串函数使用

    详解c语言中的 strcpy和strncpy字符串函数使用

    strcpy 和strcnpy函数是字符串复制函数。接下来通过本文给大家介绍c语言中的strcpy和strncpy字符串函数使用,感兴趣的朋友跟随小编要求看看吧...

    spring-go5642021-07-02
  • C/C++C语言中炫酷的文件操作实例详解

    C语言中炫酷的文件操作实例详解

    内存中的数据都是暂时的,当程序结束时,它们都将丢失,为了永久性的保存大量的数据,C语言提供了对文件的操作,这篇文章主要给大家介绍了关于C语言中文件...

    针眼_6702022-01-24
  • C/C++C语言实现电脑关机程序

    C语言实现电脑关机程序

    这篇文章主要为大家详细介绍了C语言实现电脑关机程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    xiaocaidayong8482021-08-20
  • C/C++学习C++编程的必备软件

    学习C++编程的必备软件

    本文给大家分享的是作者在学习使用C++进行编程的时候所用到的一些常用的软件,这里推荐给大家...

    谢恩铭10102021-05-08
  • C/C++C++之重载 重定义与重写用法详解

    C++之重载 重定义与重写用法详解

    这篇文章主要介绍了C++之重载 重定义与重写用法详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    青山的青6062022-01-04
  • C/C++C/C++经典实例之模拟计算器示例代码

    C/C++经典实例之模拟计算器示例代码

    最近在看到的一个需求,本以为比较简单,但花了不少时间,所以下面这篇文章主要给大家介绍了关于C/C++经典实例之模拟计算器的相关资料,文中通过示...

    jia150610152021-06-07
  • C/C++c++ 单线程实现同时监听多个端口

    c++ 单线程实现同时监听多个端口

    这篇文章主要介绍了c++ 单线程实现同时监听多个端口的方法,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下...

    源之缘11542021-10-27