- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章利用C语言实现三子棋(井字棋)小游戏由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例为大家分享了C语言实现三子棋(井字棋)小游戏的具体代码,供大家参考,具体内容如下 。
推荐阅读顺序(不建议跳过) 。
先看实现之后的界面 —— 然后看分析程序要实现的步骤 —— 之后在看翻到test.c部分 —— 在test.c中找到main()函数 —— 从main函数的第一步开始看 —— 遇到自定义函数请到game.h源文件中找到相应函数的详情 。
辅助阅读:
game.h文件中放的是函数的声明(引用头文件) 。
game.c文件中放的是函数的详情(怎么用代码实现相应步骤的) 。
test.c文件中放的是整体的大致思路 。
用不同文件分装代码是为了:能够让自己的代码更有条理,思路更加的清晰,别人也更容易看懂 。
如果觉得翻来翻去太过于麻烦:请登录自己现在所用的编译器 —— 把代码先拷贝一份(按照不同的文件分装) —— 遇到自定义函数(把鼠标放在函数名上面、右击、转到定义)(这样编译器可以直接转到game.c文件中的函数详情) 。
实现之后的的界面 。
分析程序要实现的步骤 。
1、在屏幕上打印菜单(提示你要选择的内容) 。
2、定义数组,初始化数组(把数组中的元素全替换成空格) 。
3、把数组打印出来 。
4、玩家下棋 。
5、判断输赢(四种情况:玩家赢、玩家输、平局、游戏未结束,继续) 。
6、电脑下棋 。
7、判断输赢(四种情况:玩家赢、玩家输、平局、游戏未结束,继续) 。
8、可以多次玩这个游戏 。
test.c(源文件) 。
用于放整体的大致思路,自定义函数放在game.h文件中 。
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
|
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void
menu()
{
printf
(
"+-------------------------------------+\n"
);
printf
(
"| 1.玩游戏 |\n"
);
printf
(
"| 0.退出游戏 |\n"
);
printf
(
"+-------------------------------------+\n"
);
}
void
game()
{
//定义棋盘数组
//其中 Hang和Lie 是define定义的标识符常量 —— 在game.h文件中可以找到
//Hang表示有几行 —— Lie表示有几列
char
board[Hang][Lie];
char
ret =
' '
;
//初始化棋盘数组
//传入三个变量,数组首元素地址,行,列
//在game.h中声明这个函数,在game.c中实现这个函数,完成以上两步在这里直接使用就可以了
init_board(board, Hang, Lie);
//进入这个函数——跳转到game.c文件,代码上方注释有1的部分
//打印棋盘的界面 —— 把棋盘显示出来 —— 进入这个函数——跳转到game.c文件,代码上方注释有2的部分
checker_board(board, Hang, Lie);
while
(1)
{
//玩家走—— 进入这个函数——跳转到game.c文件,代码上方注释有3的部分
player_move(board, Hang, Lie);
checker_board(board, Hang, Lie);
//判断输赢 —— 进入这个函数——跳转到game.c文件,代码上方注释有5的部分
ret = win_or_lose(board, Hang, Lie);
if
(ret !=
'C'
)
{
break
;
}
//电脑走 —— 进入这个函数——跳转到game.c文件,代码上方注释有4的部分
computer_move(board, Hang, Lie);
checker_board(board, Hang, Lie);
//判断输赢
ret = win_or_lose(board, Hang, Lie);
if
(ret !=
'C'
)
{
break
;
}
}
if
(ret ==
'Q'
)
{
printf
(
"平局\n"
);
}
if
(ret ==
'*'
)
{
printf
(
"恭喜你:赢\n"
);
}
if
(ret ==
'#'
)
{
printf
(
"很遗憾:你输了\n"
);
}
}
int
main()
{
int
input = 0;
srand
((unsigned
int
)
time
(NULL));
//生成随机数要用到rand()
//用rand()要调用srand()
//srand()其中()中要用到不断变化的量 —— 用时间戳来做不断变化的量 —— 时间戳可以用time()函数来实现
//(unsigned int) —— 是强制类型转换
//srand()函数不用引用多次,所以放在循环的前面就可以了
//这个生成随机数我在前面一篇博文中也讲了,如果不明白也可以去上篇博文看一下
do
{
menu();
//打印简单的菜单界面(这个函数不用去game.c文件中去找,就在这个文件的上方)
printf
(
"请输入选项前面的序号>:"
);
scanf
(
"%d"
, &input);
switch
(input)
//switch选择语句是实现:输入1玩游戏,输入0退出游戏,输入其他数提示输入错误。
{
case
1:
//game()自定义函数 --- 在这个函数里面实现三子棋游戏 —— 主要的设计思路都在这个函数中
//这个函数也在这个文件的上方,不用去game.c文件中找
game();
//进入函数
break
;
case
0:
printf
(
"退出游戏\n"
);
break
;
default
:
printf
(
"输入错误,请重新输入\n"
);
break
;
}
}
while
(input);
return
0;
}
|
game.h(头文件) 。
放函数的声明(引用头文件) 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#pragma once
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define Hang 3
#define Lie 3
//初始化棋盘,把棋盘中的数变成空格;
void
init_board(
char
board[Hang][Lie],
int
hang,
int
lie);
//打印期棋盘,显示棋盘状态;
void
checker_board(
char
board[Hang][Lie],
int
hang,
int
lie);
//玩家走
void
player_move(
char
board[Hang][Lie],
int
hang,
int
lie);
//电脑走
void
computer_move(
char
board[Hang][Lie],
int
hang,
int
lie);
//判断输赢
char
win_or_lose(
char
board[Hang][Lie],
int
hang,
int
lie);
|
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//1111111111
//把数组中的数初始化成空格
void
init_board(
char
board[Hang][Lie],
int
hang,
int
lie)
{
int
i = 0;
for
(i = 0; i < hang; i++)
{
int
j = 0;
for
(j = 0; j < lie; j++)
{
board[i][j] =
' '
;
}
}
}
//2222222222
//打印棋盘
void
checker_board(
char
board[Hang][Lie],
int
hang,
int
lie)
{
int
i = 0;
for
(i = 0; i < hang; i++)
{
int
j = 0;
for
(j = 0; j < lie; j++)
//打印第一行棋盘
{
printf
(
" %c "
, board[i][j]);
if
(j < lie - 1)
{
printf
(
"|"
);
}
}
printf
(
"\n"
);
if
(i < hang - 1)
{
for
(j = 0; j < lie; j++)
{
printf
(
"---"
);
if
(j < lie - 1)
{
printf
(
"|"
);
}
}
}
printf
(
"\n"
);
}
}
//3333333333
//玩家输入 —— 判断玩家输入的坐标
//如果超过数组范围,显示输入错误,请重新输入
//如果下棋的位置已经被占用,显示坐标错误
void
player_move(
char
board[Hang][Lie],
int
hang,
int
lie)
{
int
x = 0;
int
y = 0;
printf
(
"请输入你所要下的位置坐标:"
);
while
(1)
//这个循环结束的条件是:玩家输入正确的
{
scanf
(
"%d %d"
, &x, &y);
//玩家输入坐标
if
(x > 0 && x <= hang && y > 0 && y <= lie)
{
if
(board[x - 1][y - 1] ==
' '
)
//输入数正确
{
board[x - 1][y - 1] =
'*'
;
break
;
}
else
//输入数对应的坐标已被占用
{
printf
(
"坐标错误:"
);
}
}
else
//输入数超出数组范
{
printf
(
"输入错误请重新输入:"
);
}
}
}
//4444444444
//电脑走
void
computer_move(
char
board[Hang][Lie],
int
hang,
int
lie)
{
int
hangs = 0;
int
lies = 0;
printf
(
"电脑走:\n"
);
while
(1)
//这个循环结束的条件是:直到执行随机坐标正确(没有被占用)
{
//生产随机坐标
int
hangs =
rand
() % hang;
int
lies =
rand
() % lie;
if
(board[hangs][lies] ==
' '
)
//判断坐标是否被占用
{
board[hangs][lies] =
'#'
;
break
;
}
}
}
//5555555555
//判断4种状态;
//1、玩家赢,返回*
//2、电脑赢, 返回#
//3、平局 返回Q
//4、继续 返回C
char
win_or_lose(
char
board[Hang][Lie],
int
hang,
int
lie)
{
int
i = 0;
int
j = 0;
int
count = 0;
//以下判断是电脑赢还是玩家赢
//赢(8中情况)得条件:一行三个都相同 或者 一列三个都相同 或者 对角线相同
for
(i = 0; i < hang; i++)
{
if
(board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] !=
' '
)
{
return
board[i][0];
}
if
(board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] !=
' '
)
{
return
board[0][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];
}
//以下是判断是不是平局
//平局条件:数组中没有空格(都被占满了) 并且 已经判断出来玩家电脑都没赢
for
(i = 0; i < hang; i++)
{
for
(j = 0; j < lie; j++)
{
if
(board[i][j] ==
' '
)
{
count++;
}
}
}
if
(count == 0)
{
return
'Q'
;
}
//不是平局,不是电脑赢,不是玩家赢,剩下的就是继续玩
return
'C'
;
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://blog.csdn.net/IT_Infector/article/details/119216692 。
最后此篇关于利用C语言实现三子棋(井字棋)小游戏的文章就讲到这里了,如果你想了解更多关于利用C语言实现三子棋(井字棋)小游戏的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在维护一些 Java 代码,我目前正在将它们转换为 C#。 Java 代码是这样做的: sendString(somedata + '\000'); 在 C# 中,我正在尝试做同样的事情: sen
如何确定函数中传递的参数是字符串还是字符(不确定如何正确调用它)文字? 我的函数(不正确): void check(const char* str) { // some code here }
我真的不知道如何准确地提出这个问题,但我希望标题已经说明了这一点。 我正在寻找一种方法(一个框架/库),它提供了执行 String.contains() 函数的能力,该函数告诉我给定的字符串是否与搜索
我正在尝试编写一些读取 Lambda 表达式并输出 beta 缩减版本的东西。 Lambda 的类型如下:\variable -> expression,应用程序的形式为 (表达式) (表达式)。因此
StackOverflow 上的第 1 篇文章,如果我没能把它做好,我深表歉意。我陷入了一个愚蠢的练习,我需要制作一个“刽子手游戏”,我尝试从“.txt”文件中读取单词,然后我得到了我的加密函数,它将
我想在 Groovy 中测试我的 Java 自定义注释,但由于字符问题而未能成功。 Groovyc: Expected 'a' to be an inline constant of type cha
当我尝试在单击按钮期间运行 javascript location.href 时,出现以下错误“字 rune 字中的字符过多”。 最佳答案 这应该使用 OnClientClick相反? 您可能还想停
我想要类似的东西: let a = ["v".utf8[0], 1, 2] 我想到的最接近的是: let a = [0x76, 1, 2] 和 "v".data(using: String.Encod
有没有办法在 MySQL 中指定 Unicode 字 rune 字? 我想用 Ascii 字符替换 Unicode 字符,如下所示: Update MyTbl Set MyFld = Replace(
阅读 PNG 规范后,我有点惊讶。我读过字 rune 字应该用像 0x41 这样的二进制值进行硬编码,而不是在(程序员友好的)'A' 中。问题似乎是在具有不同底层字符集的不同系统上编译期间字 rune
考虑一个具有 UTF-8 执行字符集的 C++11 编译器(并且符合要求 char 类型为有符号 8 位字节的 x86-64 ABI) . 字母 Ä(元音变音)具有 0xC4 的 unicode 代码
为什么即使有 UTF-8 字符串文字,C11 或 C++11 中也没有 UTF-8 字 rune 字?我知道,一般来说,字 rune 字表示单个 ASCII 字符,它与单字节 UTF-8 代码点相同,
我怎样才能用 Jade 做到这一点? how would I do this 我几乎可以做任何事情,除了引入一个 span 中间句子。 最佳答案 h3.blur. how would I do t
这似乎是一个非常简单的问题,但我只是想澄清我的疑问。我正在查看其他开发人员编写的代码。有一些涉及 float 的计算。 示例:Float fNotAvlbl = new Float(-99); 他为什
我想知道第 3 行“if dec:”中的“dec”是什么意思 1 def dec2bin(dec): 2 result='' 3 if dec:
我试图在字符串中查找不包含任何“a”字符的单词。我写了下面的代码,但它不起作用。我怎么能对正则表达式说“不包括”?我不能用“^”符号表示“不是”吗? import re string2 = "asfd
这个问题在这里已经有了答案: Is floating point math broken? (31 个答案) Is floating point arbitrary precision availa
我正在创建一个时尚的文本应用程序,但在某些地方出现错误(“字 rune 字中的字符太多”)。我只写了一个字母,但是当我粘贴它时,它会转换成许多这样的字母:“\uD83C\uDD89”,原始字母是“🆉
我正在尝试检查用户是否在文本框中输入了一个数字值,是否接受了小数位。非常感谢任何帮助。 Private Sub textbox1_AfterUpdate() If IsNumeric(textbox1
我知道一个 Byte 是 8 位,但其他的代表什么?我正在参加一个使用摩托罗拉 68k 架构的汇编类(class),我对目前的词汇感到困惑。 最佳答案 如 operator's manual for
我是一名优秀的程序员,十分优秀!