目录
1.三子棋预估功能分析
2.三子棋各功能实现
3.三子棋代码呈现
前言:相信大家都玩过各种各样的小游戏,比如有:三子棋、五子棋、扫雷、贪吃蛇、推箱子......
身为一名小小程序员,你是否有想自己做出这些小游戏的冲动呢?今天给大家带来的是“三子棋”的
分享,希望对大家代码的学习有些许的帮助!
这部分,体现的时整体思路的框架,在没正式写程序之前的功能预估判断,当然也需要在之后开始写的时候再补充。
现在要做的就是从一张白纸上想,如何实现一份三子棋!
开始前,要确定好,三子棋是要放在什么C语言的结构里,很明显,要放在一个字符二维数组!这相信不必多言吧!
第一小步:首先,要有的功能肯定是一个开始进入游戏界面--->menu()函数!因为可以一部到位写出,也就没有必要提前预设好过后再写,所以直接按自己想要的界面编写一个menu函数
第二小步:在程序的运行过程中要有一个游戏进入的窗口--->game()函数!
第三小步:要初设棋盘,每一次三子棋的重新开始都要有一个初设这个二维数组的过程,如果玩完第一次要进行第二次,不将之前的信息覆盖掉,或者说没有再次初始化,会出大问题,相信大家一定也吃过亏!如果还没来得及吃这个亏,孩子真走运♥,等你吃到这个亏就会大涨记性,想起我说的话/(ㄒoㄒ)/~~ --->InitBoard()函数!
第四小步:棋盘的呈现,玩家和计算机走的每一步过后都应该汇报新的进展把棋盘打印出来是最直接的方式,这也是必不可少的部分--->DispalyBoard()函数!
第五六步:也就是玩家和电脑下棋的过程,---> PlayerMove()函数和ComputerMove()函数
第七步:判断输赢,以及游戏是否继续,IsWin()函数!
第.....步:真正开始书写的时候才想到的再进行补充!
在开始到实现,所有功能中,合理运用各种结构,很多都并不难实现,而我想补充的是:在第六步中,电脑如何实现随机下步!
随机下步,顾名思义就要取随机数!但是我们又要保证随机数产生在1-3之间,这个是让人头痛的地方,接下来就是可以帮助大家以后再次用的某范围内随机数的小方法!
首先我们知道,在C语言和C++中,库函数给的形成随机数的函数有rand()(在#include
首先我们的问题是运用这个函数并不能实现在1-3这个范围内实现随机数,其次用过这个函数的人都知道这个形成随机数的函数并不随机!(有一定功底的同学应该懂我说的什么意思吧)对这个问题抱有疑问的同学,建议用这个函数并且多次打印尝试一下,会发现产生的数是随机的,但是每次产生的数都是一样的(我自己觉得说起来都觉得拗口,请大家务必自己尝试一下就懂我的意思了!)
那我们就要解决这俩小问题!
第一个问题,我们要把这个随机数的范围固定,方法如下:
如果想要产生0-99 ------> rand()%100
如果想要产生0-66 ------>rand()%67
如果想要产生1-99 ------> rand()%99+1
如果想要产生1-100 ------> rand()%100+1
........
相信各位已经顿悟了!事实上我们并没有改变这个随机数的本身,而是把它进行了处理例如%100,的结果一定是0-99,整除100的余数一定在0-99之间,如果想要改变下界,就需要稍微动动小脑筋,那么我要得到1-3直接的随机数便是rand()%3+1,但是在二维数组里按照序号我们实质上需要0-2的数所以改成rand()%3即可!!!!
第二个问题,就要从随机数如何产生说起,rand()产生随机数是固定的是srand()闹得鬼,了解srand()究竟是何方神圣就交给各位自行探索啦
直接提供解决方案:
在main()中添加一行srand((unsigned int)time(NULL));并且包含time.h的头文件即可!
别问我为啥不讲,因为小编马上要去帮舍友表白,求各位原谅!后续会补上这段讲解sorry各位♥
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#define ROW 3
#define COL 3
void menu() {
printf("**********************\n");
printf("*******三子棋游戏*****\n");
printf("******1.开始游戏******\n");
printf("******0.结束游戏******\n");
printf("**********************\n");
}
char IsWin(char board[ROW][COL], int row, int col);
//玩家赢返回*
//电脑赢返回#
//平局 返回Q
//继续 返回C
void InitBoard(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
void game();
void PlayerMove(char board[ROW][COL], int row, int col);
void DispalyBoard(char board[ROW][COL], int row, int col);
int main() {
srand((unsigned int)time(NULL));
int input = 0;
do {
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input){
case 1 :
game();
break;
case 0 :
printf("退出游戏\n");
break;
default:
printf("请重新选择!\n");
break;
}
} while (input);
return 0;
}
char IsWin(char board[ROW][COL], int row, int col) {
//行
for (int i = 0; i < row; i++) {
if (board[i][0] != ' ' && board[i][0] == board[i][1] && board[i][2] == board[i][1]) {
return board[i][1];
}
}
//列
for (int j = 0; j < col; j++) {
if (board[0][j] != ' ' && board[0][j] == board[1][j] && board[2][j] == board[1][j]) {
return board[1][j];
}
}
//对角线
if (board[0][0] != ' ' && board[0][0] == board[1][1] && board[1][1] == board[2][2]) {
return board[0][0];
}
if (board[0][2] != ' ' && board[0][2] == board[1][1] && board[1][1] == board[2][0]) {
return board[0][2];
}
//如果有空格就是继续
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (board[i][j] == ' ') {
return 'C';
}
}
}
//不是赢和继续就是平局
return 'Q';
}
void InitBoard(char board[ROW][COL], int row, int col) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
board[i][j] = ' ';
}
}
}
void ComputerMove(char board[ROW][COL], int row, int col) {
printf("电脑下棋\n");
int x = 0;
int y = 0;
while (1) {
x = rand() % row;//0-2
y = rand() % col;//0-2
if (board[x][y] == ' ') {
board[x][y] = '#';
break;
}
}
}
void game() {
char board[ROW][COL] = { 0 };//初始化棋盘
InitBoard(board, ROW, COL);
DispalyBoard(board, ROW, COL);
char ch;
while (1) {
PlayerMove(board, ROW, COL);
ch = IsWin(board, ROW, COL);
if (ch != 'C') {
break;
}
DispalyBoard(board, ROW, COL);
ComputerMove(board, ROW, COL);
ch = IsWin(board, ROW, COL);
if (ch != 'C') {
break;
}
DispalyBoard(board, ROW, COL);
}
if (ch == '*') {
printf("玩家赢了\n");
}
else if (ch == '#') {
printf("电脑赢了\n");
}
else {
printf("平局\n");
}
DispalyBoard(board, ROW, COL);
}
void PlayerMove(char board[ROW][COL], int row, int col) {
int x = 0;
int y = 0;
printf("请玩家下棋:>\n");
while (1) {
printf("请输入坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col) {
if (board[x - 1][y - 1] == ' ') {
board[x - 1][y - 1] = '*';
break;
}
else {
printf("坐标被占用,不能下棋,请选择其他位置\n");
}
}
else {
printf("坐标非法,请重新输入\n");
}
}
}
void DispalyBoard(char board[ROW][COL], int row, int col) {
for (int i = 0; i < row; i++) {
//printf(" %c | %c | %c \n");
for (int j = 0; j < col; j++) {
printf(" %c ", board[i][j]);
if (j < col - 1) {
printf("|");
}
}
printf("\n");
//printf("---|---|---\n);
if (i < row - 1) {
for (int j = 0; j < col; j++) {
printf("---");
if (j < col - 1) {
printf("|");
}
}
printf("\n");
}
}
}