(C语言学习笔记)三子棋小游戏

这是一个使用C语言编写的井字游戏程序,包括主函数`main.c`,头文件`game.h`和`game.c`实现函数。游戏包括玩家和电脑轮流在3x3的棋盘上下棋,判断输赢和平局。玩家通过输入坐标进行移动,电脑则随机选择位置。程序还包含一个测试函数用于选择游戏模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主函数(main.c)

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<string.h>
#include<Windows.h>
#include "game.h"



int b=0;

void begin_interface()
{
	printf("************************************************\n");
	printf("****************    第%d轮游戏    ***************\n",b);
	printf("************************************************\n");
}


void game()//游戏的整个实现
{
	char board[ROW][COL]={0};//定义棋盘数组
	char ret =0;
	IntBoard(board,ROW,COL);//初始化棋盘
	DisplayBoard(board,ROW,COL);//打印棋盘
	while(1)
	{
		Playermover(board,ROW,COL);//玩家下棋
		DisplayBoard(board,ROW,COL);//打印棋盘
		ret=IsWin(board,ROW,COL);//判断输赢
		if(ret != 'C')//判断是否继续
		{
			break;
		}
		//玩家赢--*
		//电脑赢--#
		//平局----Q
		//继续----C
		ComputerMove(board,ROW,COL);//电脑下棋
		DisplayBoard(board,ROW,COL);
		ret=IsWin(board,ROW,COL);//判断输赢
		if(ret != 'C')
		{
			break;
		}
	}
	if(ret == '*')
		{
			printf("玩家胜利\n");
		}
   if(ret == '#')
		{
			printf("电脑胜利\n");
		}

   if(ret == 'Q')
		{
			printf("平局\n");
		}
 
}

void test()
{
	int i=1;
	srand((unsigned)time(NULL));//设置随机起点
	for(;i;)
	{
		int choice=0;int c=0;
		printf("请选择游戏模式:");
		scanf("%d",&choice);
		/*if(a==1 ||a==2)
		    c=a;
		else 
			c=3;*/
		switch(choice)//只能输入数字
		{
		case 1:
			b++;
			begin_interface();
			game();
			//printf("游戏开始。\n");
			break;
		case 2:
			i=0;
			printf("游戏结束。\n");
			break;
		default:
			printf("输入错误,请重新输入...........\n");//这里输入的如果不是数字,代码崩溃
			break;
		}
	}
}



int main()
{
	test();
	return 0;
}

2.头文件(game.h)

#define ROW 3
#define COL 3
#include<stdio.h>
#include<string.h>
#include<Windows.h>
#include<stdlib.h>//srand,rand
#include<time.h>//时间time
 
#ifndef _GAME_H_
#define _GAME_H_
 
void IntBoard(char board[ROW][COL],int row,int col);
void DisplayBoard(char board[ROW][COL],int row,int col);
void Playermover(char board[ROW][COL],int row,int col);
void ComputerMove(char board[ROW][COL],int row,int col);
char IsWin(char board[ROW][COL],int row,int col);//判断输赢

#endif

3.主要函数.c文件(game.c)

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
#include <stdio.h>

void IntBoard(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;int j=0;
	for(i=0;i<row;i++)
	{
		for(j=0;j<col;j++)//打印一行"   |   |   "
		{
			printf(" %c ",board[i][j]);
			if(j<col-1)
			{
				printf("|");
			}
		}
		printf("\n");//换行

		if(i<row-1)//打印分割行
		{
			for(j=0;j<col;j++)
			{
				 printf("___");
				 if(j<col-1)
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
}

void Playermover(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("该坐标被占用,请重新输入坐标。");
			}
		}
		else
		{
			printf("坐标非法,请重新输入");
		}
	}
}

void ComputerMove(char board[ROW][COL],int row,int col)
{
	int x=0;int y=0;
	printf("请等待电脑走棋.........\n");
	while(1)
   {
		x=rand()%row;
	    y=rand()%col;//x,y除余永远不可能为3,只能为0,1,2,所以减1,电脑就永远取不到2
		if(board[x][y]== ' ')//这里board[][],要为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;
	for(i=0;i<row;i++)//横三行
	{
		if(board[i][0]==board[i][1] && board[i][1]==board[i][2] && board[i][0] !=' ')
		{
			return board[i][1];
		}
		
	}

	for(i=0;i<col;i++)//竖三列
	{
		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];
		}
	//判断是否平局
	if(1==IsFull(board,ROW,COL))
	{
		return 'Q';
	}
	return 'C';
}

4.结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值