三子棋(初阶)

发布时间:2024年01月20日

使用VSC++2010

较为简单,适合新手攻略(纯纯的C语言)

这是主文件

#define CRT SECURE NO WARNINGS
#include"game.h"
#include<stdio.h>

void manu()
{
?? ?printf("************************************\n");
?? ?printf("************************************\n");
?? ?printf("******* ?1 . play ? 0 .exit ********\n");
?? ?printf("************************************\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");
?? ?}
?? ?/*DisplayBoard(board, ROW, COL);*/
}

int main()
{
?? ?int input = 0;
?? ?srand((unsigned int)time(NULL));//设置随机数的生成起点
?? ?do
?? ?{
?? ??? ?manu();//打印菜单
?? ??? ?printf("请选择:>");
?? ??? ?scanf("%d",&input);
?? ??? ?switch(input)
?? ??? ?{
?? ??? ?case 1:
?? ??? ??? ?game();//printf("三子棋\n");三子棋的游戏
?? ??? ??? ?break;
?? ??? ?case 0:
?? ??? ??? ?printf("退出游戏\n");
?? ??? ??? ?break;
?? ??? ?default:
?? ??? ??? ?printf("选择错误,请重新选择\n");
?? ??? ??? ?break;
?? ??? ?}

?? ?}while(input);

?? ?return 0;
}

#define CRT SECURE NO WARNINGS
#include"game.h"
#include<stdio.h>

void manu()
{
?? ?printf("************************************\n");
?? ?printf("************************************\n");
?? ?printf("******* ?1 . play ? 0 .exit ********\n");
?? ?printf("************************************\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");
?? ?}
?? ?/*DisplayBoard(board, ROW, COL);*/
}

int main()
{
?? ?int input = 0;
?? ?srand((unsigned int)time(NULL));//设置随机数的生成起点
?? ?do
?? ?{
?? ??? ?manu();//打印菜单
?? ??? ?printf("请选择:>");
?? ??? ?scanf("%d",&input);
?? ??? ?switch(input)
?? ??? ?{
?? ??? ?case 1:
?? ??? ??? ?game();//printf("三子棋\n");三子棋的游戏
?? ??? ??? ?break;
?? ??? ?case 0:
?? ??? ??? ?printf("退出游戏\n");
?? ??? ??? ?break;
?? ??? ?default:
?? ??? ??? ?printf("选择错误,请重新选择\n");
?? ??? ??? ?break;
?? ??? ?}

?? ?}while(input);

?? ?return 0;
}

这是头文件

#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 InitBoard(char board[3][3],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);

?
#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 InitBoard(char board[3][3],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);

?

这是主调游戏源代码

#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
#include<stdio.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++)
//?? ?{
//?? ??? ?//打印数据
//?? ??? ?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)
{
?? ?int i = 0;
?? ?for(i=0;i<row;i++)
?? ?{
?? ??? ?//打印数据
?? ??? ?//printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
?? ??? ?int j = 0;
?? ??? ?for(j=0;j<col;j++)
?? ??? ?{
?? ??? ??? ?printf(" %c ",board[i][j]);
?? ??? ??? ?if(j<col-1)
?? ??? ??? ?{
?? ??? ??? ??? ?printf("|");
?? ??? ??? ?}
?? ??? ?}
?? ??? ?printf("\n");
?? ??? ?//打印分割行
?? ??? ?/*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("请输入坐标\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("已占用,请重新选择");
?? ??? ? ? ?}
?? ? ? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?printf("坐标非法,请重新输入\n");
?? ? ? ?}
?? ?}
}

void ComputerMove(char board[ROW][COL],int row,int col)
{
?? ?int x = 0;
?? ?int y = 0;//C语言中,printf语句后再定义会报错的原因是因为C语言是一种静态类型语言,它要求在使用变量之前必须先进行声明!!!
?? ?printf("电脑下棋:>\n");
?? ?while(1)
?? ?{
?? ??? ?int x = rand()%row;//0~row-1 随机数?
?? ??? ?int y = rand()%col;//0~col-1随机数
?? ??? ?if(board[x][y] == ' ')
?? ??? ?{
?? ??? ??? ?board[x][y] = '#';
?? ??? ??? ?break;
?? ??? ?}
?? ?}
}

//满了返回1
//不满返回0
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;
?? ?int j = 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];
?? ??? ?}
?? ?}

?? ?/*for(i = 0;i < row;i++)
?? ?{
?? ??? ?for(j = 0;j < col;j++)
?? ??? ?{
?? ??? ??? ?if(board[i][j] == board[i][j+1]&&board[i][j] != ' ')
?? ??? ??? ?{
?? ??? ??? ??? ?return board[i][j];
?? ??? ??? ?}
?? ??? ?}
?? ?}*/


?? ?//列
?? ?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];
?? ??? ?}
?? ?}

