参考了B站UP主 比特鹏哥 的教程视频
简单实现三子棋+改进后多子棋
1.环境搭建
此处我们采用多文件联合实现。首先我们创建三个文件分别为头文件(gane.h),源文件(game.c和test.c),编译器采用vs2022.
2.游戏的实现代码
test.c
该部分代码实现游戏运行的主函数
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void menu() {
printf("---------------------------------------\n");
printf("------------1.start--------------------\n");
printf("------------0.exit -------------------\n");
printf("---------------------------------------\n");
}
void game() {
char ret = 0;
char board[ROW][COL] = { 0 };
InitBoard(board, ROW, COL);//初始化棋盘
DisplayBoard(board, ROW, COL);//打印棋盘
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() {
srand((unsigned int)time(NULL));
int input;
do {
menu();
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;
}
game.c
该部分代码实现游戏的运行,将其他函数写入该文件
#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) {
// for (int i = 0;i < row;i++) {
// printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
// if (i<row -1)
// {
// printf("---|---|---\n");
// }
// }
//}
//版本二
void DisplayBoard(char board[ROW][COL], int row, int col) {
for (int i = 0;i < row;i++) {
for (int 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 < col - 1) {
printf("|");
}
}
printf("\n");
}
}
}
//玩家下棋
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 ComputerMove(char board[ROW][COL], int row, int col) {
printf("电脑下棋:>\n");
int x = 0;
int y = 0;
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) {
for (int i = 0; i < row; i++)
{
for (int 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;
int j = 0;
for (i = 0; i < row; i++)
{
j = 0;
for (j = 0; j < col - 1; j++)
{
if (board[i][j] != board[i][j + 1] || board[i][j] == ' ')
break;
}
if (j == col - 1)
return board[i][j];
}
//列
i = 0;
j = 0;
for (j = 0; j < col; j++)
{
i = 0;
for (i = 0; i< row; i++)
{
if (board[i][j] != board[i+1][j] || board[i][j] == ' ')
break;
}
if (i == row - 1)
return board[i][j];
}
//对角线(主)
j = 0;
for (j = 0; j < col - 1; j++)
{
if (board[j][j] != board[j + 1][j + 1] || board[j][j] == ' ')
break;
}
if (j == col - 1)
return board[j][j];
//对角线(副)
j = col-1;
i = 0;
while (j) {
if (board[i][j] != board[i + 1][j - 1] || board[i][j] == ' ') {
break;
}
i++;
j--;
}
if (j == 0)
return board[i][j];
//判断棋盘是否下满棋
if (IsFull(board, row, col)==1) {
return 'Q';
}
return 'C';
}
game.h
把游戏所需的头文件和函数写进该文件。
#pragma once
#include<stdio.h>
#include<time.h>
#include<stdlib.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);
//判断输赢
/*
玩家赢 - '*'
电脑赢 - '#'
平局 - 'Q'
继续 - 'C'
*/
char IsWin(char board[ROW][COL],int row,int col);
3.总结
改进的游戏是:对ROW和COL进行改写就能实现多子棋,但是还是有一定的缺陷,比如当ROW和COL都等于10的时候,那么这个游戏就是十字棋(行列都是10),不能随意去实现几个子连起来完成游戏(比如你想五子连成就赢得游戏),仅仅只能是一行或一列或对角线都是任意一方的棋子才能赢得游戏。
这是我第一次实现C语言编写小游戏,有些地方花了些许时间去理解,当然我也不敢保证我完全弄懂了,所以我把我的学习过程分享给大家,希望对一些和我一样的新手有帮助,也希望有大佬能指点指点。