首页 > 其他分享 >新人报到附加一个小作业(C语言实现的三子棋)

新人报到附加一个小作业(C语言实现的三子棋)

时间:2024-11-11 11:46:53浏览次数:3  
标签:新人 三子 C语言 int col board printf COL ROW

1.一个简单的自我介绍

我是来自宁夏大学软件工程的一名学生,因为从小喜欢玩游戏,长大对于计算机领域也产生了非常浓厚的兴趣,于是在高考结束后的志愿填报中毫不犹豫的全部选择了计算机专业,希望在接下来的学习中不断进步,在IT行业中发挥自己的光和热。

我的学习计划:在大一,学习C/C++以及数据结构;大二学习Linux,算法,MySQL以及QT。争取在大三找到自己的第一份实习offer。

自我感觉我对我的学习安排的任务很重,所以我打算投入更多的时间和精力,目前的战果是每天坚持4小时的额外学习,希望以后能够再有所突破。

最终目标:成为一位合格的工业软件开发工程师!

以下是最近完成的两个小作业

2.三子棋的实现以及代码逻辑分析(C语言实现)

为了让逻辑更加清晰,这里需添加一个头文件game.h(用于声明函数等),两个源文件game.c(用于函数存放)和test.c(代码运行)。

首先,一个游戏最主要的就是菜单,但是在制作菜单时考虑到游戏需要重复运行,所以这里采用do...while来制作。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void menu()
{
	printf("                    \n");
	printf("       1.play       \n");
	printf("       0.exit       \n");
	printf("                    \n");

}

void test()
{
	int input;
	do
	{
		menu();
		printf("请选择>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("进行游戏\n");
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新输入\n");
			break;
		}
	} while(input);
}

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

这样我们就可以完成打印菜单的操作,想要进行游戏,我们先在case 1中printf部分替换为game()函数,接下来我们来完成这个小游戏的制作。

对于3*3的棋盘。我首先想到的是利用数组来完成坐标的表示以便达到目的,那么首先进行棋盘的初始化以及打印。

//test.c
void game()
{
	srand((unsigned int)time(NULL));
	char board[ROW][COL];
	//初始化棋盘
	init_board(board,ROW,COL);
	//打印棋盘
	print_board(board,ROW,COL); 
}
//game.h
//初始化棋盘
void init_board(char board[ROW][COL], int row, int col);
//打印棋盘
void print_board(char board[ROW][COL], int row, int col);
//game.c
void init_board(char board[ROW][COL], int row, int col)
{
	int i;
	for (i = 0; i < row; i++)
	{
		int j;
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}
void print_board(char board[ROW][COL], int row, int col)
{
	int i;
	for (i = 0; i < row; i++)
	{
		int j;
		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");
		}
		
	}
}

然后便是玩家和电脑的操作阶段,电脑这里的随机性采用时间戳的方式:

