走向人生巅峰之心理健康课上写游戏!!!

三子棋游戏

  • 什么是三子棋
  • 游戏规则
  • 编写游戏的思路
  • 知识点
    • 1.分支和循环语句
    • 2.函数
    • 3.数组
  • 三子棋代码(含解释)
  • 运行结果
    • 1.玩家赢
    • 2.电脑赢
    • 3.平局很难(电脑太傻了!!!)
  • 寄予

什么是三子棋

三子棋是黑白棋的一种。三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时候会出现和棋的情况。
走向人生巅峰之心理健康课上写游戏!!!_第1张图片
走向人生巅峰之心理健康课上写游戏!!!_第2张图片

游戏规则

玩家每人选择一种棋子(#或*(也可以根据自己的喜好选择其他的)),先三个棋子连成一线的一方为胜方,横向、竖向、斜向均可。

编写游戏的思路

首先创建test.c 是测试游戏逻辑的代码,创建game.h 关于游戏相关的函数声明,符号声明,以及头文件的包含,创建game.c 游戏相关函数的实现,分为这三个模块。(编写本游戏所用的编辑器是Visual Studio 2019
思路:1.创建一个游戏菜单; 2.创建一个九宫格;3.创建玩家下棋和电脑下棋(电脑下棋时比较傻(算法比较简单))的函数;4.写出对弈结果(1.玩家赢 2.电脑赢 3.平局)

知识点

写三子棋所以用的编程语言是C语言

1.分支和循环语句

a.if…else语句
b.if…else if…else 语句
c.switch 语句
d.break 的使用
e.while循环语句
f,do…while()语句
g.for 循环语句

2.函数

a.头文件的包含
b.符号的定义
c.函数的声明和定义
d.函数的调用(传值调用,传址调用)
e.函数的嵌套调用

3.数组

a.二维数组的创建和初始化
b.二维数组的使用
c.二维数组在内存中的存储
d.数组作为函数的传参

三子棋代码(含解释)

game.h
#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 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);


//
//1. 玩家赢了 - *
//2. 电脑赢了 - #
//3. 平局 - Q
//4. 游戏继续 - C

//判断游戏是否有输赢
char IsWin(char board[ROW][COL], int row, int col);

int IsFull(char board[ROW][COL], int row, int col);
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()//创建游戏菜单
{
     
	printf("******************************\n");
	printf("******    1. play        *****\n");
	printf("******    0. exit        *****\n");
	printf("******************************\n");
}
void game()
{
     
	//存储数据 - 二维数组
	char board[ROW][COL];
	//初始化棋盘 - 初始化空格
	InitBoard(board, ROW, COL);
	//打印一下棋盘 - 本质是打印数组的内容
	DisplayBoard(board, ROW, COL);
	char ret = 0;//接受游戏状态
	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()
{
     
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
     
		menu();

		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
     
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);
	return 0;

}
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#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++)
//	{
     
//		printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
//		if(i
//			printf("---|---|---\n");
//	}
//}
//


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 < row;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", &i, &j);
		if (board[i-1][j-1] == ' ')
		{
			board[i-1][j-1] == '*';
			break;
		}
		else
		{
			printf("请重新输入");
		}
	}*/
	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)
{
     
	while (1)
	{
     
		int i = rand() % row;
		int j = rand() % col;
		if (board[i][j] == ' ')
		{
     
			board[i][j] = '#';
			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];
		}
	}
	//判断三列
	for (i = 0; i < col; i++)
	{
     
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
		{
     
			return board[1][i];
		}
	}
	//判断对角线
	if(board[0][0]== board[1][1]&& board[2][2]== board[0][0]&&board[2][2] != ' ')
		return board[1][1];
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0]&& board[2][0] !=' ')
		return board[1][1];

	//判断平局
	//如果棋盘满了返回1, 不满返回0
	int ret = IsFull(board, row, col);
	if (ret == 1)
	{
     
		return 'Q';
	}
	return 'C';
}

运行结果

1.玩家赢

走向人生巅峰之心理健康课上写游戏!!!_第3张图片

2.电脑赢

走向人生巅峰之心理健康课上写游戏!!!_第4张图片

3.平局很难(电脑太傻了!!!)

这里就不演示了。

寄予

个人认为:三子棋游戏适合初学C语言或C++的学者学习练习,在这里本博主希望每个人都等成为IT界的大牛,走向人生巅峰!!!

如果代码有问题或者改进的地方请大佬在评论区给我纠错 万分感谢!!!

走向人生巅峰之心理健康课上写游戏!!!_第5张图片

本游戏纯属在课上写的(电脑的函数算法简单(算不智能))
后期会改进!!!

你可能感兴趣的:(C语言,编程语言,C++,编程语言,游戏,游戏开发)