實作步驟
- 第1步---列印一個選單提示選擇是否進入游戲
- 第2步---創建棋盤
- 第3步---初始化棋盤
- 第4步---列印棋盤
- 第5步---下棋,并判斷輸贏
- 第6步---將上述函式做成專案
- 完整代碼
第1步—列印一個選單提示選擇是否進入游戲
void menu()
{
printf("***********************\n");
printf("*** 1.play 0.exit ***\n");
printf("***********************\n");
}

下面部分可不需要,按個人需求選擇
進入游戲則提示游戲開始,并在0.5秒后清空螢屏
void playgame()
{
printf("游戲開始!\n");
Sleep(500);//待機0.5秒鐘
system("cls");//清空螢屏
}
演示效果就沒有等0.5秒讓螢屏清空

第2步—創建棋盤
創建一個3*3的二維陣列作為棋盤,這里之所以能用ROW和COL是因為使用了#define定義了ROW和COL為3,后面會貼出具體代碼,先繼續往下看
放入0使棋盤(陣列不完全初始化)全為0(本人習慣賦初值為0)
不知道陣列不完全初始化的小伙伴可以百度了解一下
char board[ROW][COL] = { 0 };
第3步—初始化棋盤
創建好棋盤之后可以先不初始化,而是先列印看一下是否全為0,檢查棋盤是否創建好了
然后初始化為1再次列印看一下初始化函式是否寫錯
void voidchequerboard(char board[ROW][COL]) {
int i = 0, j = 0;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
board[i][j] = ' ';//初始化的內容
}
}
}
第4步—列印棋盤
加入邊框,在邊框中輸出資料,更加形象
如果需要實作的更好可以自行參考easyx庫實作
void printchequerboard(char board[ROW][COL]) {
int i = 0, j = 0;
for (i = 0; i < ROW; i++) {
if (i == 0) {
for (int k = 0; k < ROW; k++) {
printf(" ---");
}
printf("\n");
}
for (j = 0; j < COL; j++) {
if (j == 0) {
printf("|");
}
printf(" %c ", board[i][j]);
printf("|");
}
if (j == COL) {
printf("\n");
for (j = 0; j < ROW; j++) {
printf(" ---");
}
if (1) {
printf("\n");
}
}
}
}
演示效果中可以看到有一個3*3的棋盤
下面的提示則是我們接下來要完成的功能

第5步—下棋,并判斷輸贏
下棋
玩家下則提示玩家輸入坐標,并檢查坐標是否合法
電腦則是隨機下棋,并未封裝演算法函式,感興趣的小伙伴可以自己實作一下
void playboard(char board[ROW][COL]) {
int x = 0, y = 0;
while (1) {
printf("玩家走>:\n");
printf("請輸入坐標>:\n");
scanf("%1d%1d", &x, &y);//考慮使用%1d格式化輸入
if (board[x-1][y-1] == ' ' && x <= ROW && y <= COL&& x> 0 && y > 0) {
board[x-1][y-1] = '*';
break;
}
else {
printf("坐標非法或已被占用,請重新輸入!\n");
}
}
char ret = Iswin(board);
//Sleep(500);
system("cls");
printchequerboard(board);
if (ret == 'C') {
printf("電腦走>:\n");
while (1) {
x = rand() % ROW;
y = rand() % COL;
if (board[x][y] == ' ') {
board[x][y] = '#';
break;
}
}
Sleep(500);
system("cls");
printchequerboard(board);
ret = Iswin(board);
}
if (ret == 'C') {
playboard(board);
}
else if (ret == '*') {
printf("玩家贏\n");
}
else if (ret == '#') {
printf("電腦贏\n");
}
else {
printf("平局\n");
}
}
判斷輸贏,將所有勝的情況都判斷一下,并回傳贏家的棋子符號
*表示玩家,#表示電腦,
若是沒有出現贏家則判斷棋盤是否滿了,若沒滿則回傳C表示繼續,若滿了則回傳D表示平局
當然了,具體回傳什么符號和用什么符號表示贏家,平局,繼續由自己決定,我建議選擇有意義的字母比如我表示繼續的C就是continue的首字母
char Iswin(char board[ROW][COL]) {
int i = 0;
int j = 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 (j = 0; j < COL; j++) {
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
return board[1][j];
}
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];
}
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
if (board[i][j] == ' ')
return 'C';
}
}
return 'D';
}
演示效果

第6步—將上述函式做成專案
這里有兩種選擇一種是全部做成一個源檔案
另一種是將函式的宣告,定義,測驗分開形成3個源檔案
首先第一種就沒必要多說了,直接做成源檔案即可,唯一需要注意的就是,如果沒有提前宣告函式,就需要在呼叫前定義它即可,
我們來看看第另一種方式,多個源檔案方式