//test.c
while (1)
{
	//玩家行动
	player(board, ROW, COL);
	print_board(board, ROW, COL);
    //电脑行动
    computer(board, ROW, COL);
    print_board(board, ROW, COL);
}
//game.h
//玩家下棋
void player(char board[ROW][COL], int row, int col);
//电脑下棋
void computer(char board[ROW][COL], int row, int col);
//game.c
void player(char board[ROW][COL], int row, int col)
{
	printf("玩家行动,请输入要下棋的坐标:");
	while (1)
	{
		int x = 0;
		int y = 0;
		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 computer(char board[ROW][COL], int row, int col)
{
	while (1)
	{ 
		printf("\n电脑行动\n");
		int x = rand() % row;
		int y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

最后加上判断输赢,就完成这个简单的游戏了,这边给出全部代码^_^

test.c:

#include "game.h"
void menu()
{
	printf("                    \n");
	printf("       1.play       \n");
	printf("       0.exit       \n");
	printf("                    \n");

}
void game()
{
	srand((unsigned int)time(NULL));
	char board[ROW][COL];
	//初始化棋盘
	init_board(board,ROW,COL);
	//打印棋盘
	print_board(board,ROW,COL); 
	while (1)
	{
		//玩家行动
		player(board, ROW, COL);
		print_board(board, ROW, COL);
		//判断输赢
		char ret = win(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
		//电脑行动
		computer(board, ROW, COL);
		print_board(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
	char ret = win(board, ROW, COL);
	if (ret == '#')
		printf("电脑赢了\n");
	else if (ret == '*')
		printf("玩家赢了\n");
	else if (ret == 'N')
		printf("平局\n");
}

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

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

game.h:

#define ROW 3
#define COL 3
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
//初始化棋盘
void init_board(char board[ROW][COL], int row, int col);
//打印棋盘
void print_board(char board[ROW][COL], int row, int col);
//玩家下棋
void player(char board[ROW][COL], int row, int col);
//电脑下棋
void computer(char board[ROW][COL], int row, int col);
//判断输赢
char win(char board[ROW][COL], int row, int col);

game.c

#include "game.h"

void init_board(char board[ROW][COL], int row, int col)
{
	int i;
	for (i = 0; i < row; i++)
	{
		int j;
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}
void print_board(char board[ROW][COL], int row, int col)
{
	int i;
	for (i = 0; i < row; i++)
	{
		int j;
		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 player(char board[ROW][COL], int row, int col)
{
	printf("玩家行动,请输入要下棋的坐标:");
	while (1)
	{
		int x = 0;
		int y = 0;
		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 computer(char board[ROW][COL], int row, int col)
{
	while (1)
	{ 
		printf("\n电脑行动\n");
		int x = rand() % row;
		int y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}
static int is_full(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 win(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][0];
	}	
	//判断列
	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 (is_full(board, row, col) == 1)
		return 'N';
	//继续游戏
	return 'C';
}

这就是我的第一篇博客啦,有什么不完善的地方请大家多多包涵,也希望能给出建议,我会努力改正的。

最后于诸君共勉!

标签:新人,三子,C语言,int,col,board,printf,COL,ROW
From: https://blog.csdn.net/2402_88147816/article/details/143672262

相关文章

  • 关于我,穿越异世界,凭c语言搅动风云vlog----利用数组进行大数相关计算
    关于我,穿越异世界,凭c语言搅动风云vlog----利用数组进行大数相关计算一.有关大数你应该要知道的那些事1.大数的概念我们一般将计算机基本数据类型无法存储的数称之为大数,本文涉及的大数均为整数,不包含小数。而且下文代码实现中的数组大小可根据需要修改。2.问题引入在c......
  • 重温c语言之,7天开整,就是随便的写写,第九天
    这次照着网站上的内容,写了一个简单的小游戏,3字棋,其实也可以n字棋附上代码,这里是:game.h1#pragmaonce2#include<stdio.h>3#include<stdlib.h>4#include<time.h>56//游戏代码的声明(函数声明,符号定义)78#defineRow39#defineCol31011//初始化棋......
  • C语言PBC库(持续更新)
    PBC前言我的环境是Ubantu24边写边整理,持续更新。最近做毕设需要用到,就借此机会写一些关于c语言PBC库的教程,一些用法有结合GPT。说是教程不过是把官方文档说的函数用法翻译了一遍,关于双线性配对的知识我不了解,这里就不将了,我看网上大部分说的有就只是当黑盒调用就行了。官方......
  • 用c语言写一个简易版的扫雷游戏
    1、扫雷游戏的功能说明1.1:基本功能     1、使用控制台实现经典的扫雷游戏     2、游戏可以通过菜单实现继续玩或者退出游戏     3、扫雷游戏的棋盘是9*9的格子     4、随机布置10个雷     5、可以排查雷      ......
  • 蓝桥杯真题——good-sequence(C语言)
     问题描述一个序列 [b1,b2,...,bm]若对于 2≤i≤m满足 bi≤b1,则称为好序列。现在给定 [a1,a2,...,an],求对于该序列的每一个后缀 [ak,ak+1,...,an](1≤k≤n)最少能划分成多少个好序列。输入格式第一行包含一个整数 n ,表示数组 a 的长度。第二行包含 nn 个......
  • (4)---【位图填充】【C语言】【OpenGL库】【计算机图形学】
     本次实验项目     多边形位图填充图形功能简单介绍    本实验填充特定图案的图形“大裤衩子”。程序中定义了一个位图数组fly,这个数组被用来通过glPolygonStipple函数创建多边形的点模式填充效果。图形由两个绿色的多边形组成,代表“大裤衩”的左右两部分......
  • C语言字符串和十六进制的相互转换方式
    C语言字符串和十六进制的相互转换方式-我就叫宋帅呀-博客园C语言的字符串操作并不像java,Csharp那样提供直接的方法,简单粗暴。所以,在转换的时候往往费力费时,近日做项目正好用到和java程序通讯,java发送过来的数据是十六进制数字组成的字符串,解析的时候颇费心思才算完成,所以......
  • (5)---【DDA画线算法】C语言-OpenGL库-计算机图形学
    本次实验项目         DDA画线算法理解与运用。算法介绍        DDA(DigitalDifferentialAnalyzer)画线算法是一种基于数值微分原理的直线生成算法。它主要用于在光栅系统中绘制直线,即在像素点阵中生成直线。DDA算法的核心思想是从一个端点开始,通过增量,逐......
  • 实验4 C语言数组应用编程
    实验任务1:task1.c源代码:1#include<stdio.h>2#defineN43#defineM245voidtest1(){6intx[N]={1,9,8,4};7inti;89printf("sizeof(x)=%d\n",sizeof(x));1011for(i=0;i<N;++i)......
  • 【C语言】解决error C4996: 'fopen': This function or variable may be unsafe. Cons
    几天编译文件的时候报错,编译出错信息:错误1errorC4996:'fopen':Thisfunctionorvariablemaybeunsafe.Considerusingfopen_sinstead.Todisabledeprecation,use_CRT_SECURE_NO_WARNINGS.Seeonlinehelpfordetails.意思就是fopen不安全,推荐你用fopen_s,这个时......