“你处理情绪的速度,就是你迈向成功的速度。”
C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。之前在之后上看过一段话“C语言水平决定你C++水平的上限”。
今天第一次分享,争取每天敲代码,分享在这里。
相比于C语言书上,利用C语言解决数学问题的例子太多了,真正让人们感兴趣的,我想就是设计一些有意思的程序。这里提供一个“井字棋”小程序。可以作为在进入学习指针部分之前的一个综合应用。
井字棋的规则可自行百度哈!
主程序:
#include"game.h"
int main()
{
void menu();
void game();
int input;
do
{
menu();
printf("请选择:\t");
scanf("%d", &input);
switch (input)
{
case 1:
printf("欢迎来到三子棋游戏\n");
game();
break;
case 0:
printf("退出!");
break;
default:
printf("输入有误,请重新输入!");
break;/*break结束switch*/
}
} while (input);
return 0;
}
void menu()
{
printf("************************\n");
printf("******1.Play Games******\n");
printf("******0.Exit************\n");
printf("************************\n");
}
void game()
{
srand((unsigned)time(NULL)); //产生一个种子,需要调用两个库函数time.h和stdlib.h
char board [ROW][COL];
//二维数组的初始化问题
InitBoard(board, ROW, COL);
//二维数组棋盘的实现
DisplayBoard(board, ROW, COL);
char ret=0;
//玩家先手下棋
do
{
PlayerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret=IsWin(board, ROW, COL);
//如果玩家赢,ret为*;如果电脑赢,ret为#;如果平局,ret为Q;都一定要跳出循环!
if (ret != 'C')
break;
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret=IsWin(board, ROW, COL);
if (ret != 'C')
break;
} while(1);
//判断因为什么跳出了循环?是玩家赢?是平局?还是电脑赢?
switch (ret)
{
case '*':
printf("玩家赢!\n");
break;
case '#':
printf("电脑赢!\n");
break;
default:
printf("平局!\n");
break;
}
DisplayBoard(board, ROW, COL);
}
接下来把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);
char IsWin(char board[ROW][COL], int row, int col);
真正的游戏程序运行段:
#include"game.h"
void InitBoard(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
board[i][j] = ' ';
}
void DisplayBoard(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf(" %c ",board[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
if (i < row - 1)
{
for (int j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}
void PlayerMove(char board[ROW][COL], int row,int col)
{
int x, y;
do
{
printf("玩家走,请输入坐标:\n");
scanf("%d %d", &x, &y);
if (x < row+1 && y < col+1 && x>0 && y>0)
{
if(board[x - 1][y - 1] != ' ')
printf("该处已被占用,请重新输入!\n");
else
{
board[x - 1][y - 1] = '*';
break;
}
}
else
printf("输入有误!请重新输入!\n");
} while (1);
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑下!\n");
while (1)
{
int x = rand()%row;
int y = rand()%col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
else
continue;
}
}
//判断平局和继续,是IsWin的调用函数
char IsDraw(char board[ROW][COL], int row, int col)
{
for(int i=0;i<row;i++)
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 'C';
}
return 'Q';
}
//判断输赢
char IsWin(char board[ROW][COL], int row, int col)
{
for (int 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 (int 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];
}
char ret=IsDraw(board, row, col);
return ret;
}
不过,这个程序只能是电脑玩家【简单版】,因为电脑下棋的逻辑完全的随机的,后续如果有时间,会在推出一个电脑玩家【进阶版】。
互相讨论,共同进步!