可以看到有兩個 .c檔案和一個 .h檔案 .h檔案表示頭檔案可以像庫函式一樣參考,所以我們將函式的定義和需要用到的庫函式頭檔案放到我們創建的頭檔案中,這樣可以減少庫函式的拷貝次數變相減少代碼行數(不明白的小伙伴可以百度一下庫函式呼叫的規則),然后在源檔案中參考我們創建的頭檔案即可,我們將測驗放在了test源檔案中,而函式的定義則是放在了另一個源檔案中,這樣可以更好的,更直觀的從test檔案看到你的代碼功能,也方便除錯時的觀察那個函式模塊出了問題,下面貼出了完整代碼,
完整代碼
game.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
#define ROW 3
#define COL 3
//開始游戲
void playgame();
//列印選單
void menu();
//初始化棋盤
void voidchequerboard(char board[ROW][COL]);
//列印棋盤
void printchequerboard(char board[ROW][COL]);
//開始下棋
void playboard(char board[ROW][COL]);
//判斷輸贏 回傳*表示玩家贏,#表示電腦贏,回傳C表示繼續,回傳D表示平局
char Iswin(char board[ROW][COL]);
test.c
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void game()
{
char board[ROW][COL] = { 0 };//設定棋盤
playgame(); //提示游戲開始
voidchequerboard(board);//初始化棋盤
printchequerboard(board);//列印棋盤
playboard(board);//開始下棋
}
int main()
{
int n = 0;
srand((unsigned int) time(NULL));
while (1) {
menu();
scanf("%d", &n);
switch (n) {
case 1:game();
break;
case 0:printf("游戲結束!\n"); return 0;
default:printf("輸入錯誤,請重新輸入!\n"); break;
}
}
return 0;
}
game.c
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
char Iswin(char board[ROW][COL]) {
int i = 0;
int j = 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 (j = 0; j < COL; j++) {
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
return board[1][j];
}
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];
}
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
if (board[i][j] == ' ')
return 'C';
}
}
return 'D';
}
void printchequerboard(char board[ROW][COL]) {
int i = 0, j = 0;
for (i = 0; i < ROW; i++) {
if (i == 0) {
for (int k = 0; k < ROW; k++) {
printf(" ---");
}
printf("\n");
}
for (j = 0; j < COL; j++) {
if (j == 0) {
printf("|");
}
printf(" %c ", board[i][j]);
printf("|");
}
if (j == COL) {
printf("\n");
for (j = 0; j < ROW; j++) {
printf(" ---");
}
if (1) {
printf("\n");
}
}
}
}
void playboard(char board[ROW][COL]) {
int x = 0, y = 0;
while (1) {
printf("玩家走>:\n");
printf("請輸入坐標>:\n");
scanf("%1d%1d", &x, &y);//考慮使用%1d格式化輸入
if (board[x-1][y-1] == ' ' && x <= ROW && y <= COL&& x> 0 && y > 0) {
board[x-1][y-1] = '*';
break;
}
else {
printf("坐標非法或已被占用,請重新輸入!\n");
}
}
char ret = Iswin(board);
//Sleep(500);
system("cls");
printchequerboard(board);
if (ret == 'C') {
printf("電腦走>:\n");
while (1) {
x = rand() % ROW;
y = rand() % COL;
if (board[x][y] == ' ') {
board[x][y] = '#';
break;
}
}
Sleep(500);
system("cls");
printchequerboard(board);
ret = Iswin(board);
}
if (ret == 'C') {
playboard(board);
}
else if (ret == '*') {
printf("玩家贏\n");
}
else if (ret == '#') {
printf("電腦贏\n");
}
else {
printf("平局\n");
}
}
void voidchequerboard(char board[ROW][COL]) {
int i = 0, j = 0;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
board[i][j] = ' ';
}
}
}
void menu()
{
printf("***********************\n");
printf("*** 1.play 0.exit ***\n");
printf("***********************\n");
}
void playgame()
{
printf("游戲開始!\n");
Sleep(500);//待機0.5秒鐘
system("cls");//清空螢屏
}
由于這是本人的第一篇博客難免有疏漏或說錯的地方,如有發現歡迎留言指正,或私信本人,
本篇博客就到此結束了,希望對小伙伴能有所幫助,
咱們下篇博客見,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/265843.html
標籤:AI
上一篇:馬化騰曾遭多年“威脅”:飽受煙害十年的“大兵”,終于戒煙了
下一篇:“5G 太耗電,關掉它!”
