自学c语言一段时间了,今天跟着视频博主学习了第一个c语言小游戏,虽然思路是跟着博主来的,但是有一些地方自己做了点改动,加上电脑只能随机产生值,所以可能游戏并不是那么智能,后期还需要改善,如果有更好的意见,麻烦评论一下
游戏思路:不像往常的创建单一文件,我们创建三个文件,分别是三子棋游戏.c(游戏主体的运行),三子棋游戏.h(函数的声明,宏定义,数组的声明,电脑头文件的引用),三子棋游戏实现(游戏具体的实现函数);
三子棋游戏本质是对一个3x3的二维数组进行赋值,打印。具体思路实现:先定义一个二维数组【3】【3】;通过赋值一个空格,之后利用for语句,嵌套打印二维数组,每打印一个数,我们在后面打印一个‘|’(每一列最后不需要打印),一列打印完之后我们打印 '---|',最后一列只需要打印 '---'(如果到了最后一行,不需要打印)具体代码实现:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define ROW 3
#define COL 3
void menu()
{
printf("********** 三子棋游戏 **********\n");
printf("********** 1.play **********\n");
printf("********** 0.exit **********\n");
printf("********************************\n");
}
void attm(char arr[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
arr[i][j] = ' ';
}
}
}
void print(char arr[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", arr[i][j]);
if (j != col - 1)
printf("|");
}
printf("\n");
if (i != row - 1)
{
for (j = 0; j < col; j++)
{
if (j != col - 1)
printf("---|");
else
printf("---");
}
printf("\n");
}
}
}
int main()
{
int input = 0;
do
{
menu();
printf("请输入>:");
scanf("%d", &input);
char arr[ROW][COL];
switch (input)
{
case 1:
attm(arr, ROW, COL);
print(arr, ROW, COL);
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("输入错误,请重新输入!!!\n\n");
break;
}
} while (input);
return 0;
}
打印好游戏的框架之后,接下来就是玩家和电脑的对弈,其实质就是对数组的赋值;将三子棋看作是3x3的坐标,玩家输入想下的坐标x和y(1~3),对数组【x】【y】赋上‘*’,代码操作如下:
void player_move(char arr[ROW][COL],int row,int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家走,请输入坐标");
scanf("%d %d", &x, &y);
if (0 < x && x<= row && 0 < y&& y<= col)
{
if (arr[x - 1][y - 1] == ' ')
{
arr[x - 1][y - 1] = '*';
print(arr, ROW, COL);
break;
}
else
{
printf("已经输入,请重新输入!\n");
}
}
else
{
printf("输入有错误,请重新输入!\n");
}
}
}
同理电脑也是对数组进行赋值,这里因为要产生随机数,所以我们先使用srand函数,srand((unsigned int)time(NULL)),之后将rand()函数随机产生的值%3赋给x,y;这样就可以让电脑随机下子了,但是由于是随机的,所以不会考虑最佳下子方案,这里需要优化,知道的家人们麻烦告知一下思路,这样电脑下子函数代码如下:
void computer_move(char arr[ROW][COL], int row, int col)
{
printf("电脑走\n");
while (1)
{
int x = rand() % 3;
int y = rand() % 3;
if (arr[x][y] == ' ')
{
arr[x][y] = '#';
print(arr, ROW, COL);
break;
}
}
}
最后一步其实就是判断玩家或者电脑每下一步的的情况,一共四种:玩家赢,电脑赢,平局,游戏继续,对于玩家赢或者电脑赢,其实就三行三列两条对角线值是一样的,此时返回该值,平局就是遍历整个数组,如果有空格,游戏继续,返回c,否则返回q;代码操作如下:
char is_win(char arr[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i<row; i++)
{
if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][1] != ' ')
{
return arr[i][0];
}
if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[1][i] != ' ')
{
return arr[1][i];
}
}
if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')
{
return arr[1][1];
}
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ')
{
return arr[1][1];
}
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
if (arr[i][j] == ' ')
{
return 'c';
}
}
}
return 'q';
}
之后用条件语句判断函数is_win返回的值结束游戏既可;
游戏刚开始自己接触的时候觉得很难,无从下手,但是跟着博主的思路学习一遍之后,发现豁然开朗,其实并不那么难,基本就是学过的函数和数组的应用,但是对如何将电脑的下子智能化还得需要思考一下。
三子棋游戏.c代码如下:
#include "三子棋游戏.h"
void menu()
{
printf("********** 三子棋游戏 **********\n");
printf("********** 1.play **********\n");
printf("********** 0.exit **********\n");
printf("********************************\n");
}
void game(char arr[ROW][COL],int row,int col)
{
attm(arr,ROW,COL);
print(arr,ROW,COL);
char pan;
while (1)
{
player_move(arr, ROW, COL);
pan=is_win(arr, ROW, COL);
if (pan == '*')
{
printf("恭喜你,你赢了\n");
break;
}
if (pan == 'q')
{
printf("平局!\n");
break;
}
computer_move(arr, ROW, COL);
pan = is_win(arr, ROW, COL);
if (pan == '#')
{
printf("电脑赢了,你输了\n");
break;
}
if (pan == 'q')
{
printf("平局\n");
break;
}
}
}
int main()
{
srand((unsigned int) time(NULL));
int input=0;
do
{
menu();
printf("请输入>:");
scanf("%d", &input);
switch (input)
{
case 1:
game(arr,ROW,COL);
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("输入错误,请重新输入!!!\n\n");
break;
}
} while(input);
return 0;
}
三子棋游戏.h头文件代码如下:
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
char arr[ROW][COL];
void attm(char arr[ROW][COL], int row ,int col);
void print(char arr[ROW][COL], int row, int col);
void player_move(char arr[ROW][COL], int row, int col);
void computer_move(char arr[ROW][COL],int row,int col);
char is_win(char arr[ROW][COL],int row,int col);
三子棋游戏实现.c头文件代码如下:
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
char arr[ROW][COL];
void attm(char arr[ROW][COL], int row ,int col);
void print(char arr[ROW][COL], int row, int col);
void player_move(char arr[ROW][COL], int row, int col);
void computer_move(char arr[ROW][COL],int row,int col);
char is_win(char arr[ROW][COL],int row,int col);