C语言三子棋小游戏

三子棋小游戏

初学C语言,我们可以做一些小游戏,既能提高我们对c的理解,也能增强我们的实践能力。接下来我们一起去完成这个小游戏:三子棋。

三子棋首先得有一个3*3的棋盘,这个棋盘上还得有棋子,然后是玩家走一步,电脑走一步,每走一步还需要判断输赢。

以上就是三子棋的基本逻辑,现在我们一步一步的实现。

  1. 初始化棋盘

    打印棋盘时,棋盘上的棋子不能是个随机的,我们要的是一个干净的棋盘,上面还未落子。所以先初始化棋盘。

    void chushihua(char borad[ROW][ROL], int row, int rol)
    {
    	for (int i = 0; i < row; i++)
    	{
    		for (int j = 0; j < rol; j++)
    		{
    			borad[i][j] = ' ';
    		}
    	}
    }
    

    这样我们的棋子一上来就是全空的状态。

  2. 打印棋盘

    棋盘上的棋子已经初始化好了,我们需要一个函数来把棋盘打印出来,之后的对局,每走一步,也需要打印出来棋盘。

    void daying(char borad[ROW][ROL],int row, int rol)
    {
    	for (int i = 0; i < row; i++)
    	{
    		for (int j = 0; j < rol; j++)
    		{
    			printf(" %c ", borad[i][j]);
    			if (j < rol - 1)
    				printf("|");
    			
    		}
    		printf("\n");
    		if (i < row - 1)
    		{
    			for (int j = 0; j < rol; j++)
    			{
    				printf("---");
    				if (j < rol - 1)
    					printf("|");
    			}
    		}
    		printf("\n");
    	}
    	  
    }
    
  3. 玩家走

    棋盘有了,就差下棋了,所以玩家走一步,再打印出棋盘。我们规定玩家走的棋子为’#’。

    void playermove(char borad[ROW][ROL], int row, int rol)
    {
    	printf("玩家请输入坐标,坐标用空格空开\n");
    	int a = 0; int b = 0;
    	again:
    	scanf("%d%d", &a, &b);
    	while (1)
    	{
    		if (a <= 3 && b <= 3)
    		{
    			if (borad[a - 1][b - 1] == ' ')
    			{
    				borad[a - 1][b - 1] = '*';
    				break;
    			}
    			else
    			{
    				printf("坐标已经占用,请重新输入\n");
    				goto again;
    			}
    		}
    		else
    		{
    			printf("坐标错误,请重新输入\n");
    			goto again;
    		}
    	}
    
    }
    
  4. 电脑走

    电脑走就是一个随机数了,不会再输入坐标了,所以代码如下:

    void computermove(char borad[ROW][ROL], int row, int rol)
    {
    	int x = 0; int y = 0;
    	printf("电脑走:\n");
    	
    	while (1)
    	{
    		x = rand() % row;
    		y = rand() % rol;
    		if (borad[x][y] == ' ')
    		{
    			borad[x][y] = '#';
    			break;
    		}
    
    	}
    }
    
  5. 判断输赢

    判断输赢的逻辑就是,行连成三个或列连成三个或对角线连成三个算赢。

    如果没满足以上条件,并且下满了,那么就是平局。

    再者,就是继续下棋。

    代码如下:

    char iswin(char borad[ROW][ROL], int row, int rol)
    {
    	//判断行
    	for (int i = 0; i < row; i++)
    	{
    		if (borad[i][0] != ' '&&borad[i][0] == borad[i][1] && borad[i][1] == borad[i][2])
    			return borad[i][0];
    	}
    	//判断列
    	for (int i = 0; i < row; i++)
    	{
    		if (borad[0][i] != ' '&&borad[0][i] == borad[1][i] && borad[1][i] == borad[2][i])
    			return borad[0][i];
    	}
    	//判断对角线
    	if (borad[0][0] == borad[1][1] && borad[1][1] == borad[2][2] && borad[0][0] != ' ')
    		return borad[0][0];
    	if (borad[0][2] == borad[1][1] && borad[1][1] == borad[2][0] && borad[0][2] != ' ')
    		return borad[0][2];
    	//平局
    	if (isfull(borad,ROW,ROL))
    		return 'Q';
    	//继续
    	return 'C';
    	
    }
    

    iswin函数返回的是’C‘就是游戏继续,返回的是’#‘电脑赢,返回’*‘玩家赢,返回’Q‘是平局。所以还需要有接收返回值的变量ret。

    if (ret == '*')
    	{
    		printf("玩家赢\n");
    	}
    	 if (ret == '#')
    	{
    		printf("电脑赢\n");
    	}
    	 if (ret == 'Q')
    		printf("平局\n");
    

    判断好输赢,这个游戏已经基本完成了。

    下面是游戏的代码:

    头文件:

    #pragma once
    #include<stdio.h>
    #define ROW 3
    #define ROL 3
    #include<stdlib.h>
    #include<time.h>
    void mune();
    void chushihua(char borad[ROW][ROL], int row, int rol);
    void daying(char borad[ROW][ROL], int row, int rol);
    void game();
    void playermove(char borad[ROW][ROL], int row, int rol);
    void computermove(char borad[ROW][ROL], int row, int rol);
    char  iswin(char borad[ROW][ROL], int row, int rol);
    
    

    三子棋游戏代码:

    #include"game.h"
    void mune()
    {
    	printf("*******************************************\n");
    	printf("******************三子棋*******************\n");
    	printf("******************请投币:******************\n");
    	printf("******************       ******************\n");
    	printf("******************       ******************\n");
    }
    void chushihua(char borad[ROW][ROL], int row, int rol)
    {
    	for (int i = 0; i < row; i++)
    	{
    		for (int j = 0; j < rol; j++)
    		{
    			borad[i][j] = ' ';
    		}
    	}
    }
    void daying(char borad[ROW][ROL],int row, int rol)
    {
    	for (int i = 0; i < row; i++)
    	{
    		for (int j = 0; j < rol; j++)
    		{
    			printf(" %c ", borad[i][j]);
    			if (j < rol - 1)
    				printf("|");
    			
    		}
    		printf("\n");
    		if (i < row - 1)
    		{
    			for (int j = 0; j < rol; j++)
    			{
    				printf("---");
    				if (j < rol - 1)
    					printf("|");
    			}
    		}
    		printf("\n");
    	}
    	  
    }
    void playermove(char borad[ROW][ROL], int row, int rol)
    {
    	printf("玩家请输入坐标,坐标用空格空开\n");
    	int a = 0; int b = 0;
    	again:
    	scanf("%d%d", &a, &b);
    	while (1)
    	{
    		if (a <= 3 && b <= 3)
    		{
    			if (borad[a - 1][b - 1] == ' ')
    			{
    				borad[a - 1][b - 1] = '*';
    				break;
    			}
    			else
    			{
    				printf("坐标已经占用,请重新输入\n");
    				goto again;
    			}
    		}
    		else
    		{
    			printf("坐标错误,请重新输入\n");
    			goto again;
    		}
    	}
    
    }
    void computermove(char borad[ROW][ROL], int row, int rol)
    {
    	int x = 0; int y = 0;
    	printf("电脑走:\n");
    	
    	while (1)
    	{
    		x = rand() % row;
    		y = rand() % rol;
    		if (borad[x][y] == ' ')
    		{
    			borad[x][y] = '#';
    			break;
    		}
    
    	}
    }
    int isfull(char borad[ROW][ROL], int row, int rol)
    {
    	for (int i = 0; i < row; i++)
    	{
    		for (int j = 0; j < rol; j++)
    		{
    			if (borad[i][j] == ' ')
    				return 0;
    		}
    	}
    	return 1;
    }
    char iswin(char borad[ROW][ROL], int row, int rol)
    {
    	//判断行
    	for (int i = 0; i < row; i++)
    	{
    		if (borad[i][0] != ' '&&borad[i][0] == borad[i][1] && borad[i][1] == borad[i][2])
    			return borad[i][0];
    	}
    	//判断列
    	for (int i = 0; i < row; i++)
    	{
    		if (borad[0][i] != ' '&&borad[0][i] == borad[1][i] && borad[1][i] == borad[2][i])
    			return borad[0][i];
    	}
    	//判断对角线
    	if (borad[0][0] == borad[1][1] && borad[1][1] == borad[2][2] && borad[0][0] != ' ')
    		return borad[0][0];
    	if (borad[0][2] == borad[1][1] && borad[1][1] == borad[2][0] && borad[0][2] != ' ')
    		return borad[0][2];
    	//平局
    	if (isfull(borad,ROW,ROL))
    		return 'Q';
    	//继续
    	return 'C';
    	
    }
    void game()
    {
    	char ret = 0;
    	char borad[ROW][ROL];
    	//初始化棋盘
    	chushihua(borad, ROW, ROL);
    	//打印棋盘
    	daying(borad, ROW, ROL);
    	while (1)
    	{
    		//玩家下棋
    		playermove(borad, ROW, ROL);
    		daying(borad, ROW, ROL);
    		//判断输赢
    		ret=iswin(borad,ROW,ROL);
    		if (ret != 'C')
    		{
    			break;
    		}
    		//电脑下棋
    		computermove(borad, ROW, ROL);
    		daying(borad, ROW, ROL);
    		//判断输赢
    		ret=iswin(borad,ROW,ROL);
    		if (ret != 'C')
    		{
    			break;
    		}
    	}
    	if (ret == '*')
    	{
    		printf("玩家赢\n");
    	}
    	 if (ret == '#')
    	{
    		printf("电脑赢\n");
    	}
    	 if (ret == 'Q')
    		printf("平局\n");
    }
    

    总程序代码:

    #include"game.h"
    int main()
    {  
    	srand((unsigned int)time(NULL));
    	int n = 0;
    	mune();
    	again:
    	scanf("%d", &n);
    	while (n)
    	{
    		game();
    		n--;
    	}
    	printf("游戏是否继续?请投币\n");
    	goto again;
    	return 0;
    }
    

    以上就是本期内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

动名词

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值