作者:你我皆为凡人
博客主页:你我皆为凡人的博客
名言警句:时间不会为任何人停留,而事物与人,无时不刻也在变化着。每一个人,也都在不停向前!
觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!
系列作品:
C语言编程刷题篇
经典题型系列
目录
文章目录
前言
主框架的搭建
游戏的实现
初始化棋盘
打印棋盘
玩家下棋
判断输赢
电脑下棋
判断输赢
总代码
总结
初学者学习C语言,想实行第一个小游戏来检查一下自己之前所学的知识牢固不牢固,那么这个三子棋小游戏是不二人选
提示:以下是本篇文章正文内容,下面案例可供参考
1:先准备好游戏目录,规则为 1 为玩游戏 0 为退出游戏
2:打印完目录,准备输出数字,如果1,就开始游戏,如果0,就退出游戏,如果是其他返回并重新输入数字,这时候就需要循环了,因为至少需要执行一次,所以用do,while循环,条件为输入的那个数,因为如果是0,为假,直接不进去,而其他的两个可以反复
void memu()
{
printf("*****************************\n");
printf("************* 0 exit *******\n");
printf("************* 1 play *******\n");
printf("*****************************\n");
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
memu();
printf("请输入你的选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("开始我们的三子棋游戏\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("好兄弟,选错了,重新输入\n");
break;
}
} while (input);
return 0;
}
1,需要准备一个二维数组来存放一个三乘三的棋盘
2,定义函数与参数,并且在头文件中声明
3,棋盘初始化时,需要看起来是空白的,所以把棋盘初始化为空格
void Initboard(char board[ROW][COL],int row,int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
1,声明和定义打印棋盘的函数
2,棋盘可以看为两部分,数据为一部分,分隔符为一部分,打印数据时,为数据和|,如果最后一列的时候,就不需要打印|了,接下来打印分隔符与|,同上,在最后一行的时候不需要打印分隔符,打印完换行
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)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf("---");
if(j
1,玩家下棋需要输入下标,需要看坐标是否在范围之内,如果坐标合法
2,坐标合法需要看这个范围内有没有被占用,如果没有被占用则等于*
3,注意的是,输入的坐标和数组的坐标是相差的,需要减一才能相等
void playmove(char board[ROW][COL], int row, int col)
{
//确定下标
int x = 0;
int y = 0;
printf("玩家下棋:\n");
while (1)
{
printf("请输入你要输入的坐标:>\n");
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");
}
}
}
1,当玩家输入后需要判断一下玩家是否赢了,我们给一个判断原则,如果返回q,则平局并不再进行,如果返回c,则代表没有人赢并继续,如果返回*则玩家赢了,如果返回#则电脑赢了
2,赢的条件有三种,行三个相等,列三个相等并且两条对角线是三条相等,既然这样,那么如果相等并且不等于空格的时候则返回这个数,这个数等于*或者#
3,定义一个函数用来查看有没有满,并且没有赢则平局,规则是如果满了则返回1,如果没满则返回0
4,最后一种情况是棋盘没有满,继续的情况
int isfull(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] != ' ')
{
return 0;
}
}
}
return 1;
}
char iswin(char board[ROW][COL], int row, int col)
{
//判断行
int i = 0;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
{
return board[i][1];
}
}
//判断列
int j = 0;
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
{
return board[1][j];
}
}
//判断对角线
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];
}
if (isfull(board, row, col))
{
return 'q';
}
return 'c';
}
1,当电脑下棋时,需要设置一个随机生成的数,需要用到rand与srand函数,而且生成的下标需要是行与列,那么就对行与列取模生成
2,判断坐标有没有被占用,没有就输出#
void conputermove(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,当电脑输入后需要判断一下电脑是否赢了,我们给一个判断原则,如果返回q,则平局并不再进行,如果返回c,则代表没有人赢并继续,如果返回*则玩家赢了,如果返回#则电脑赢了
2,赢的条件有三种,行三个相等,列三个相等并且两条对角线是三条相等,既然这样,那么如果相等并且不等于空格的时候则返回这个数,这个数等于*或者#
3,定义一个函数用来查看有没有满,并且没有赢则平局,规则是如果满了则返回1,如果没满则返回0
4,最后一种情况是棋盘没有满,继续的情况
int isfull(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] != ' ')
{
return 0;
}
}
}
return 1;
}
char iswin(char board[ROW][COL], int row, int col)
{
//判断行
int i = 0;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
{
return board[i][1];
}
}
//判断列
int j = 0;
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
{
return board[1][j];
}
}
//判断对角线
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];
}
if (isfull(board, row, col))
{
return 'q';
}
return 'c';
}
主框架的实现
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void game()
{
char ret = 0;
char board[ROW][COL] = { 0 };
//初始化棋盘
Initboard(board, ROW, COL);
//打印棋盘
Displayboard(board,ROW,COL);
while (1)
{
//玩家下棋
playmove(board, ROW, COL);
//判断输赢
ret = iswin(board,ROW,COL);
//显示棋盘
Displayboard(board, ROW, COL);
if (ret != 'c')
{
break;
}
//电脑下棋
conputermove(board, ROW, COL);
//判断输赢
ret = iswin(board, ROW, COL);
//显示棋盘
Displayboard(board, ROW, COL);
if (ret != 'c')
{
break;
}
}
if (ret == 'q')
{
printf("平局\n");
}
else if (ret == '#')
{
printf("电脑赢了\n");
}
else
{
printf("玩家赢了\n");
}
Displayboard(board, ROW, COL);
}
void memu()
{
printf("*****************************\n");
printf("************* 0 exit *******\n");
printf("************* 1 play *******\n");
printf("*****************************\n");
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
memu();
printf("请输入你的选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("开始我们的三子棋游戏\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("好兄弟,选错了,重新输入\n");
break;
}
} while (input);
return 0;
}
函数的声明-头文件
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#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 playmove(char board[ROW][COL],int row,int col);
//电脑下棋
void conputermove(char board[ROW][COL], int row, int col);
// q 退出
// * 玩家赢了
// # 电脑赢了
// c 继续
char iswin(char board[ROW][COL], int row, int col);
游戏内部的实现
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
//初始化棋盘
void Initboard(char board[ROW][COL],int row,int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
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)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf("---");
if(j\n");
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 conputermove(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;
}
}
}
int isfull(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] != ' ')
{
return 0;
}
}
}
return 1;
}
char iswin(char board[ROW][COL], int row, int col)
{
//判断行
int i = 0;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
{
return board[i][1];
}
}
//判断列
int j = 0;
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
{
return board[1][j];
}
}
//判断对角线
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];
}
if (isfull(board, row, col))
{
return 'q';
}
return 'c';
}
这篇是对于新手可以上手实现的第一个较简单的三子棋小游戏,因为是对于新手时期的,没有进行代码优化,尽量让初学者可以看懂,并且自己来进行优化代码,比如实现N子棋的玩法,电脑太笨怎么办,总是自己赢,如何让玩家赢不了电脑,这个代码有很大的改进空间,俗话说没有笨的电脑,只有笨的程序员,优化后的代码正在构思中,实现玩家与电脑的高超对弈,敬请期待,如果觉得凡人写的还可以,请多多支持,当然了,这个是对于新手写的,大佬们肯定觉得就是菜鸟级别的,勿喷蛤,感谢各位观看!!!