?? ?//for(j = 0;j < col;j++)
?? ?//{
?? ?//?? ?for(i = 0;i < row;i++)
?? ?//?? ?{
?? ?//?? ??? ?if(board[i][j] == board[i+1][j]&&board[i][j] != ' ')
?? ?//?? ??? ?{
?? ?//?? ??? ??? ?return board[i][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];
?? ?}

?? ?/*for(j = 0;j < col;j++)
?? ?{
?? ??? ?for(i = 0;i < row;i++)
?? ??? ?{
?? ??? ??? ?if(i == j&&board[i][j] == board[i+1][j+1]&&board[i][j] != ' ')
?? ??? ??? ?{
?? ??? ??? ??? ?return board[i][j];
?? ??? ??? ?}
?? ??? ?}
?? ?}*/
?? ?//没有人赢,要平局
?? ?if(IsFull(board, ROW, COL))
?? ?{
?? ??? ?return 'Q';
?? ?}
?? ?//游戏继续
?? ?return 'C';
}

#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
#include<stdio.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++)
//	{
//		//打印数据
//		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)
{
	int i = 0;
	for(i=0;i<row;i++)
	{
		//打印数据
		//printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
		int j = 0;
		for(j=0;j<col;j++)
		{
			printf(" %c ",board[i][j]);
			if(j<col-1)
			{
				printf("|");
			}
		}
		printf("\n");
		//打印分割行
		/*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("请输入坐标\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("已占用,请重新选择");
		    }
	    }
		else
		{
			printf("坐标非法,请重新输入\n");
	    }
	}
}

void ComputerMove(char board[ROW][COL],int row,int col)
{
	int x = 0;
	int y = 0;//C语言中,printf语句后再定义会报错的原因是因为C语言是一种静态类型语言,它要求在使用变量之前必须先进行声明!!!
	printf("电脑下棋:>\n");
	while(1)
	{
		int x = rand()%row;//0~row-1 随机数 
		int y = rand()%col;//0~col-1随机数
		if(board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

//满了返回1
//不满返回0
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;
	int j = 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];
		}
	}

	/*for(i = 0;i < row;i++)
	{
		for(j = 0;j < col;j++)
		{
			if(board[i][j] == board[i][j+1]&&board[i][j] != ' ')
			{
				return board[i][j];
			}
		}
	}*/


	//列
	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];
		}
	}

	//for(j = 0;j < col;j++)
	//{
	//	for(i = 0;i < row;i++)
	//	{
	//		if(board[i][j] == board[i+1][j]&&board[i][j] != ' ')
	//		{
	//			return board[i][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];
	}

	/*for(j = 0;j < col;j++)
	{
		for(i = 0;i < row;i++)
		{
			if(i == j&&board[i][j] == board[i+1][j+1]&&board[i][j] != ' ')
			{
				return board[i][j];
			}
		}
	}*/
	//没有人赢,要平局
	if(IsFull(board, ROW, COL))
	{
		return 'Q';
	}
	//游戏继续
	return 'C';
}

游戏还是有点不完善,我想把三子棋变成多子棋,后期会花时间继续完善

也希望大佬们帮帮我

我磕上两个? ? 咚—咚—

谢谢啦

文章来源:https://blog.csdn.net/2301_78235522/article/details/135700419
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。